diff options
author | codeworkx <codeworkx@cyanogenmod.com> | 2012-09-17 17:53:57 +0200 |
---|---|---|
committer | codeworkx <codeworkx@cyanogenmod.com> | 2012-09-18 16:31:59 +0200 |
commit | c28265764ec6ad9995eb0c761a376ffc9f141fcd (patch) | |
tree | 3ad899757480d47deb2be6011509a4243e8e0dc2 /drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c | |
parent | 0ddbcb39c0dc0318f68d858f25a96a074142af2f (diff) | |
download | kernel_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.c | 64 |
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; |