aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
diff options
context:
space:
mode:
authorcodeworkx <codeworkx@cyanogenmod.com>2012-09-17 17:53:57 +0200
committercodeworkx <codeworkx@cyanogenmod.com>2012-09-18 16:31:59 +0200
commitc28265764ec6ad9995eb0c761a376ffc9f141fcd (patch)
tree3ad899757480d47deb2be6011509a4243e8e0dc2 /drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
parent0ddbcb39c0dc0318f68d858f25a96a074142af2f (diff)
downloadkernel_samsung_smdk4412-c28265764ec6ad9995eb0c761a376ffc9f141fcd.zip
kernel_samsung_smdk4412-c28265764ec6ad9995eb0c761a376ffc9f141fcd.tar.gz
kernel_samsung_smdk4412-c28265764ec6ad9995eb0c761a376ffc9f141fcd.tar.bz2
applied patches from i9305 jb sources, updated mali to r3p0
Change-Id: Iec4bc4e2fb59e2cf5b4d25568a644d4e3719565e
Diffstat (limited to 'drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c')
-rw-r--r--drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c64
1 files changed, 58 insertions, 6 deletions
diff --git a/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c b/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
index eaa722c..0c6c590 100644
--- a/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
+++ b/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
@@ -130,6 +130,7 @@ static int fimg2d_check_dma_sync(struct fimg2d_bltcmd *cmd)
enum pt_status pt;
int clip_x, clip_w, clip_h, y, dir, i;
unsigned long clip_start;
+ unsigned long modified_addr;
clp = &p->clipping;
@@ -155,6 +156,13 @@ static int fimg2d_check_dma_sync(struct fimg2d_bltcmd *cmd)
pt = fimg2d_check_pagetable(mm, c->addr, c->size);
if (pt == PT_FAULT)
return -1;
+ } else if (img->addr.type == ADDR_USER_CONTIG) {
+ modified_addr = GET_MVA(img->addr.start, img->plane2.start);
+ pt = fimg2d_migrate_pagetable(cmd->ctx->pgd_clone,
+ modified_addr, img->plane2.start, img->height * img->stride);
+ if (pt != PT_NORMAL) {
+ return -1;
+ }
}
if (img->need_cacheopr && i != IMAGE_TMP) {
@@ -175,7 +183,25 @@ static int fimg2d_check_dma_sync(struct fimg2d_bltcmd *cmd)
c = &cmd->dma[i];
r = &img->rect;
- if (!img->addr.type || !c->cached)
+ if (!img->addr.type)
+ continue;
+
+ if ((cmd->image[IMAGE_SRC].addr.type == ADDR_USER_CONTIG) ||
+ (cmd->image[IMAGE_DST].addr.type == ADDR_USER_CONTIG)) {
+ if (img->addr.type == ADDR_USER_CONTIG) {
+ if (i == IMAGE_DST && clp->enable)
+ modified_addr = GET_MVA(img->addr.start, img->plane2.start) +
+ (img->stride * clp->y1);
+ else
+ modified_addr = GET_MVA(img->addr.start, img->plane2.start) +
+ (img->stride * r->y1);
+ } else {
+ modified_addr = c->addr;
+ }
+ fimg2d_clean_inner_pagetable_clone(cmd->ctx->pgd_clone, modified_addr, c->size);
+ }
+
+ if ( !c->cached)
continue;
if (i == IMAGE_DST)
@@ -226,8 +252,22 @@ static int fimg2d_check_dma_sync(struct fimg2d_bltcmd *cmd)
continue;
/* clean pagetable */
- if (img->addr.type == ADDR_USER)
+ if ((cmd->image[IMAGE_SRC].addr.type == ADDR_USER_CONTIG) ||
+ (cmd->image[IMAGE_DST].addr.type == ADDR_USER_CONTIG)) {
+ if (img->addr.type == ADDR_USER_CONTIG) {
+ if (i == IMAGE_DST && clp->enable)
+ modified_addr = GET_MVA(img->addr.start, img->plane2.start) +
+ (img->stride * clp->y1);
+ else
+ modified_addr = GET_MVA(img->addr.start, img->plane2.start) +
+ (img->stride * r->y1);
+ } else {
+ modified_addr = c->addr;
+ }
+ fimg2d_clean_outer_pagetable_clone(cmd->ctx->pgd_clone, modified_addr, c->size);
+ } else {
fimg2d_clean_outer_pagetable(mm, c->addr, c->size);
+ }
if (!c->cached)
continue;
@@ -275,14 +315,17 @@ int fimg2d_add_command(struct fimg2d_control *info, struct fimg2d_context *ctx,
int i, ret;
struct fimg2d_image *buf[MAX_IMAGES] = image_table(blit);
struct fimg2d_bltcmd *cmd;
+ struct fimg2d_image *img;
- if ((blit->dst) && (type == ADDR_USER))
+ if ((blit->dst) && (type == ADDR_USER)
+ && (blit->seq_no == SEQ_NO_BLT_SKIA))
up_write(&page_alloc_slow_rwsem);
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
if (!cmd) {
- if ((blit->dst) && (type == ADDR_USER))
+ if ((blit->dst) && (type == ADDR_USER)
+ && (blit->seq_no == SEQ_NO_BLT_SKIA))
if (!down_write_trylock(&page_alloc_slow_rwsem))
return -EAGAIN;
return -ENOMEM;
@@ -294,7 +337,8 @@ int fimg2d_add_command(struct fimg2d_control *info, struct fimg2d_context *ctx,
if (copy_from_user(&cmd->image[i], buf[i],
sizeof(struct fimg2d_image))) {
- if ((blit->dst) && (type == ADDR_USER))
+ if ((blit->dst) && (type == ADDR_USER)
+ && (blit->seq_no == SEQ_NO_BLT_SKIA))
if (!down_write_trylock(&page_alloc_slow_rwsem)) {
ret = -EAGAIN;
goto err_user;
@@ -304,7 +348,8 @@ int fimg2d_add_command(struct fimg2d_control *info, struct fimg2d_context *ctx,
}
}
- if ((blit->dst) && (type == ADDR_USER))
+ if ((blit->dst) && (type == ADDR_USER)
+ && (blit->seq_no == SEQ_NO_BLT_SKIA))
if (!down_write_trylock(&page_alloc_slow_rwsem)) {
ret = -EAGAIN;
goto err_user;
@@ -329,6 +374,13 @@ int fimg2d_add_command(struct fimg2d_control *info, struct fimg2d_context *ctx,
fimg2d_fixup_params(cmd);
+ for (i = 0; i < MAX_IMAGES; i++) {
+ img = &cmd->image[i];
+ if (img->addr.type == ADDR_USER_CONTIG) {
+ memcpy(cmd->ctx->pgd_clone, cmd->ctx->mm->pgd, L1_DESCRIPTOR_SIZE);
+ }
+ }
+
if (fimg2d_check_dma_sync(cmd)) {
ret = -EFAULT;
goto err_user;