#include <asm/io.h>\r
#include <linux/irq.h>\r
#include <linux/interrupt.h>\r
-#include <mach/io.h>\r
-#include <mach/irqs.h>\r
+//#include <mach/io.h>\r
+//#include <mach/irqs.h>\r
#include <linux/fs.h>\r
#include <asm/uaccess.h>\r
#include <linux/miscdevice.h>\r
#include <linux/fb.h>\r
#include <linux/wakelock.h>\r
\r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+#include <linux/rockchip_ion.h>\r
+#endif\r
+\r
+\r
#include "rga.h"\r
#include "rga_reg_info.h"\r
#include "rga_mmu_info.h"\r
#include "RGA_API.h"\r
\r
+#define RGA_TEST_CASE 0\r
+\r
#define RGA_TEST 0\r
#define RGA_TEST_TIME 0\r
#define RGA_TEST_FLUSH_TIME 0\r
\r
#define RGA_MAJOR 255\r
\r
-#if defined(CONFIG_ARCH_RK2928)\r
+#if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)\r
#define RK30_RGA_PHYS RK2928_RGA_PHYS\r
#define RK30_RGA_SIZE RK2928_RGA_SIZE\r
#endif\r
#define DRIVER_DESC "RGA Device Driver"\r
#define DRIVER_NAME "rga"\r
\r
-#define RGA_VERSION "1.001"\r
+#define RGA_VERSION "1.003"\r
\r
ktime_t rga_start;\r
ktime_t rga_end;\r
\r
-int rga_num = 0;\r
+rga_session rga_session_global;\r
\r
struct rga_drvdata {\r
struct miscdevice miscdev;\r
void (*rga_irq_callback)(int rga_retval); //callback function used by aync call\r
struct wake_lock wake_lock;\r
\r
+ struct clk *pd_rga;\r
struct clk *aclk_rga;\r
- struct clk *hclk_rga;\r
- struct clk *pd_rga;\r
+ struct clk *hclk_rga;\r
+\r
+ //#if defined(CONFIG_ION_ROCKCHIP)\r
+ struct ion_client * ion_client;\r
+ //#endif\r
};\r
\r
static struct rga_drvdata *drvdata;\r
rga_service_info rga_service;\r
\r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+extern struct ion_client *rockchip_ion_client_create(const char * name);\r
+#endif\r
+\r
static int rga_blit_async(rga_session *session, struct rga_req *req);\r
static void rga_del_running_list(void);\r
static void rga_del_running_list_timeout(void);\r
#define INFO(format, args...)\r
#endif\r
\r
+#if RGA_TEST\r
+static void print_info(struct rga_req *req)\r
+{\r
+ printk("src : yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x, format = %d\n",\r
+ req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr, req->src.format);\r
+ printk("src : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
+ req->src.act_w, req->src.act_h, req->src.vir_w, req->src.vir_h);\r
+ printk("src : x_off = %.8x y_off = %.8x\n", req->src.x_offset, req->src.y_offset);\r
+\r
+ printk("dst : yrgb_addr = %.8x, dst.uv_addr = %.8x, dst.v_addr = %.8x\n",\r
+ req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr);\r
+ printk("dst : x_off = %.8x y_off = %.8x\n", req->dst.x_offset, req->dst.y_offset);\r
+ printk("dst : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
+ req->dst.act_w, req->dst.act_h, req->dst.vir_w, req->dst.vir_h);\r
+\r
+ printk("clip.xmin = %d, clip.xmax = %d. clip.ymin = %d, clip.ymax = %d\n",\r
+ req->clip.xmin, req->clip.xmax, req->clip.ymin, req->clip.ymax);\r
+\r
+ //printk("alpha_rop_flag = %.8x\n", req->alpha_rop_flag);\r
+ //printk("alpha_rop_mode = %.8x\n", req->alpha_rop_mode);\r
+ //printk("PD_mode = %.8x\n", req->PD_mode);\r
+}\r
+#endif\r
+\r
\r
static inline void rga_write(u32 b, u32 r)\r
{\r
/* Dump waiting list info */\r
if (!list_empty(&rga_service.waiting))\r
{\r
+ list_head *next;\r
+\r
next = &rga_service.waiting;\r
\r
printk("rga_service dump waiting list\n");\r
{\r
printk("rga_service dump running list\n");\r
\r
+ list_head *next;\r
+\r
next = &rga_service.running;\r
do\r
{\r
if (rga_service.enable)\r
return;\r
\r
- clk_enable(drvdata->aclk_rga);\r
- clk_enable(drvdata->hclk_rga);\r
- clk_enable(drvdata->pd_rga);\r
+ clk_prepare_enable(drvdata->aclk_rga);\r
+ clk_prepare_enable(drvdata->hclk_rga);\r
+ //clk_prepare_enable(drvdata->pd_rga);\r
wake_lock(&drvdata->wake_lock);\r
rga_service.enable = true;\r
}\r
rga_dump();\r
}\r
\r
- clk_disable(drvdata->pd_rga);\r
- clk_disable(drvdata->aclk_rga);\r
- clk_disable(drvdata->hclk_rga);\r
+ //clk_disable_unprepare(drvdata->pd_rga);\r
+ clk_disable_unprepare(drvdata->aclk_rga);\r
+ clk_disable_unprepare(drvdata->hclk_rga);\r
wake_unlock(&drvdata->wake_lock);\r
rga_service.enable = false;\r
}\r
start = ktime_get();\r
#endif\r
\r
- ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
+ ret_timeout = wait_event_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
\r
if (unlikely(ret_timeout < 0)) {\r
- pr_err("flush pid %d wait task ret %d\n", session->pid, ret);\r
+ //pr_err("flush pid %d wait task ret %d\n", session->pid, ret);\r
mutex_lock(&rga_service.lock);\r
rga_del_running_list();\r
mutex_unlock(&rga_service.lock);\r
- ret = -ETIMEDOUT;\r
+ ret = ret_timeout;\r
} else if (0 == ret_timeout) {\r
- pr_err("flush pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
- printk("bus = %.8x\n", rga_read(RGA_INT));\r
+ //pr_err("flush pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
+ //printk("bus = %.8x\n", rga_read(RGA_INT));\r
mutex_lock(&rga_service.lock);\r
rga_del_running_list_timeout();\r
rga_try_set_reg();\r
\r
if (unlikely(copy_to_user((void __user *)arg, &num_done, sizeof(int)))) {\r
printk("copy_to_user failed\n");\r
- ERR("copy_to_user failed\n");\r
ret = -EFAULT;\r
}\r
return ret;\r
{\r
if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191)))\r
{\r
- ERR("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
+ printk("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
return -EINVAL;\r
}\r
}\r
{\r
if (unlikely((req->src.vir_w <= 0) || (req->src.vir_w > 8191) || (req->src.vir_h <= 0) || (req->src.vir_h > 8191)))\r
{\r
- ERR("invalid source resolution vir_w = %d, vir_h = %d\n", req->src.vir_w, req->src.vir_h);\r
+ printk("invalid source resolution vir_w = %d, vir_h = %d\n", req->src.vir_w, req->src.vir_h);\r
return -EINVAL;\r
}\r
}\r
//check dst width and height\r
if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048)))\r
{\r
- ERR("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
+ printk("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
return -EINVAL;\r
}\r
\r
if (unlikely((req->dst.vir_w <= 0) || (req->dst.vir_w > 4096) || (req->dst.vir_h <= 0) || (req->dst.vir_h > 2048)))\r
{\r
- ERR("invalid destination resolution vir_w = %d, vir_h = %d\n", req->dst.vir_w, req->dst.vir_h);\r
+ printk("invalid destination resolution vir_w = %d, vir_h = %d\n", req->dst.vir_w, req->dst.vir_h);\r
return -EINVAL;\r
}\r
\r
//check src_vir_w\r
if(unlikely(req->src.vir_w < req->src.act_w)){\r
- ERR("invalid src_vir_w act_w = %d, vir_w = %d\n", req->src.act_w, req->src.vir_w);\r
+ printk("invalid src_vir_w act_w = %d, vir_w = %d\n", req->src.act_w, req->src.vir_w);\r
return -EINVAL;\r
}\r
\r
//check dst_vir_w\r
if(unlikely(req->dst.vir_w < req->dst.act_w)){\r
- ERR("invalid dst_vir_w act_h = %d, vir_h = %d\n", req->dst.act_w, req->dst.vir_w);\r
- return -EINVAL;\r
+ if(req->rotate_mode != 1)\r
+ {\r
+ printk("invalid dst_vir_w act_h = %d, vir_h = %d\n", req->dst.act_w, req->dst.vir_w);\r
+ return -EINVAL;\r
+ }\r
}\r
\r
return 0;\r
INIT_LIST_HEAD(®->session_link);\r
INIT_LIST_HEAD(®->status_link);\r
\r
- //memcpy(®->req, req, sizeof(struct rga_req));\r
-\r
reg->MMU_base = NULL;\r
\r
if (req->mmu_info.mmu_en)\r
rga_soft_reset();\r
#endif\r
\r
- rga_write(0x0, RGA_SYS_CTRL); \r
+ rga_write(0x0, RGA_SYS_CTRL);\r
rga_write(0, RGA_MMU_CTRL);\r
\r
/* CMD buff */\r
/* All CMD finish int */\r
rga_write(rga_read(RGA_INT)|(0x1<<10)|(0x1<<8), RGA_INT);\r
\r
+ #if RGA_TEST_TIME\r
+ rga_start = ktime_get();\r
+ #endif\r
+\r
/* Start proc */\r
atomic_set(®->session->done, 0);\r
rga_write(0x1, RGA_CMD_CTRL);\r
}\r
\r
\r
-#if RGA_TEST\r
-static void print_info(struct rga_req *req)\r
-{\r
- printk("src.yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x\n",\r
- req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr);\r
- printk("src : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
- req->src.act_w, req->src.act_h, req->src.vir_w, req->src.vir_h);\r
- printk("src : x_offset = %.8x y_offset = %.8x\n", req->src.x_offset, req->src.y_offset);\r
-\r
- printk("dst.yrgb_addr = %.8x, dst.uv_addr = %.8x, dst.v_addr = %.8x\n",\r
- req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr);\r
- printk("dst : x_offset = %.8x y_offset = %.8x\n", req->dst.x_offset, req->dst.y_offset);\r
- printk("dst : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
- req->dst.act_w, req->dst.act_h, req->dst.vir_w, req->dst.vir_h);\r
-\r
- printk("clip.xmin = %d, clip.xmax = %d. clip.ymin = %d, clip.ymax = %d\n",\r
- req->clip.xmin, req->clip.xmax, req->clip.ymin, req->clip.ymax);\r
\r
- printk("alpha_rop_flag = %.8x\n", req->alpha_rop_flag);\r
- printk("alpha_rop_mode = %.8x\n", req->alpha_rop_mode);\r
- printk("PD_mode = %.8x\n", req->PD_mode);\r
-}\r
-#endif\r
\r
/* Caller must hold rga_service.lock */\r
static void rga_del_running_list(void)\r
if(list_empty(®->session->waiting))\r
{\r
atomic_set(®->session->done, 1);\r
- wake_up_interruptible_sync(®->session->wait);\r
+ wake_up(®->session->wait);\r
}\r
\r
rga_reg_deinit(reg);\r
atomic_sub(1, ®->session->task_running);\r
atomic_sub(1, &rga_service.total_running);\r
\r
- printk("RGA soft reset for timeout process\n");\r
+ //printk("RGA soft reset for timeout process\n");\r
rga_soft_reset();\r
- \r
+\r
\r
#if 0\r
printk("RGA_INT is %.8x\n", rga_read(RGA_INT));\r
if(list_empty(®->session->waiting))\r
{\r
atomic_set(®->session->done, 1);\r
- wake_up_interruptible_sync(®->session->wait);\r
+ wake_up(®->session->wait);\r
}\r
\r
rga_reg_deinit(reg);\r
}\r
\r
\r
+static int rga_convert_dma_buf(struct rga_req *req)\r
+{\r
+ struct ion_handle *hdl;\r
+ ion_phys_addr_t phy_addr;\r
+ size_t len;\r
+\r
+ if(req->src.yrgb_addr) {\r
+ hdl = ion_import_dma_buf(drvdata->ion_client, req->src.yrgb_addr);\r
+ ion_phys(drvdata->ion_client, hdl, &phy_addr, &len);\r
+ req->src.yrgb_addr = phy_addr;\r
+ req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ }\r
+ else {\r
+ req->src.yrgb_addr = req->src.uv_addr;\r
+ req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ }\r
+\r
+ if(req->dst.yrgb_addr) {\r
+ hdl = ion_import_dma_buf(drvdata->ion_client, req->dst.yrgb_addr);\r
+ ion_phys(drvdata->ion_client, hdl, &phy_addr, &len);\r
+ req->dst.yrgb_addr = phy_addr;\r
+ req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+ }\r
+ else {\r
+ req->dst.yrgb_addr = req->dst.uv_addr;\r
+ req->dst.uv_addr = req->dst.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
static int rga_blit(rga_session *session, struct rga_req *req)\r
{\r
int ret = -1;\r
sah = req->src.act_h;\r
daw = req->dst.act_w;\r
dah = req->dst.act_h;\r
- \r
- do\r
- {\r
- if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah)))\r
- {\r
- /* generate 2 cmd for pre scale */ \r
+\r
+ if(rga_convert_dma_buf(req)) {\r
+ printk("RGA : DMA buf copy error\n");\r
+ return -EFAULT;\r
+ }\r
+\r
+ #if RGA_TEST\r
+ print_info(req);\r
+ #endif\r
+\r
+ do {\r
+ if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah))) {\r
+ /* generate 2 cmd for pre scale */\r
\r
ret = rga_check_param(req);\r
if(ret == -EINVAL) {\r
break;\r
}\r
num = 2;\r
- \r
+\r
}\r
- else\r
- {\r
+ else {\r
/* check value if legal */\r
ret = rga_check_param(req);\r
if(ret == -EINVAL) {\r
}\r
\r
if(req->render_mode == bitblt_mode)\r
- {\r
rga_mem_addr_sel(req);\r
- }\r
\r
reg = rga_reg_init(session, req);\r
if(reg == NULL) {\r
\r
#if RGA_TEST\r
printk("*** rga_blit_async proc ***\n");\r
- print_info(req);\r
#endif\r
\r
+ atomic_set(&session->done, 0);\r
ret = rga_blit(session, req);\r
-\r
return ret;\r
}\r
\r
\r
#if RGA_TEST\r
printk("*** rga_blit_sync proc ***\n");\r
- print_info(req);\r
- #endif\r
-\r
- #if RGA_TEST_TIME\r
- rga_start = ktime_get();\r
#endif\r
\r
+ atomic_set(&session->done, 0);\r
ret = rga_blit(session, req);\r
if(ret < 0)\r
- {\r
return ret;\r
- }\r
\r
- ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
+ ret_timeout = wait_event_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
\r
- if (unlikely(ret_timeout< 0))\r
- {\r
- pr_err("sync pid %d wait task ret %d\n", session->pid, ret_timeout);\r
+ if (unlikely(ret_timeout< 0)) {\r
mutex_lock(&rga_service.lock);\r
rga_del_running_list();\r
mutex_unlock(&rga_service.lock);\r
- ret = -ETIMEDOUT;\r
+ ret = ret_timeout;\r
}\r
- else if (0 == ret_timeout)\r
- {\r
- pr_err("sync pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
+ else if (0 == ret_timeout) {\r
mutex_lock(&rga_service.lock);\r
rga_del_running_list_timeout();\r
rga_try_set_reg();\r
\r
static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)\r
{\r
- struct rga_req *req;\r
+ struct rga_req req;\r
int ret = 0;\r
- rga_session *session = (rga_session *)file->private_data;\r
+ rga_session *session;\r
\r
- if (NULL == session)\r
- {\r
+ mutex_lock(&rga_service.mutex);\r
+\r
+ session = (rga_session *)file->private_data;\r
+\r
+ if (NULL == session) {\r
printk("%s [%d] rga thread session is null\n",__FUNCTION__,__LINE__);\r
+ mutex_unlock(&rga_service.mutex);\r
return -EINVAL;\r
}\r
\r
- req = kzalloc(sizeof(struct rga_req), GFP_KERNEL);\r
- if(req == NULL)\r
- {\r
- printk("%s [%d] get rga_req mem failed\n",__FUNCTION__,__LINE__);\r
- return -EINVAL;\r
- }\r
-\r
- mutex_lock(&rga_service.mutex);\r
+ memset(&req, 0x0, sizeof(req));\r
\r
- switch (cmd)\r
- {\r
+ switch (cmd) {\r
case RGA_BLIT_SYNC:\r
- if (unlikely(copy_from_user(req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
+ if (unlikely(copy_from_user(&req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
{\r
ERR("copy_from_user failed\n");\r
ret = -EFAULT;\r
break;\r
}\r
- ret = rga_blit_sync(session, req);\r
+ ret = rga_blit_sync(session, &req);\r
break;\r
case RGA_BLIT_ASYNC:\r
- if (unlikely(copy_from_user(req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
+ if (unlikely(copy_from_user(&req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
{\r
ERR("copy_from_user failed\n");\r
ret = -EFAULT;\r
\r
if((atomic_read(&rga_service.total_running) > 16))\r
{\r
- ret = rga_blit_sync(session, req);\r
+ ret = rga_blit_sync(session, &req);\r
}\r
else\r
{\r
- ret = rga_blit_async(session, req);\r
+ ret = rga_blit_async(session, &req);\r
}\r
break;\r
case RGA_FLUSH:\r
\r
mutex_unlock(&rga_service.mutex);\r
\r
- kfree(req);\r
+ return ret;\r
+}\r
+\r
+\r
+long rga_ioctl_kernel(struct rga_req *req)\r
+{\r
+ int ret = 0;\r
+ rga_session *session;\r
+\r
+ mutex_lock(&rga_service.mutex);\r
+\r
+ session = &rga_session_global;\r
+\r
+ if (NULL == session) {\r
+ printk("%s [%d] rga thread session is null\n",__FUNCTION__,__LINE__);\r
+ mutex_unlock(&rga_service.mutex);\r
+ return -EINVAL;\r
+ }\r
+\r
+ switch (RGA_BLIT_SYNC) {\r
+ case RGA_BLIT_SYNC:\r
+ ret = rga_blit_sync(session, req);\r
+ break;\r
+ case RGA_BLIT_ASYNC:\r
+ break;\r
+ case RGA_FLUSH:\r
+ break;\r
+ case RGA_GET_RESULT:\r
+ break;\r
+ case RGA_GET_VERSION:\r
+ //ret = 0;\r
+ break;\r
+ default:\r
+ ERR("unknown ioctl cmd!\n");\r
+ ret = -EINVAL;\r
+ break;\r
+ }\r
+\r
+ mutex_unlock(&rga_service.mutex);\r
\r
return ret;\r
}\r
\r
+\r
static int rga_open(struct inode *inode, struct file *file)\r
{\r
rga_session *session = kzalloc(sizeof(rga_session), GFP_KERNEL);\r
/*ͬ²½*/\r
}\r
\r
- wake_up_interruptible_sync(&session->wait);\r
+ wake_up(&session->wait);\r
mutex_lock(&rga_service.lock);\r
list_del(&session->list_session);\r
rga_service_session_clear(session);\r
.fops = &rga_fops,\r
};\r
\r
-static int __devinit rga_drv_probe(struct platform_device *pdev)\r
+\r
+#if defined(CONFIG_OF)\r
+static const struct of_device_id rockchip_rga_dt_ids[] = {\r
+ { .compatible = "rockchip,rga", },\r
+ {},\r
+};\r
+#endif\r
+\r
+static int rga_drv_probe(struct platform_device *pdev)\r
{\r
struct rga_drvdata *data;\r
+ struct resource *res;\r
+ //struct device_node *np = pdev->dev.of_node;\r
int ret = 0;\r
\r
- INIT_LIST_HEAD(&rga_service.waiting);\r
- INIT_LIST_HEAD(&rga_service.running);\r
- INIT_LIST_HEAD(&rga_service.done);\r
- INIT_LIST_HEAD(&rga_service.session);\r
mutex_init(&rga_service.lock);\r
mutex_init(&rga_service.mutex);\r
atomic_set(&rga_service.total_running, 0);\r
rga_service.last_prc_src_format = 1; /* default is yuv first*/\r
rga_service.enable = false;\r
\r
- data = kzalloc(sizeof(struct rga_drvdata), GFP_KERNEL);\r
- if(NULL == data)\r
- {\r
+ data = devm_kzalloc(&pdev->dev, sizeof(struct rga_drvdata), GFP_KERNEL);\r
+ if(! data) {\r
ERR("failed to allocate driver data.\n");\r
return -ENOMEM;\r
}\r
INIT_DELAYED_WORK(&data->power_off_work, rga_power_off_work);\r
wake_lock_init(&data->wake_lock, WAKE_LOCK_SUSPEND, "rga");\r
\r
- data->pd_rga = clk_get(NULL, "pd_rga");\r
- data->aclk_rga = clk_get(NULL, "aclk_rga");\r
- data->hclk_rga = clk_get(NULL, "hclk_rga");\r
+ //data->pd_rga = devm_clk_get(&pdev->dev, "pd_rga");\r
+ data->aclk_rga = devm_clk_get(&pdev->dev, "aclk_rga");\r
+ data->hclk_rga = devm_clk_get(&pdev->dev, "hclk_rga");\r
\r
- /* map the memory */\r
- if (!request_mem_region(RK30_RGA_PHYS, RK30_RGA_SIZE, "rga_io"))\r
- {\r
- pr_info("failed to reserve rga HW regs\n");\r
- return -EBUSY;\r
- }\r
- \r
- data->rga_base = (void*)ioremap_nocache(RK30_RGA_PHYS, RK30_RGA_SIZE);\r
- if (data->rga_base == NULL)\r
- {\r
+ /* map the registers */\r
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
+ data->rga_base = devm_ioremap_resource(&pdev->dev, res);\r
+ if (!data->rga_base) {\r
ERR("rga ioremap failed\n");\r
ret = -ENOENT;\r
goto err_ioremap;\r
}\r
\r
/* get the IRQ */\r
- data->irq = platform_get_irq(pdev, 0);\r
- if (data->irq <= 0)\r
- {\r
+ data->irq = ret = platform_get_irq(pdev, 0);\r
+ if (ret <= 0) {\r
ERR("failed to get rga irq resource (%d).\n", data->irq);\r
ret = data->irq;\r
goto err_irq;\r
}\r
\r
/* request the IRQ */\r
- ret = request_threaded_irq(data->irq, rga_irq, rga_irq_thread, 0, "rga", pdev);\r
+ //ret = request_threaded_irq(data->irq, rga_irq, rga_irq_thread, 0, "rga", pdev);\r
+ ret = devm_request_threaded_irq(&pdev->dev, data->irq, rga_irq, rga_irq_thread, 0, "rga", data);\r
if (ret)\r
{\r
ERR("rga request_irq failed (%d).\n", ret);\r
platform_set_drvdata(pdev, data);\r
drvdata = data;\r
\r
+ #if defined(CONFIG_ION_ROCKCHIP)\r
+ data->ion_client = rockchip_ion_client_create("rga");\r
+ if (IS_ERR(data->ion_client)) {\r
+ dev_err(&pdev->dev, "failed to create ion client for rga");\r
+ return PTR_ERR(data->ion_client);\r
+ } else {
+ dev_info(&pdev->dev, "rga ion client create success!\n");\r
+ }
+ #endif\r
+\r
ret = misc_register(&rga_dev);\r
if(ret)\r
{\r
iounmap(data->rga_base);\r
err_ioremap:\r
wake_lock_destroy(&data->wake_lock);\r
- kfree(data);\r
+ //kfree(data);\r
\r
return ret;\r
}\r
free_irq(data->irq, &data->miscdev);\r
iounmap((void __iomem *)(data->rga_base));\r
\r
- clk_put(data->pd_rga);\r
- clk_put(data->aclk_rga);\r
- clk_put(data->hclk_rga);\r
+ //clk_put(data->pd_rga);\r
+ devm_clk_put(&pdev->dev, data->aclk_rga);\r
+ devm_clk_put(&pdev->dev, data->hclk_rga);\r
\r
- kfree(data);\r
+ //kfree(data);\r
return 0;\r
}\r
\r
static struct platform_driver rga_driver = {\r
.probe = rga_drv_probe,\r
- .remove = __devexit_p(rga_drv_remove),\r
+ .remove = rga_drv_remove,\r
.driver = {\r
.owner = THIS_MODULE,\r
.name = "rga",\r
+ .of_match_table = of_match_ptr(rockchip_rga_dt_ids),\r
},\r
};\r
\r
return ret;\r
}\r
\r
- //rga_test_0();\r
+ {\r
+ rga_session_global.pid = 0x0000ffff;\r
+ INIT_LIST_HEAD(&rga_session_global.waiting);\r
+ INIT_LIST_HEAD(&rga_session_global.running);\r
+ INIT_LIST_HEAD(&rga_session_global.list_session);\r
+\r
+ INIT_LIST_HEAD(&rga_service.waiting);\r
+ INIT_LIST_HEAD(&rga_service.running);\r
+ INIT_LIST_HEAD(&rga_service.done);\r
+ INIT_LIST_HEAD(&rga_service.session);\r
+\r
+ init_waitqueue_head(&rga_session_global.wait);\r
+ //mutex_lock(&rga_service.lock);\r
+ list_add_tail(&rga_session_global.list_session, &rga_service.session);\r
+ //mutex_unlock(&rga_service.lock);\r
+ atomic_set(&rga_session_global.task_running, 0);\r
+ atomic_set(&rga_session_global.num_done, 0);\r
+ }\r
+\r
+\r
+\r
+ #if RGA_TEST_CASE\r
+ rga_test_0();\r
+ #endif\r
\r
INFO("Module initialized.\n");\r
\r
}\r
\r
\r
-#if 0\r
+#if RGA_TEST_CASE\r
\r
-#if 1\r
extern struct fb_info * rk_get_fb(int fb_id);\r
EXPORT_SYMBOL(rk_get_fb);\r
\r
extern void rk_direct_fb_show(struct fb_info * fbi);\r
EXPORT_SYMBOL(rk_direct_fb_show);\r
\r
-#endif\r
-\r
-unsigned int src_buf[320*240];\r
-unsigned int dst_buf[1024*768];\r
+unsigned int src_buf[1920*1080];\r
+unsigned int dst_buf[1920*1080];\r
+//unsigned int tmp_buf[1920*1080 * 2];\r
\r
void rga_test_0(void)\r
{\r
uint32_t i, j;\r
uint8_t *p;\r
uint8_t t;\r
+ uint32_t *dst0, *dst1, *dst2;\r
\r
struct fb_info *fb;\r
\r
//file->private_data = (void *)session;\r
\r
fb = rk_get_fb(0);\r
- \r
+\r
memset(&req, 0, sizeof(struct rga_req));\r
src = src_buf;\r
dst = dst_buf;\r
\r
- memset(src_buf, 0x80, 320*240*4);\r
+ memset(src_buf, 0x80, 1024*600*4);\r
+\r
+ dmac_flush_range(&src_buf[0], &src_buf[1024*600]);\r
+ outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[1024*600]));\r
\r
- dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
- outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
\r
- \r
#if 0\r
memset(src_buf, 0x80, 800*480*4);\r
memset(dst_buf, 0xcc, 800*480*4);\r
outer_flush_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[800*480]));\r
#endif\r
\r
- req.src.act_w = 320;\r
- req.src.act_h = 240;\r
-\r
- req.src.vir_w = 320;\r
- req.src.vir_h = 240;\r
- req.src.yrgb_addr = (uint32_t)src;\r
- req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
- req.src.v_addr = (uint32_t)virt_to_phys(src);\r
- req.src.format = 0;\r
-\r
- req.dst.act_w = 320;\r
- req.dst.act_h = 240;\r
-\r
- req.dst.vir_w = 1024;\r
- req.dst.vir_h = 768;\r
- req.dst.x_offset = 0;\r
- req.dst.y_offset = 0;\r
- req.dst.yrgb_addr = (uint32_t)dst;\r
-\r
- //req.dst.format = RK_FORMAT_RGB_565;\r
-\r
- req.clip.xmin = 0;\r
- req.clip.xmax = 1023;\r
- req.clip.ymin = 0;\r
- req.clip.ymax = 767;\r
-\r
- //req.render_mode = color_fill_mode;\r
- //req.fg_color = 0x80ffffff;\r
-\r
- //req.rotate_mode = 1;\r
- //req.scale_mode = 2;\r
-\r
- //req.alpha_rop_flag = 1;\r
- //req.alpha_rop_mode = 0x19;\r
- req.PD_mode = 3;\r
-\r
- req.sina = 0;\r
- req.cosa = 65536;\r
-\r
- req.mmu_info.mmu_flag = 0x21;\r
- req.mmu_info.mmu_en = 1;\r
-\r
- rga_blit_sync(&session, &req);\r
-\r
- dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
-\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- }\r
-\r
- p = (uint8_t *)src_buf;\r
- p = p + 16 * 4;\r
-\r
- for(i=0; i<16; i++)\r
- src_buf[i] = 0;\r
-\r
- for(j=0; j<16; j++)\r
- {\r
- for(i=0; i<16; i++)\r
- {\r
- t = j*16 + i;\r
- src_buf[(j+1)*16 + i] = (t<<24)|(t<<16)|(t<<8)|t;\r
- }\r
- }\r
-\r
- dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
- outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
+ dst0 = &dst_buf[0];\r
+ //dst1 = &dst_buf[1280*800*4];\r
+ //dst2 = &dst_buf[1280*800*4*2];\r
\r
- dmac_inv_range(&src_buf[0], &src_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
+ i = j = 0;\r
\r
- printk("SRC DATA \n");\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", src_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
+ printk("\n********************************\n");\r
+ printk("************ RGA_TEST ************\n");\r
+ printk("********************************\n\n");\r
\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", src_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- } \r
+ req.src.act_w = 1024;\r
+ req.src.act_h = 600;\r
\r
- req.src.act_w = 320;\r
- req.src.act_h = 240;\r
-\r
- req.src.vir_w = 320;\r
- req.src.vir_h = 240;\r
- req.src.yrgb_addr = (uint32_t)src;\r
- req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
+ req.src.vir_w = 1024;\r
+ req.src.vir_h = 600;\r
+ req.src.yrgb_addr = (uint32_t)virt_to_phys(src);\r
+ req.src.uv_addr = (uint32_t)(req.src.yrgb_addr + 1080*1920);\r
req.src.v_addr = (uint32_t)virt_to_phys(src);\r
- req.src.format = 0;\r
+ req.src.format = RK_FORMAT_RGBA_8888;\r
\r
- req.dst.act_w = 320;\r
- req.dst.act_h = 240;\r
+ req.dst.act_w = 600;\r
+ req.dst.act_h = 352;\r
\r
- req.dst.vir_w = 1024;\r
- req.dst.vir_h = 768;\r
- req.dst.x_offset = 0;\r
+ req.dst.vir_w = 1280;\r
+ req.dst.vir_h = 800;\r
+ req.dst.x_offset = 600;\r
req.dst.y_offset = 0;\r
- req.dst.yrgb_addr = (uint32_t)(dst);\r
\r
- //req.dst.format = RK_FORMAT_RGB_565;\r
+ dst = dst0;\r
\r
- req.clip.xmin = 0;\r
- req.clip.xmax = 1023;\r
- req.clip.ymin = 0;\r
- req.clip.ymax = 767;\r
-\r
- //req.render_mode = color_fill_mode;\r
- //req.fg_color = 0x80ffffff;\r
-\r
- //req.rotate_mode = 1;\r
- //req.scale_mode = 2;\r
-\r
- req.alpha_rop_flag = 0x19;\r
- req.alpha_rop_mode = 0x1;\r
- req.PD_mode = 3;\r
-\r
- req.sina = 0;\r
- req.cosa = 65536;\r
-\r
- req.mmu_info.mmu_flag = 0x21;\r
- req.mmu_info.mmu_en = 1;\r
- \r
- rga_blit_sync(&session, &req);\r
-\r
- dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- }\r
-\r
- memset(src_buf, 0x80, 320*240*4);\r
-\r
- dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
- outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
-\r
- \r
- #if 0\r
- memset(src_buf, 0x80, 800*480*4);\r
- memset(dst_buf, 0xcc, 800*480*4);\r
-\r
- dmac_flush_range(&dst_buf[0], &dst_buf[800*480]);\r
- outer_flush_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[800*480]));\r
- #endif\r
-\r
- req.src.act_w = 320;\r
- req.src.act_h = 240;\r
-\r
- req.src.vir_w = 320;\r
- req.src.vir_h = 240;\r
- req.src.yrgb_addr = (uint32_t)(src);\r
- req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
- req.src.v_addr = (uint32_t)virt_to_phys(src);\r
- req.src.format = 0;\r
-\r
- req.dst.act_w = 320;\r
- req.dst.act_h = 240;\r
-\r
- req.dst.vir_w = 1024;\r
- req.dst.vir_h = 768;\r
- req.dst.x_offset = 0;\r
- req.dst.y_offset = 0;\r
- req.dst.yrgb_addr = (uint32_t)(dst);\r
+ req.dst.yrgb_addr = ((uint32_t)virt_to_phys(dst));\r
\r
//req.dst.format = RK_FORMAT_RGB_565;\r
\r
req.clip.xmin = 0;\r
- req.clip.xmax = 1023;\r
+ req.clip.xmax = 1279;\r
req.clip.ymin = 0;\r
- req.clip.ymax = 767;\r
+ req.clip.ymax = 799;\r
\r
//req.render_mode = color_fill_mode;\r
//req.fg_color = 0x80ffffff;\r
\r
- //req.rotate_mode = 1;\r
+ req.rotate_mode = 1;\r
//req.scale_mode = 2;\r
\r
- req.alpha_rop_flag = 0;\r
- req.alpha_rop_mode = 0x0;\r
-\r
- req.sina = 0;\r
- req.cosa = 65536;\r
-\r
- req.mmu_info.mmu_flag = 0x21;\r
- req.mmu_info.mmu_en = 1;\r
-\r
- rga_blit_sync(&session, &req);\r
-\r
- dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
-\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- }\r
-\r
- p = (uint8_t *)src_buf;\r
- p = p + 16 * 4;\r
-\r
- for(i=0; i<16; i++)\r
- src_buf[i] = 0;\r
-\r
- for(j=0; j<16; j++)\r
- {\r
- for(i=0; i<16; i++)\r
- {\r
- t = j*16 + i;\r
- src_buf[(j+1)*16 + i] = (t<<24)|(t<<16)|(t<<8)|t;\r
- }\r
- }\r
-\r
- dmac_inv_range(&src_buf[0], &src_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
- printk("SRC DATA \n");\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", src_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
-\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", src_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- }\r
-\r
- dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
- outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
-\r
- req.src.act_w = 320;\r
- req.src.act_h = 240;\r
-\r
- req.src.vir_w = 320;\r
- req.src.vir_h = 240;\r
- req.src.yrgb_addr = (uint32_t)(src);\r
- req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
- req.src.v_addr = (uint32_t)virt_to_phys(src);\r
- req.src.format = 0;\r
-\r
- req.dst.act_w = 320;\r
- req.dst.act_h = 240;\r
-\r
- req.dst.vir_w = 1024;\r
- req.dst.vir_h = 768;\r
- req.dst.x_offset = 0;\r
- req.dst.y_offset = 0;\r
- req.dst.yrgb_addr = (uint32_t)(dst);\r
-\r
- //req.dst.format = RK_FORMAT_RGB_565;\r
+ //req.alpha_rop_flag = 0;\r
+ //req.alpha_rop_mode = 0x19;\r
+ //req.PD_mode = 3;\r
\r
- req.clip.xmin = 0;\r
- req.clip.xmax = 1023;\r
- req.clip.ymin = 0;\r
- req.clip.ymax = 767;\r
+ req.sina = 65536;\r
+ req.cosa = 0;\r
\r
- //req.render_mode = color_fill_mode;\r
- //req.fg_color = 0x80ffffff;\r
-\r
- //req.rotate_mode = 1;\r
- //req.scale_mode = 2;\r
+ //req.mmu_info.mmu_flag = 0x21;\r
+ //req.mmu_info.mmu_en = 1;\r
\r
- req.alpha_rop_flag = 0x19;\r
- req.alpha_rop_mode = 0x1;\r
- req.PD_mode = 3;\r
+ //printk("src = %.8x\n", req.src.yrgb_addr);\r
+ //printk("src = %.8x\n", req.src.uv_addr);\r
+ //printk("dst = %.8x\n", req.dst.yrgb_addr);\r
\r
- req.sina = 0;\r
- req.cosa = 65536;\r
\r
- req.mmu_info.mmu_flag = 0x21;\r
- req.mmu_info.mmu_en = 1;\r
- \r
rga_blit_sync(&session, &req);\r
\r
- dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
- outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
- for(j=0; j<17; j++)\r
- {\r
- for(i=0; i<8; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- for(i=8; i<16; i++)\r
- {\r
- printk("%.8x, ", dst_buf[j*16 + i]); \r
- }\r
- printk("\n");\r
- }\r
-\r
#if 1\r
fb->var.bits_per_pixel = 32;\r
- \r
- fb->var.xres = 1024;\r
- fb->var.yres = 768;\r
+\r
+ fb->var.xres = 1280;\r
+ fb->var.yres = 800;\r
\r
fb->var.red.length = 8;\r
fb->var.red.offset = 0;\r