struct g2d_task; /* defined in g2d_task.h */
-struct g2d_task_secbuf {
- unsigned long cmd_paddr;
- int cmd_count;
- int priority;
- int job_id;
- int secure_layer;
-};
-
enum g2d_priority {
G2D_LOW_PRIORITY,
G2D_MEDIUM_PRIORITY,
task->cmd_count++;
}
-#ifdef CONFIG_EXYNOS_CONTENT_PATH_PROTECTION
-void g2d_complete_commands(struct g2d_task *task)
-{
- /* 832 is the total number of the G2D registers */
- BUG_ON(task->cmd_count > 830);
-
- g2d_set_taskctl_commands(task);
-
- if (IS_HWFC(task->flags))
- g2d_set_hwfc_commands(task);
-}
-#else
void g2d_complete_commands(struct g2d_task *task)
{
struct g2d_reg *regs = page_address(task->cmd_page);
regs[task->cmd_count].value = 1;
task->cmd_count++;
}
-#endif
static const struct g2d_fmt g2d_formats[] = {
{
if ((layer->flags & G2D_LAYERFLAG_COLORFILL) != 0)
return true;
+ if ((layer->flags & G2D_LAYERFLAG_SECURE) != 0)
+ reg[TASK_REG_LAYER_SECURE].value |= 1 << index;
+
task->cmd_count = ((colormode & G2D_DATAFORMAT_AFBC) != 0)
? g2d_set_afbc_buffer(task, layer, LAYER_OFFSET(index))
: g2d_set_image_buffer(task, layer, colormode,
bool g2d_prepare_target(struct g2d_task *task)
{
+ struct g2d_reg *reg = (struct g2d_reg *)page_address(task->cmd_page);
u32 colormode = task->target.commands[G2DSFR_IMG_COLORMODE].value;
+ if ((task->target.flags & G2D_LAYERFLAG_SECURE) != 0)
+ reg[TASK_REG_LAYER_SECURE].value |= 1 << 24;
+
task->cmd_count = ((colormode & G2D_DATAFORMAT_AFBC) != 0)
? g2d_set_afbc_buffer(task, &task->target,
TARGET_OFFSET)
#include "g2d.h"
#include "g2d_regs.h"
#include "g2d_task.h"
-#include "g2d_uapi.h"
-#ifdef CONFIG_EXYNOS_CONTENT_PATH_PROTECTION
-#include <linux/smc.h>
-#include <asm/cacheflush.h>
-
-void g2d_hw_push_task(struct g2d_device *g2d_dev, struct g2d_task *task)
-{
- struct g2d_task_secbuf sec_task;
- int i;
-
- sec_task.cmd_paddr = (unsigned long)page_to_phys(task->cmd_page);
- sec_task.cmd_count = task->cmd_count;
- sec_task.priority = task->priority;
- sec_task.job_id = task->job_id;
- sec_task.secure_layer = 0;
-
- for (i = 0; i < task->num_source; i++) {
- if ((task->source[i].flags & G2D_LAYERFLAG_SECURE) != 0)
- sec_task.secure_layer |= 1 << i;
- }
- if ((task->target.flags & G2D_LAYERFLAG_SECURE) != 0)
- sec_task.secure_layer |= 1 << 24;
-
- __flush_dcache_area(&sec_task, sizeof(sec_task));
- __flush_dcache_area(page_address(task->cmd_page), G2D_CMD_LIST_SIZE);
- if (exynos_smc(SMC_DRM_G2D_CMD_DATA, virt_to_phys(&sec_task), 0, 0))
- BUG_ON(1);
-}
-#else
void g2d_hw_push_task(struct g2d_device *g2d_dev, struct g2d_task *task)
{
u32 state = g2d_hw_get_job_state(g2d_dev, task->job_id);
writel_relaxed(1 << task->job_id, g2d_dev->reg + G2D_JOB_INT_ID_REG);
writel(G2D_JOBPUSH_INT_ENABLE, g2d_dev->reg + G2D_JOB_PUSH_REG);
}
-#endif
static const char *error_desc[3] = {
"AFBC Stuck",
#ifdef CONFIG_EXYNOS_CONTENT_PATH_PROTECTION
#include <linux/smc.h>
+#define G2D_SECURE_DMA_BASE 0x8000000
+#define G2D_SEC_COMMAND_BUF 12
#define G2D_ALWAYS_S 37
+
static int g2d_map_cmd_data(struct g2d_task *task)
{
+ struct g2d_buffer_prot_info *prot = &task->prot_info;
+ int ret;
+
+ prot->chunk_count = 1;
+ prot->flags = G2D_SEC_COMMAND_BUF;
+ prot->chunk_size = G2D_CMD_LIST_SIZE;
+ prot->bus_address = page_to_phys(task->cmd_page);
+ prot->dma_addr = G2D_SECURE_DMA_BASE + G2D_CMD_LIST_SIZE * task->job_id;
+
+ __flush_dcache_area(prot, sizeof(struct g2d_buffer_prot_info));
+ ret = exynos_smc(SMC_DRM_PPMP_PROT, virt_to_phys(prot), 0, 0);
+
+ if (ret) {
+ dev_err(task->g2d_dev->dev,
+ "Failed to map secure page tbl (%d) %x %x %lx\n", ret,
+ prot->dma_addr, prot->flags, prot->bus_address);
+ return ret;
+ }
+
+ task->cmd_addr = prot->dma_addr;
+
return 0;
}