Merge commit 'a8d46129a9e02808f6f6e7c9496b67e238ef40a0'

* commit 'a8d46129a9e02808f6f6e7c9496b67e238ef40a0':
  arm64: dts: rockchip: rv1126b-thunder-boot: fix rkisp_thunderboot base address error
  video: rockchip: rga3: fix RGA3 RB is inverse when output FBC RGBA8888
  video: rockchip: rga3: RGA3 support XRGB/XBGR8888/ARGB8888(AFBC)/ABGR8888(AFBC)
  video: rockchip: rga3: remove win0 FBC limit on RGA3
  MALI: bifrost: Fix kctx kobj UAF
  mfd: display-serdes: Add serdes debug node
  arm64: dts: rockchip: rv1126b-evb3/4-v10: enable sleep-debug
  ARM: dts: rockchip: rv1126b-evb2-v10-tb-400w: Enlarge ramdisk size for some algorithm files
  arm64: dts: rockchip: rv1126b-evb2-v10-tb-400w: Add rndis support
  arm64: dts: rockchip: rv1126b-evb2-v10-tb-400w: Adjust rkisp_thunderboot address to 0x41320000
  arm64: dts: rockchip: rv1126b-thunder-boot: Enlarge meta memory size to 0xe0000

Change-Id: I59032267c1be0f488e7a3d9776be10c7d51b5ba3
This commit is contained in:
Tao Huang
2025-06-20 09:29:25 +08:00
12 changed files with 306 additions and 49 deletions

View File

@@ -11,9 +11,9 @@
};
&ramdisk_r {
reg = <0x48c40000 (20 * 0x00100000)>;
reg = <0x48c40000 (30 * 0x00100000)>;
};
&ramdisk_c {
reg = <0x4a040000 (10 * 0x00100000)>;
reg = <0x4aa40000 (20 * 0x00100000)>;
};

View File

@@ -63,5 +63,21 @@
* vicap, capture raw10, ceil(w*10/8/256)*256*h *4(buf num)
* e.g. 2688x1520: 0x14c8000
*/
reg = <0x41300000 0x14c8000>;
reg = <0x41320000 0x14c8000>;
};
&usb2phy {
status = "okay";
};
&usb2phy_otg {
status = "okay";
};
&usb3phy {
status = "okay";
};
&usb_drd_dwc3 {
status = "okay";
};

View File

