Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751684AbdIAHb5 (ORCPT ); Fri, 1 Sep 2017 03:31:57 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:54528 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751415AbdIAHbw (ORCPT ); Fri, 1 Sep 2017 03:31:52 -0400 X-AuditID: cbfec7f2-f793b6d000003243-b7-59a90ce42d16 Subject: Re: [PATCH 3/3] drm/exynos/gsc: Add rotation hardware limits of gscaler To: Hoegeun Kwon , inki.dae@samsung.com, jy0922.shim@samsung.com, sw0312.kim@samsung.com, airlied@linux.ie, kgene@kernel.org, krzk@kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, catalin.marinas@arm.com, will.deacon@arm.com Cc: dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org From: Marek Szyprowski Message-id: <10747c31-55fc-6464-eb00-99da6d66fca6@samsung.com> Date: Fri, 01 Sep 2017 09:31:46 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-version: 1.0 In-reply-to: <1504230476-1878-4-git-send-email-hoegeun.kwon@samsung.com> Content-type: text/plain; charset="utf-8"; format="flowed" Content-transfer-encoding: 7bit Content-language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa0hTYRjHec85OzsuZ2/T8lG7LvqQq1VUdrCSjKhDH7ooFEZUI0/Ociab SoaRGbM1LUWLbOpWUJaXymZoaEWuaGk4L0Wi5QXtounQNMUitbaj4Lff/33+7/O8/4eXIWVd In8mOjae18aqYuS0hKp489ux+otnUcTaZ49Xs1cctQQ7WJiBWMtrh4j9MDpIs4P3jDSb3ZlF sb0dTRSb2dNPsg0NZWLW2vNRxL6vyqfZ3IYXBHu3pYlg9c9fi9ncnD6a7fv5ltqGuVJzKeKs xZdprnKsS8R1ptsJrvzOee7qk2LEjVgX7xMfkmyJ5GOiE3ntmpBjErX52hQZ16Y8M2AzUCmo ZrkReTCAN8DDllIk8AJo7HhEG5GEkeG7CJqzbpCCGEHw1VZBzdyobp8ghEIhgs76Z5QgviMw 1ZlJl8sbh0HKxVF3Xx+sJ+B6XqDLROJiBG0ms7tA43VgdBppF0txCIw3l7hHUHgFdPc3us/n 48NwydZKCp55MJ7T4fZ4YA4+ZrQSLiZxMHyb1IsEXgLlpU5SYF+4qG91vw6wnoGfr8rERsT8 F4vA+pIU4uyAbEMWIbA3/LA/EQu8EN7npE9HzkSQqlcInIvA4ZQKvBle2Zum53pBdoVrX672 UjCkyQQLBy2fR6bbh0Lqzfzp/bYi+OVsIbLQUtOsaKZZcUyz4phmxbmFqGLkwyfoNFG8br1S p9LoEmKjlMdPa6zo/797N2kffopG3wbbEGaQ3FPau/1+hEykStQlaWwIGFLuIz1AF0XIpJGq pLO89vRRbUIMr7OhAIaS+0q3HkqLkOEoVTx/iufjeO1MlWA8/FNQqHLvQFi/urJcWTBcreiO Dpqbtvng5za1pd3vyPiFAHXcppNeXeeSE6ryVu3Mz+3eVZKzG8s3rX1kCLbMGyqgwpeFGXvL /sSJx2Rj+/9iamO65VNy+EqD2cdfsb4mZumJjDkdCs2D29iOKoNqmUC/qIqC5vpjjiGJZWBi T92SKTmlU6vWBZJaneof0hXarnMDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpileLIzCtJLcpLzFFi42I5/e/4Zd0nPCsjDU5t4rfoPXeSyeL9sh5G i/lHzrFaXPn6ns3i/fIuNotJ9yewWLy4d5HFov/xa2aL8+c3sFtsenyN1eLyrjlsFjPO72Oy WHr9IpNF694j7BYzJr9ks3j58QSLg4DHmnlrGD02repk89j+7QGrx/3u40wem5fUe/RtWcXo 8XmTXAB7lJtNRmpiSmqRQmpecn5KZl66rVJoiJuuhZJCXmJuqq1ShK5vSJCSQlliTimQZ2SA BhycA9yDlfTtEtwy5k35z1xwS6/izaEOlgbGg8pdjJwcEgImErvv/mWCsMUkLtxbz9bFyMUh JLCEUWLjz4UsEM5zRokf95+zgFQJCwRIHDx0EKxKRKCVSeLAnAPMIA6zwCpGibkfn7JCtNxk lHj+bwfYYDYBQ4mut11sIDavgJ3Ej0urwUaxCKhKPHp9ASwuKhAj8fPSIxaIGkGJH5Pvgdmc Ah4S13pugs1hFjCT+PLyMCuELS+xec1bZghbXKK59SbLBEbBWUjaZyFpmYWkZRaSlgWMLKsY RVJLi3PTc4uN9IoTc4tL89L1kvNzNzEC43/bsZ9bdjB2vQs+xCjAwajEw7uCa0WkEGtiWXFl 7iFGCQ5mJRHeMLaVkUK8KYmVValF+fFFpTmpxYcYTYGem8gsJZqcD0xNeSXxhiaG5paGRsYW FuZGRkrivOqXmyKFBNITS1KzU1MLUotg+pg4OKUaGA2mHPg3q9ly75k6cwEfjy2sGjm+r9bm mslXP90trjNtXebhqNiep4Zrgla51jS6ae65JBJVc0SWx6ik3UjgxH611mVfGZ1avv1NUXaZ qxZycXpRqI+Jxmz1Gj/Vug0iPRsUzjiL8cix+It1irvsU6+4X/Nx6rXkF8x9a6RVuq4Z+di/ zdZRYinOSDTUYi4qTgQA/5VMWBUDAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170901073148eucas1p23bca921709bb3616122d5671cd551ada X-Msg-Generator: CA X-Sender-IP: 182.198.249.180 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-CMS-RootMailID: 20170901014758epcas2p13ae73e7dcac72a1a28c9324164efbd6d X-RootMTR: 20170901014758epcas2p13ae73e7dcac72a1a28c9324164efbd6d References: <1504230476-1878-1-git-send-email-hoegeun.kwon@samsung.com> <1504230476-1878-4-git-send-email-hoegeun.kwon@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5805 Lines: 171 Hi Hoegeun, On 2017-09-01 03:47, Hoegeun Kwon wrote: > The gscaler has hardware rotation limits that need to be imported from > dts. Parse them and add them to the property list. > > The rotation hardware limits are related to the cropped source size. > When swap occurs, use rot_max size instead of crop_max size. > > Also the scaling limits are related to post size, use pos size to > check the limits. > > Signed-off-by: Hoegeun Kwon > --- > drivers/gpu/drm/exynos/exynos_drm_gsc.c | 63 +++++++++++++++++++++------------ > include/uapi/drm/exynos_drm.h | 2 ++ > 2 files changed, 42 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c > index 0506b2b..dd9b057 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c > @@ -1401,6 +1401,23 @@ static int gsc_ippdrv_check_property(struct device *dev, > bool swap; > int i; > > + config = &property->config[EXYNOS_DRM_OPS_DST]; > + > + /* check for degree */ > + switch (config->degree) { > + case EXYNOS_DRM_DEGREE_90: > + case EXYNOS_DRM_DEGREE_270: > + swap = true; > + break; > + case EXYNOS_DRM_DEGREE_0: > + case EXYNOS_DRM_DEGREE_180: > + swap = false; > + break; > + default: > + DRM_ERROR("invalid degree.\n"); > + goto err_property; > + } > + > for_each_ipp_ops(i) { > if ((i == EXYNOS_DRM_OPS_SRC) && > (property->cmd == IPP_CMD_WB)) > @@ -1416,21 +1433,6 @@ static int gsc_ippdrv_check_property(struct device *dev, > goto err_property; > } > > - /* check for degree */ > - switch (config->degree) { > - case EXYNOS_DRM_DEGREE_90: > - case EXYNOS_DRM_DEGREE_270: > - swap = true; > - break; > - case EXYNOS_DRM_DEGREE_0: > - case EXYNOS_DRM_DEGREE_180: > - swap = false; > - break; > - default: > - DRM_ERROR("invalid degree.\n"); > - goto err_property; > - } > - > /* check for buffer bound */ > if ((pos->x + pos->w > sz->hsize) || > (pos->y + pos->h > sz->vsize)) { > @@ -1438,21 +1440,27 @@ static int gsc_ippdrv_check_property(struct device *dev, > goto err_property; > } > > + /* > + * The rotation hardware limits are related to the cropped > + * source size. So use rot_max size to check the limits when > + * swap happens. And also the scaling limits are related to pos > + * size, use pos size to check the limits. > + */ > /* check for crop */ > if ((i == EXYNOS_DRM_OPS_SRC) && (pp->crop)) { > if (swap) { > if ((pos->h < pp->crop_min.hsize) || > - (sz->vsize > pp->crop_max.hsize) || > + (pos->h > pp->rot_max.hsize) || > (pos->w < pp->crop_min.vsize) || > - (sz->hsize > pp->crop_max.vsize)) { > + (pos->w > pp->rot_max.vsize)) { > DRM_ERROR("out of crop size.\n"); > goto err_property; > } > } else { > if ((pos->w < pp->crop_min.hsize) || > - (sz->hsize > pp->crop_max.hsize) || > + (pos->w > pp->crop_max.hsize) || > (pos->h < pp->crop_min.vsize) || > - (sz->vsize > pp->crop_max.vsize)) { > + (pos->h > pp->crop_max.vsize)) { > DRM_ERROR("out of crop size.\n"); > goto err_property; > } > @@ -1463,17 +1471,17 @@ static int gsc_ippdrv_check_property(struct device *dev, > if ((i == EXYNOS_DRM_OPS_DST) && (pp->scale)) { > if (swap) { > if ((pos->h < pp->scale_min.hsize) || > - (sz->vsize > pp->scale_max.hsize) || > + (pos->h > pp->scale_max.hsize) || > (pos->w < pp->scale_min.vsize) || > - (sz->hsize > pp->scale_max.vsize)) { > + (pos->w > pp->scale_max.vsize)) { > DRM_ERROR("out of scale size.\n"); > goto err_property; > } > } else { > if ((pos->w < pp->scale_min.hsize) || > - (sz->hsize > pp->scale_max.hsize) || > + (pos->w > pp->scale_max.hsize) || > (pos->h < pp->scale_min.vsize) || > - (sz->vsize > pp->scale_max.vsize)) { > + (pos->h > pp->scale_max.vsize)) { > DRM_ERROR("out of scale size.\n"); > goto err_property; > } > @@ -1676,6 +1684,15 @@ static int gsc_probe(struct platform_device *pdev) > dev_warn(dev, "failed to get system register.\n"); > ctx->sysreg = NULL; > } > + > + ret = of_property_read_u32(dev->of_node, "rot-max-hsize", > + &ctx->ippdrv.prop_list.rot_max.hsize); > + ret |= of_property_read_u32(dev->of_node, "rot-max-vsize", > + &ctx->ippdrv.prop_list.rot_max.vsize); > + if (ret) { > + dev_err(dev, "rot-max property should be provided by device tree.\n"); > + return -EINVAL; > + } > } > > /* clock control */ > diff --git a/include/uapi/drm/exynos_drm.h b/include/uapi/drm/exynos_drm.h > index cb3e9f9..d5d5518 100644 > --- a/include/uapi/drm/exynos_drm.h > +++ b/include/uapi/drm/exynos_drm.h > @@ -192,6 +192,7 @@ enum drm_exynos_planer { > * @crop_max: crop max resolution. > * @scale_min: scale min resolution. > * @scale_max: scale max resolution. > + * @rot_max: rotation max resolution. > */ > struct drm_exynos_ipp_prop_list { > __u32 version; > @@ -210,6 +211,7 @@ struct drm_exynos_ipp_prop_list { > struct drm_exynos_sz crop_max; > struct drm_exynos_sz scale_min; > struct drm_exynos_sz scale_max; > + struct drm_exynos_sz rot_max; > }; > > /** IMO maximum supported picture size should be hardcoded into driver, there is no need to add device tree properties for that. Please also check v4l2 driver for Exynos GSC. Currently it uses only one compatible - "exynos5-gsc", but imho You should simply replace it with "exynos5250-gsc" and "exynos5420-gsc", and add those variants with proper maximum supported size (2047 and 2016 respectively). Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland