aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c')
-rw-r--r--drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c76
1 files changed, 75 insertions, 1 deletions
diff --git a/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c b/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
index 0c6c590..52160d6 100644
--- a/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
+++ b/drivers/media/video/samsung/fimg2d4x-exynos4/fimg2d_ctx.c
@@ -18,10 +18,54 @@
#include "fimg2d_ctx.h"
#include "fimg2d_cache.h"
#include "fimg2d_helper.h"
+#if defined(CONFIG_CMA)
+#include <linux/cma.h>
+#endif
+
+static inline int is_yuvfmt(enum color_format fmt)
+{
+ switch (fmt) {
+ case CF_YCBCR_420:
+ case CF_YCBCR_422:
+ case CF_YCBCR_444:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+/**
+ * @plane: 0 for 1st plane, 1 for 2nd plane
+ */
+static int yuv_stride(int width, enum color_format cf, enum pixel_order order,
+ int plane)
+{
+ int bpp;
+
+ switch (cf) {
+ case CF_YCBCR_420:
+ bpp = (!plane) ? 8 : 4;
+ break;
+ case CF_YCBCR_422:
+ if (order == P2_CRCB || order == P2_CBCR)
+ bpp = 8;
+ else
+ bpp = (!plane) ? 16 : 0;
+ break;
+ case CF_YCBCR_444:
+ bpp = (!plane) ? 8 : 16;
+ break;
+ default:
+ bpp = 0;
+ break;
+ }
+
+ return width * bpp >> 3;
+}
static int fimg2d_check_params(struct fimg2d_bltcmd *cmd)
{
- int w, h, i;
+ int w, h, i, bw;
struct fimg2d_param *p = &cmd->param;
struct fimg2d_image *img;
struct fimg2d_scale *scl;
@@ -53,6 +97,36 @@ static int fimg2d_check_params(struct fimg2d_bltcmd *cmd)
r->x1 >= w || r->y1 >= h ||
r->x1 >= r->x2 || r->y1 >= r->y2)
return -1;
+#if defined(CONFIG_CMA)
+#if 0
+ if (img->addr.type == ADDR_PHYS) {
+ if (!cma_is_registered_region(img->addr.start, (h * img->stride))) {
+ printk(KERN_ERR "[%s] Surface[%d] is not included in CMA region\n", __func__, i);
+ return -1;
+ }
+ }
+#else
+ if (img->addr.type == ADDR_PHYS) {
+ if (is_yuvfmt(img->fmt))
+ bw = yuv_stride(img->width, img->fmt, img->order, 0);
+ else
+ bw = img->stride;
+
+ if (!cma_is_registered_region(img->addr.start, (h * bw))) {
+ printk(KERN_ERR "[%s] Surface[%d] is not included in CMA region\n", __func__, i);
+ return -1;
+ }
+
+ if (img->order == P2_CRCB || img->order == P2_CBCR) {
+ bw = yuv_stride(img->width, img->fmt, img->order, 1);
+ if (!cma_is_registered_region(img->plane2.start, (h * bw))) {
+ printk(KERN_ERR "[%s] plane2[%d] is not included in CMA region\n", __func__, i);
+ return -1;
+ }
+ }
+ }
+#endif
+#endif
}
clp = &p->clipping;