@@ -451,6 +451,8 @@
&rockchip_suspend {
status = "okay";
rockchip,sleep-debug-en = <1>;
rockchip,sleep-pin-config = <
(0
)

View File

@@ -443,6 +443,8 @@
&rockchip_suspend {
status = "okay";
rockchip,sleep-debug-en = <1>;
rockchip,sleep-mode-config = <
(0
| RKPM_SLP_ARMOFF_LOGOFF

View File

@@ -93,16 +93,16 @@
meta: meta@41240000 {
/* reg's offset MUST match with RTOS */
reg = <0x41240000 0x000c0000>;
reg = <0x41240000 0x000e0000>;
};
rkisp_thunderboot: rkisp@41300000 {
rkisp_thunderboot: rkisp@41320000 {
/* reg's offset MUST match with RTOS */
/*
* vicap, capture raw10, ceil(w*10/8/256)*256*h *4(buf num)
* e.g. 1920x1080: 0xa8c000
*/
reg = <0x41300000 0xa8c000>;
reg = <0x41320000 0xa8c000>;
};
rkisp1_thunderboot: rkisp1_thunderboot {

View File

@@ -84,15 +84,14 @@ static ssize_t kbase_kctx_attr_show(struct kobject *kobj, struct attribute *attr
static ssize_t kbase_total_gpu_mem_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
struct kbase_context *kctx = container_of(kobj, struct kbase_context, kobj);
struct kbase_process *kprcs = container_of(kobj, struct kbase_process, kobj);
return scnprintf(buf, PAGE_SIZE, "%zu\n", kctx->kprcs->total_gpu_pages << PAGE_SHIFT);
return scnprintf(buf, PAGE_SIZE, "%zu\n", kprcs->total_gpu_pages << PAGE_SHIFT);
}
static ssize_t kbase_private_gpu_mem_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
struct kbase_context *kctx = container_of(kobj, struct kbase_context, kobj);
struct kbase_process *kprcs = kctx->kprcs;
struct kbase_process *kprcs = container_of(kobj, struct kbase_process, kobj);
struct kbase_context *tmp_kctx;
size_t total_pages = 0;
@@ -183,10 +182,10 @@ static int kbase_insert_kctx_to_process(struct kbase_context *kctx)
if (unlikely(!scnprintf(kctx_name, 64, "%d", tgid)))
return -ENOMEM;
ret = kobject_init_and_add(&kctx->kobj, &kbase_kctx_ktype, kctx->kbdev->kprcs_kobj, kctx_name);
ret = kobject_init_and_add(&kprcs->kobj, &kbase_kctx_ktype, kctx->kbdev->kprcs_kobj, kctx_name);
if (ret) {
dev_err(kctx->kbdev->dev, "Failed to create kctx kobject");
kobject_put(&kctx->kobj);
kobject_put(&kprcs->kobj);
}
while (*new) {
@@ -340,7 +339,7 @@ static void kbase_remove_kctx_from_process(struct kbase_context *kctx)
* we can remove it from the process rb_tree.
*/
if (list_empty(&kprcs->kctx_list)) {
kobject_put(&kctx->kobj);
kobject_put(&kprcs->kobj);
rb_erase(&kprcs->kprcs_node, &kctx->kbdev->process_root);
/* Add checks, so that the terminating process Should not
* hold any gpu_memory.

View File

@@ -688,6 +688,7 @@ struct kbase_devfreq_queue_info {
/**
* struct kbase_process - Representing an object of a kbase process instantiated
* when the first kbase context is created under it.
* @kobj: Kernel object for sysfs representation of the process.
* @tgid: Thread group ID.
* @total_gpu_pages: Total gpu pages allocated across all the contexts
* of this process, it accounts for both native allocations
@@ -703,6 +704,7 @@ struct kbase_devfreq_queue_info {
* imported multiple times for the process.
*/
struct kbase_process {
struct kobject kobj;
pid_t tgid;
size_t total_gpu_pages;
struct list_head kctx_list;
@@ -1902,7 +1904,6 @@ struct kbase_sub_alloc {
* is made on the device file.
*/
struct kbase_context {
struct kobject kobj;
struct file *filp;
struct kbase_device *kbdev;
struct list_head kctx_list_link;

View File

@@ -78,36 +78,42 @@
#include "../../../../drivers/extcon/extcon.h"
#include "../../../../drivers/base/regmap/internal.h"
/*
* if enable all the debug information,
* there will be much log.
*
* so suggest set CONFIG_LOG_BUF_SHIFT to 18
*/
//#define SERDES_DEBUG_MFD
//#define SERDES_DEBUG_I2C
//#define SERDES_DEBUG_CHIP
/**
* Enabling verbose debug messages is done through the serdes_log_level parameter, each
* category being enabled by a bit:
*
* - serdes_log_level=0x1 will enable MFD messages
* - serdes_log_level=0x2 will enable I2C messages
* - serdes_log_level=0x4 will enable CHIP messages
* - serdes_log_level=0x7 will enable all messages
*
* An interesting feature is that it's possible to enable verbose logging at
* run-time by echoing the debug value in its sysfs node::
*
* # echo 0x7 > /sys/kernel/debug/log_level
**/
#ifdef SERDES_DEBUG_MFD
#define SERDES_DBG_MFD(x...) pr_info(x)
#else
#define SERDES_DBG_MFD(x...) no_printk(x)
#endif
enum serdes_log_category {
SERDES_MFD,
SERDES_I2C,
SERDES_CHIP,
};
#ifdef SERDES_DEBUG_I2C
#define SERDES_DBG_I2C(x...) pr_info(x)
#else
#define SERDES_DBG_I2C(x...) no_printk(x)
#endif
#define SERDES_DBG_MFD(fmt, ...) serdes_dev_dbg(SERDES_MFD, fmt, ##__VA_ARGS__)
#define SERDES_DBG_I2C(fmt, ...) serdes_dev_dbg(SERDES_I2C, fmt, ##__VA_ARGS__)
#define SERDES_DBG_CHIP(fmt, ...) serdes_dev_dbg(SERDES_CHIP, fmt, ##__VA_ARGS__)
#ifdef SERDES_DEBUG_CHIP
#define SERDES_DBG_CHIP(x...) pr_info(x)
#else
#define SERDES_DBG_CHIP(x...) no_printk(x)
#endif
enum serdes_debug_mode {
SERDES_OPEN_I2C_WRITE,
SERDES_CLOSE_I2C_WRITE,
SERDES_SET_SEQUENCE,
SERDES_SET_PINCTRL_SLEEP,
SERDES_SET_PINCTRL_DEFAULT,
};
#define MFD_SERDES_DISPLAY_VERSION "serdes-mfd-displaly-v11-241025"
#define MAX_NUM_SERDES_SPLIT 8
struct serdes;
enum ser_link_mode {
SER_DUAL_LINK,
@@ -387,8 +393,12 @@ struct serdes {
struct workqueue_struct *mfd_wq;
struct delayed_work mfd_delay_work;
bool route_enable;
bool use_delay_work;
char dir_name[25];
struct dentry *debugfs_dentry;
enum serdes_debug_mode debug;
struct kthread_worker *kworker;
struct kthread_delayed_work reg_check_work;
@@ -420,8 +430,6 @@ struct serdes {
/* Device I/O API */
int serdes_reg_read(struct serdes *serdes, unsigned int reg, unsigned int *val);
int serdes_reg_write(struct serdes *serdes, unsigned int reg, unsigned int val);
void serdes_reg_lock(struct serdes *serdes);
int serdes_reg_unlock(struct serdes *serdes);
int serdes_set_bits(struct serdes *serdes, unsigned int reg,
unsigned int mask, unsigned int val);
int serdes_bulk_read(struct serdes *serdes, unsigned int reg,
@@ -441,7 +449,12 @@ void serdes_device_poweroff(struct serdes *serdes);
int serdes_device_shutdown(struct serdes *serdes);
int serdes_irq_init(struct serdes *serdes);
void serdes_irq_exit(struct serdes *serdes);
void serdes_auxadc_init(struct serdes *serdes);
void serdes_dev_dbg(enum serdes_log_category category, const char *format, ...);
void serdes_debugfs_init(void);
void serdes_debugfs_exit(void);
void serdes_create_debugfs(struct serdes *serdes);
void serdes_destroy_debugfs(struct serdes *serdes);
extern struct serdes_chip_data serdes_bu18tl82_data;
extern struct serdes_chip_data serdes_bu18rl82_data;

View File

@@ -9,6 +9,9 @@
#include "core.h"
static unsigned long serdes_log_level;
static struct dentry *serdes_debugfs_root;
static const struct mfd_cell serdes_bu18tl82_devs[] = {
{
.name = "serdes-pinctrl",
@@ -175,6 +178,9 @@ int serdes_bulk_write(struct serdes *serdes, unsigned int reg,
u16 *buf = src;
int i, ret;
if (serdes->debug == SERDES_CLOSE_I2C_WRITE)
return 0;
WARN_ON(count <= 0);
mutex_lock(&serdes->io_lock);
@@ -205,6 +211,9 @@ int serdes_multi_reg_write(struct serdes *serdes, const struct reg_sequence *reg
{
int i, ret;
if (serdes->debug == SERDES_CLOSE_I2C_WRITE)
return 0;
SERDES_DBG_I2C("%s %s %s num=%d\n", __func__, dev_name(serdes->dev),
serdes->chip_data->name, num_regs);
ret = regmap_multi_reg_write(serdes->regmap, regs, num_regs);
@@ -229,6 +238,9 @@ int serdes_reg_write(struct serdes *serdes, unsigned int reg,
{
int ret;
if (serdes->debug == SERDES_CLOSE_I2C_WRITE)
return 0;
ret = regmap_write(serdes->regmap, reg, val);
SERDES_DBG_I2C("%s %s %s Write Reg%04x %04x ret=%d\n", __func__, dev_name(serdes->dev),
serdes->chip_data->name, reg, val, ret);
@@ -252,6 +264,9 @@ int serdes_set_bits(struct serdes *serdes, unsigned int reg,
{
int ret;
if (serdes->debug == SERDES_CLOSE_I2C_WRITE)
return 0;
SERDES_DBG_I2C("%s %s %s Write Reg%04x %04x) mask=%04x\n", __func__,
dev_name(serdes->dev), serdes->chip_data->name, reg, val, mask);
ret = regmap_update_bits(serdes->regmap, reg, mask, val);
@@ -390,6 +405,162 @@ int serdes_device_init(struct serdes *serdes)
}
EXPORT_SYMBOL_GPL(serdes_device_init);
static int log_level_show(struct seq_file *m, void *data)
{
seq_printf(m, "%lu\n", serdes_log_level);
return 0;
}
static int log_level_open(struct inode *inode, struct file *file)
{
return single_open(file, log_level_show, NULL);
}
static ssize_t log_level_write(struct file *file, const char __user *ubuf,
size_t len, loff_t *offp)
{
char buf[12];
unsigned long value;
if (len > sizeof(buf) - 1)
return -EINVAL;
if (copy_from_user(buf, ubuf, len))
return -EFAULT;
buf[len] = '\0';
if (kstrtoul(buf, 0, &value))
return -EINVAL;
serdes_log_level = value;
return len;
}
static int debug_show(struct seq_file *m, void *data)
{
struct serdes *serdes = m->private;
seq_printf(m, "%d\n", serdes->debug);
return 0;
}
static int debug_open(struct inode *inode, struct file *file)
{
struct serdes *serdes = inode->i_private;
return single_open(file, debug_show, serdes);
}
static ssize_t debug_write(struct file *file, const char __user *ubuf,
size_t len, loff_t *offp)
{
struct seq_file *m = file->private_data;
struct serdes *serdes = m->private;
char buf[12];
if (!serdes)
return -EINVAL;
if (len > sizeof(buf) - 1)
return -EINVAL;
if (copy_from_user(buf, ubuf, len))
return -EFAULT;
buf[len] = '\0';
if (sysfs_streq(buf, "on"))
serdes->debug = SERDES_OPEN_I2C_WRITE;
else if (sysfs_streq(buf, "off"))
serdes->debug = SERDES_CLOSE_I2C_WRITE;
else if (sysfs_streq(buf, "default")) {
serdes->debug = SERDES_SET_PINCTRL_DEFAULT;
serdes_set_pinctrl_default(serdes);
} else if (sysfs_streq(buf, "sleep")) {
serdes->debug = SERDES_SET_PINCTRL_SLEEP;
serdes_set_pinctrl_sleep(serdes);
} else if (sysfs_streq(buf, "seq")) {
serdes->debug = SERDES_SET_SEQUENCE;
serdes_i2c_set_sequence(serdes);
} else
return -EINVAL;
return len;
}
static const struct file_operations log_level_fops = {
.owner = THIS_MODULE,
.open = log_level_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
.write = log_level_write
};
static const struct file_operations debug_fops = {
.owner = THIS_MODULE,
.open = debug_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
.write = debug_write
};
void serdes_create_debugfs(struct serdes *serdes)
{
snprintf(serdes->dir_name, sizeof(serdes->dir_name), "%s-%s",
dev_name(serdes->dev), serdes->chip_data->name);
serdes->debugfs_dentry = debugfs_create_dir(serdes->dir_name, serdes_debugfs_root);
debugfs_create_file("debug", 0664, serdes->debugfs_dentry, serdes,
&debug_fops);
}
EXPORT_SYMBOL(serdes_create_debugfs);
void serdes_destroy_debugfs(struct serdes *serdes)
{
debugfs_remove_recursive(serdes->debugfs_dentry);
}
EXPORT_SYMBOL(serdes_destroy_debugfs);
void serdes_debugfs_init(void)
{
serdes_debugfs_root = debugfs_create_dir("serdes", NULL);
debugfs_create_file("log_level", 0664, serdes_debugfs_root, NULL,
&log_level_fops);
}
EXPORT_SYMBOL(serdes_debugfs_init);
void serdes_debugfs_exit(void)
{
debugfs_remove_recursive(serdes_debugfs_root);
}
EXPORT_SYMBOL(serdes_debugfs_exit);
void serdes_dev_dbg(enum serdes_log_category category, const char *format, ...)
{
struct va_format vaf;
va_list args;
if (!unlikely(serdes_log_level & BIT(category)))
return;
va_start(args, format);
vaf.fmt = format;
vaf.va = &args;
pr_info("%pV", &vaf);
va_end(args);
}
EXPORT_SYMBOL(serdes_dev_dbg);
int serdes_set_pinctrl_default(struct serdes *serdes)
{
int ret = 0;

View File

@@ -446,6 +446,8 @@ static int serdes_i2c_probe(struct i2c_client *client,
SERDES_DBG_MFD("%s: use_reg_check_work=%d\n", __func__, serdes->use_reg_check_work);
}
serdes_create_debugfs(serdes);
dev_info(dev, "serdes %s serdes_i2c_probe successful version %s\n",
serdes->chip_data->name, MFD_SERDES_DISPLAY_VERSION);
@@ -472,6 +474,8 @@ static void serdes_i2c_remove(struct i2c_client *client)
cancel_delayed_work_sync(&serdes->mfd_delay_work);
destroy_workqueue(serdes->mfd_wq);
}
serdes_destroy_debugfs(serdes);
}
static int serdes_i2c_prepare(struct device *dev)
@@ -584,12 +588,24 @@ static int __init serdes_i2c_init(void)
int ret;
ret = i2c_add_driver(&serdes_i2c_driver);
if (ret != 0)
if (ret != 0) {
pr_err("Failed to register serdes I2C driver: %d\n", ret);
return ret;
}
return ret;
serdes_debugfs_init();
return 0;
}
static void __exit serdes_i2c_exit(void)
{
i2c_del_driver(&serdes_i2c_driver);
serdes_debugfs_exit();
}
subsys_initcall(serdes_i2c_init);
module_exit(serdes_i2c_exit);
MODULE_AUTHOR("Luo Wei <lw@rock-chips.com>");
MODULE_DESCRIPTION("display i2c interface for different serdes");

View File

@@ -155,11 +155,13 @@ static void RGA3_set_reg_win0_info(u8 *base, struct rga3_req *msg)
win_interleaved = 2;
break;
case RGA_FORMAT_ARGB_8888:
case RGA_FORMAT_XRGB_8888:
win_format = 0x9;
pixel_width = 4;
win_interleaved = 2;
break;
case RGA_FORMAT_ABGR_8888:
case RGA_FORMAT_XBGR_8888:
win_format = 0x7;
pixel_width = 4;
win_interleaved = 2;
@@ -540,11 +542,13 @@ static void RGA3_set_reg_win1_info(u8 *base, struct rga3_req *msg)
win_interleaved = 2;
break;
case RGA_FORMAT_ARGB_8888:
case RGA_FORMAT_XRGB_8888:
win_format = 0x9;
pixel_width = 4;
win_interleaved = 2;
break;
case RGA_FORMAT_ABGR_8888:
case RGA_FORMAT_XBGR_8888:
win_format = 0x7;
pixel_width = 4;
win_interleaved = 2;
@@ -825,13 +829,24 @@ static void RGA3_set_reg_wr_info(u8 *base, struct rga3_req *msg)
wr_format = 0x6;
pixel_width = 4;
wr_interleaved = 2;
wr_pix_swp = 1;
/* fbc default RGBA8888, raster default BGRA8888 */
if (msg->wr.rd_mode == 1)
wr_pix_swp = 0;
else
wr_pix_swp = 1;
break;
case RGA_FORMAT_BGRA_8888:
case RGA_FORMAT_BGRX_8888:
wr_format = 0x6;
pixel_width = 4;
wr_interleaved = 2;
/* fbc default BGRA8888, raster default RGBA8888 */
if (msg->wr.rd_mode == 1)
wr_pix_swp = 1;
else
wr_pix_swp = 0;
break;
case RGA_FORMAT_RGB_888:
wr_format = 0x5;
@@ -1569,9 +1584,6 @@ static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req)
addr_copy(&req->win0, &req_rga->dst);
req->win0.format = req_rga->dst.format;
/* only win1 && wr support fbcd, win0 default raster */
req->win0.rd_mode = 0;
/* set win0 dst size */
req->win0.dst_act_w = req_rga->dst.act_w;
req->win0.dst_act_h = req_rga->dst.act_h;

View File

@@ -34,6 +34,8 @@ const uint32_t rga3_input_raster_format[] = {
RGA_FORMAT_YCrCb_422_SP_10B,
RGA_FORMAT_ARGB_8888,
RGA_FORMAT_ABGR_8888,
RGA_FORMAT_XRGB_8888,
RGA_FORMAT_XBGR_8888,
};
const uint32_t rga3_output_raster_format[] = {
@@ -60,6 +62,29 @@ const uint32_t rga3_output_raster_format[] = {
};
const uint32_t rga3_fbcd_format[] = {
RGA_FORMAT_RGBA_8888,
RGA_FORMAT_BGRA_8888,
RGA_FORMAT_RGBX_8888,
RGA_FORMAT_BGRX_8888,
RGA_FORMAT_ARGB_8888,
RGA_FORMAT_ABGR_8888,
RGA_FORMAT_XRGB_8888,
RGA_FORMAT_XBGR_8888,
RGA_FORMAT_RGB_888,
RGA_FORMAT_BGR_888,
RGA_FORMAT_RGB_565,
RGA_FORMAT_BGR_565,
RGA_FORMAT_YCbCr_422_SP,
RGA_FORMAT_YCbCr_420_SP,
RGA_FORMAT_YCrCb_422_SP,
RGA_FORMAT_YCrCb_420_SP,
RGA_FORMAT_YCbCr_420_SP_10B,
RGA_FORMAT_YCrCb_420_SP_10B,
RGA_FORMAT_YCbCr_422_SP_10B,
RGA_FORMAT_YCrCb_422_SP_10B,
};
const uint32_t rga3_fbce_format[] = {
RGA_FORMAT_RGBA_8888,
RGA_FORMAT_BGRA_8888,
RGA_FORMAT_RGBX_8888,
@@ -358,8 +383,8 @@ const struct rga_win_data rga3_win_data[] = {
.name = "rga3-wr",
.formats[RGA_RASTER_INDEX] = rga3_output_raster_format,
.formats_count[RGA_RASTER_INDEX] = ARRAY_SIZE(rga3_output_raster_format),
.formats[RGA_AFBC16x16_INDEX] = rga3_fbcd_format,
.formats_count[RGA_AFBC16x16_INDEX] = ARRAY_SIZE(rga3_fbcd_format),
.formats[RGA_AFBC16x16_INDEX] = rga3_fbce_format,
.formats_count[RGA_AFBC16x16_INDEX] = ARRAY_SIZE(rga3_fbce_format),
.formats[RGA_TILE8x8_INDEX] = rga3_tile_format,
.formats_count[RGA_TILE8x8_INDEX] = ARRAY_SIZE(rga3_tile_format),
.supported_rotations = 0,