mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
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:
@@ -11,9 +11,9 @@
|
||||
};
|
||||
|
||||
&ramdisk_r {
|
||||
reg = <0x48c40000 (20 * 0x00100000)>;
|
||||
reg = <0x48c40000 (30 * 0x00100000)>;
|
||||
};
|
||||
|
||||
&ramdisk_c {
|
||||
reg = <0x4a040000 (10 * 0x00100000)>;
|
||||
reg = <0x4aa40000 (20 * 0x00100000)>;
|
||||
};
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
@@ -451,6 +451,8 @@
|
||||
&rockchip_suspend {
|
||||
status = "okay";
|
||||
|
||||
rockchip,sleep-debug-en = <1>;
|
||||
|
||||
rockchip,sleep-pin-config = <
|
||||
(0
|
||||
)
|
||||
|
||||
@@ -443,6 +443,8 @@
|
||||
&rockchip_suspend {
|
||||
status = "okay";
|
||||
|
||||
rockchip,sleep-debug-en = <1>;
|
||||
|
||||
rockchip,sleep-mode-config = <
|
||||
(0
|
||||
| RKPM_SLP_ARMOFF_LOGOFF
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user