Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932150AbdIGLZa (ORCPT ); Thu, 7 Sep 2017 07:25:30 -0400 Received: from mailout1.w1.samsung.com ([210.118.77.11]:45544 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755036AbdIGLZ2 (ORCPT ); Thu, 7 Sep 2017 07:25:28 -0400 X-AuditID: cbfec7f2-f793b6d000003243-9d-59b12ca436c6 MIME-version: 1.0 Content-type: text/plain; charset="utf-8"; format="flowed" Subject: Re: [PATCH 3/3] drm/exynos/gsc: Add rotation hardware limits of gscaler To: Hoegeun Kwon , Krzysztof Kozlowski , Inki Dae , sw0312.kim@samsung.com, airlied@linux.ie, kgene@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: <024ea0a3-abe7-4a87-7723-2e7341237df2@samsung.com> Date: Thu, 07 Sep 2017 13:25:22 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 In-reply-to: <1e8a7563-046b-82b1-6da9-2e883426edf7@samsung.com> Content-transfer-encoding: 8bit Content-language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPKsWRmVeSWpSXmKPExsWy7djPc7pLdDZGGiy6KmXRe+4kk8X7ZT2M FvOPnGO1uPL1PZvF++VdbBaT7k9gseh//JrZ4vz5DewWmx5fY7W4vGsOm8WM8/uYLJZev8hk 0br3CLvFjMkv2SxefjzB4sDvsWbeGkaPTas62Ty2f3vA6nG/+ziTx+Yl9R59W1YxenzeJBfA HsVlk5Kak1mWWqRvl8CVcbd9JWPBFt+Kay/vMTUw3nbqYuTkkBAwkTjQvYANwhaTuHBvPZDN xSEksJRRYtrULewQzmdGiYbOf4wwHfseb2QBsYUEljFKnPzIDWLzCghK/Jh8DyzOLGAl8exf KytE83NGiY+H1rCDJIQFgiQamr+CDRIR6GWSWP5UCKSIWWAVo8StWfPAEmwChhJdb7vYIKba SSyeegXMZhFQlXhz/zoTiC0qECPRfugmM4jNKWAv8WLdfEaIzfISB688h7pCXKK59SYLyAIJ gUXsEvv2PmSFeMFFYvq2pywQtrDEq+Nb2CFsGYnLk7uh4v2MEk2t2hD2DEaJc295IWxricPH L7JCLOCTmLRtOtARHEBxXomONiGIEg+J63c+M0HYjhJNM+dAw/QHk8TG/oWsExjlZyGF2Cyk EJuF5IdZSH5YwMiyilEktbQ4Nz212FivODG3uDQvXS85P3cTIzCZnf53/NMOxq8nrA4xCnAw KvHwNkhviBRiTSwrrsw9xCjBwawkwiujvTFSiDclsbIqtSg/vqg0J7X4EKM0B4uSOK9tVFuk kEB6YklqdmpqQWoRTJaJg1OqgTG3euabWu/zT9/JLl/wKcTv16udm462P1orbMBYc3Px8ard 3Ab5HTJ8ysmrlvz59HDf1I/mK7LDVz80mlPi+2/C19fhbAbKcT6ySeFPeUS3vRZp3vqpa6+a 76kPqhd1dMsvq6VcKLMM/Lo1onL2jc6ZgkwTXLK/Vn1gdNGwvOjfeIzfqOv4wh4lluKMREMt 5qLiRABsnTRZYgMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGIsWRmVeSWpSXmKPExsVy+t/xq7qLdTZGGmy6YG3Re+4kk8X7ZT2M FvOPnGO1uPL1PZvF++VdbBaT7k9gseh//JrZ4vz5DewWmx5fY7W4vGsOm8WM8/uYLJZev8hk 0br3CLvFjMkv2SxefjzB4sDvsWbeGkaPTas62Ty2f3vA6nG/+ziTx+Yl9R59W1YxenzeJBfA HsVlk5Kak1mWWqRvl8CVcbd9JWPBFt+Kay/vMTUw3nbqYuTkkBAwkdj3eCMLhC0mceHeerYu Ri4OIYEljBLbth9hBEnwCghK/Jh8D6yIWcBM4svLw6wgtpDAc0aJA81xILawQIDEwUMHwZpF BPqZJF7fm8gE4jALrGKUmPvxKSvE2B9MEidvzmYCaWETMJToetvFBrHCTmLx1CtgNouAqsSb +9fBakQFYiR+XnoEtppTwF7ixbr5jBBnyEscvPIc6iRxiebWmywTGAVnIbl2FpJrZyFpmYWk ZQEjyypGkdTS4tz03GIjveLE3OLSvHS95PzcTYzA2Nt27OeWHYxd74IPMQpwMCrx8Cb8Xx8p xJpYVlyZe4hRgoNZSYRXRntjpBBvSmJlVWpRfnxRaU5q8SFGaQ4WJXHe3j2rI4UE0hNLUrNT UwtSi2CyTBycUg2M9pfFvCZtcdxz/tWH3nS/XM4nCfH9OVbaP7/+Ntrf1X3r3vobfPs+aEnJ 7e6duaSI6a3usyNBv7aKOs30F85JWhs8zUeAn3NirOLMt1tKba99jT7dd1TFbX7F1PNOMrtm mkyZeEbhxKbUiTk7dYUYn08oCiiTeqdc5S11QZeZIz5srwyvnAOzEktxRqKhFnNRcSIAc0IZ XbkCAAA= X-CMS-MailID: 20170907112524eucas1p1baaf5df96104bce261bcef6465e9157e 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> <10747c31-55fc-6464-eb00-99da6d66fca6@samsung.com> <7e628ff8-82be-a295-90fa-8f547a541cb3@samsung.com> <1e8a7563-046b-82b1-6da9-2e883426edf7@samsung.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9685 Lines: 221 Hi Hoegeun, On 2017-09-07 07:16, Hoegeun Kwon wrote: > On 09/04/2017 03:19 PM, Hoegeun Kwon wrote: >> On 09/01/2017 04:31 PM, Marek Szyprowski wrote: >>> 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 >> >> Hi Krzysztof and Marek, >> >> Thanks Krzysztof and Marek reviews. >> >> As Marek says, rot_max size will be hardcoded into driver, >> then it will not break the ABI. And also, >> I will check the v4l2 driver for Exynos GSC. >> >> Best regards, >> Hoegeun >> > > Hi Marek, > > I have checked v4l2 driver for Exynos GSC. The v4l2 driver supports > Exynos 5250 and 5433 GSC. Currently, the hardware limits rotation is > set to 2047 in the v4l2 driver. > V4l2 GSC driver also supports Exynos5420/5422 SoCs, see # git grep "samsung,exynos5-gsc" arch/arm/boot/dts/ > In my opinion don't need to fix it, because the Exynos 5250 has a > hardware rotation limits of 2048 and the Exynos 5250 has a hardware > rotation limits of 2047. Like you pointed earlier, Exynos 5420/5422/5800 supports rotation only up to 2016x2016, so additional patch for v4l2 is also needed. > > Please tell me if you have any other opinion. > Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland