<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 129.75pt 72.0pt 129.7pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><a name="_MailEndCompose"><o:p> </o:p></a></p>
<p class="MsoPlainText"><a name="_____replyseparator"></a>> -----Original Message-----</p>
<p class="MsoPlainText">> From: Ville Syrjälä [mailto:ville.syrjala@linux.intel.com]</p>
<p class="MsoPlainText">> Sent: Thursday, April 19, 2018 12:06 AM</p>
<p class="MsoPlainText">> To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com></p>
<p class="MsoPlainText">> Cc: Srinivas, Vidya <vidya.srinivas@intel.com>; intel-</p>
<p class="MsoPlainText">> gfx@lists.freedesktop.org</p>
<p class="MsoPlainText">> Subject: Re: [Intel-gfx] [PATCH v4 6/6] drm/i915: Add</p>
<p class="MsoPlainText">> skl_check_nv12_surface for NV12</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> On Wed, Apr 18, 2018 at 08:06:57PM +0200, Maarten Lankhorst wrote:</p>
<p class="MsoPlainText">> > Op 18-04-18 om 17:32 schreef Ville Syrjälä:</p>
<p class="MsoPlainText">> > > On Wed, Apr 18, 2018 at 09:38:13AM +0530, Vidya Srinivas wrote:</p>
<p class="MsoPlainText">> > >> From: Maarten Lankhorst <<a href="mailto:maarten.lankhorst@linux.intel.com"><span style="color:windowtext;text-decoration:none">maarten.lankhorst@linux.intel.com</span></a>></p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> We skip src trunction/adjustments for</p>
<p class="MsoPlainText">> > >> NV12 case and handle the sizes directly.</p>
<p class="MsoPlainText">> > >> Without this, pipe fifo underruns are seen on APL/KBL.</p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> v2: For NV12, making the src coordinates multiplier of 4</p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> v3: Moving all the src coords handling code for NV12 to</p>
<p class="MsoPlainText">> > >> skl_check_nv12_surface</p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> Signed-off-by: Maarten Lankhorst</p>
<p class="MsoPlainText">> > >> <<a href="mailto:maarten.lankhorst@linux.intel.com"><span style="color:windowtext;text-decoration:none">maarten.lankhorst@linux.intel.com</span></a>></p>
<p class="MsoPlainText">> > >> Signed-off-by: Vidya Srinivas <<a href="mailto:vidya.srinivas@intel.com"><span style="color:windowtext;text-decoration:none">vidya.srinivas@intel.com</span></a>></p>
<p class="MsoPlainText">> > >> ---</p>
<p class="MsoPlainText">> > >>  drivers/gpu/drm/i915/intel_display.c | 39</p>
<p class="MsoPlainText">> > >> ++++++++++++++++++++++++++++++++++++</p>
<p class="MsoPlainText">> > >>  drivers/gpu/drm/i915/intel_sprite.c  | 15 ++++++++++----</p>
<p class="MsoPlainText">> > >>  2 files changed, 50 insertions(+), 4 deletions(-)</p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> diff --git a/drivers/gpu/drm/i915/intel_display.c</p>
<p class="MsoPlainText">> > >> b/drivers/gpu/drm/i915/intel_display.c</p>
<p class="MsoPlainText">> > >> index 925402e..b8dbaca 100644</p>
<p class="MsoPlainText">> > >> --- a/drivers/gpu/drm/i915/intel_display.c</p>
<p class="MsoPlainText">> > >> +++ b/drivers/gpu/drm/i915/intel_display.c</p>
<p class="MsoPlainText">> > >> @@ -3118,6 +3118,42 @@ static int skl_check_main_surface(const</p>
<p class="MsoPlainText">> struct intel_crtc_state *crtc_state,</p>
<p class="MsoPlainText">> > >>  return 0;</p>
<p class="MsoPlainText">> > >>  }</p>
<p class="MsoPlainText">> > >></p>
<p class="MsoPlainText">> > >> +static int</p>
<p class="MsoPlainText">> > >> +skl_check_nv12_surface(const struct intel_crtc_state *crtc_state,</p>
<p class="MsoPlainText">> > >> +                                       struct intel_plane_state *plane_state) {</p>
<p class="MsoPlainText">> > >> +                int crtc_x2 = plane_state->base.crtc_x + plane_state->base.crtc_w;</p>
<p class="MsoPlainText">> > >> +                int crtc_y2 = plane_state->base.crtc_y +</p>
<p class="MsoPlainText">> > >> +plane_state->base.crtc_h;</p>
<p class="MsoPlainText">> > >> +</p>
<p class="MsoPlainText">> > >> +                if (((plane_state->base.src_x >> 16) % 4) != 0 ||</p>
<p class="MsoPlainText">> > >> +                    ((plane_state->base.src_y >> 16) % 4) != 0 ||</p>
<p class="MsoPlainText">> > >> +                    ((plane_state->base.src_w >> 16) % 4) != 0 ||</p>
<p class="MsoPlainText">> > >> +                    ((plane_state->base.src_h >> 16) % 4) != 0) {</p>
<p class="MsoPlainText">> > >> +                                DRM_DEBUG_KMS("src coords must be multiple of 4 for</p>
<p class="MsoPlainText">> NV12\n");</p>
<p class="MsoPlainText">> > >> +                                return -EINVAL;</p>
<p class="MsoPlainText">> > >> +                }</p>
<p class="MsoPlainText">> > > I don't really see why we should check these. The clipped</p>
<p class="MsoPlainText">> > > coordinates are what matters.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > To propagate our limits to the userspace. I think we should do it for</p>
<p class="MsoPlainText">> > all formats, but NV12 is the first YUV format we have tests for. If we</p>
<p class="MsoPlainText">> > could we should do something similar for the other YUV formats, but they</p>
<p class="MsoPlainText">> have different requirements.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > In case of NV12 we don't have existing userspace, there will be</p>
<p class="MsoPlainText">> > nothing that breaks if we enforce limits from the start.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> But what about sub-pixel coordinates? You're totally ignoring them here.</p>
<p class="MsoPlainText">> We need to come up with some proper rules for this stuff.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > >> +</p>
<p class="MsoPlainText">> > >> +                /* Clipping would cause a 1-3 pixel gap at the edge of the screen? */</p>
<p class="MsoPlainText">> > >> +                if ((crtc_x2 > crtc_state->pipe_src_w && crtc_state->pipe_src_w %</p>
<p class="MsoPlainText">> 4) ||</p>
<p class="MsoPlainText">> > >> +                    (crtc_y2 > crtc_state->pipe_src_h && crtc_state->pipe_src_h % 4))</p>
<p class="MsoPlainText">> {</p>
<p class="MsoPlainText">> > >> +                                DRM_DEBUG_KMS("It's not possible to clip %u,%u to</p>
<p class="MsoPlainText">> %u,%u\n",</p>
<p class="MsoPlainText">> > >> +                                                      crtc_x2, crtc_y2,</p>
<p class="MsoPlainText">> > >> +                                                      crtc_state->pipe_src_w, crtc_state->pipe_src_h);</p>
<p class="MsoPlainText">> > >> +                                return -EINVAL;</p>
<p class="MsoPlainText">> > >> +                }</p>
<p class="MsoPlainText">> > > Why should we care? The current code already plays it fast and loose</p>
<p class="MsoPlainText">> > > and allows the dst rectangle to shrink to accomodate the hw limits.</p>
<p class="MsoPlainText">> > > If we want to change that we should change it universally.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Unfortunately for the other formats we already have an existing</p>
<p class="MsoPlainText">> > userspace</p>
<p class="MsoPlainText">> > (X.org) that doesn't perform any validation. We can't change it for</p>
<p class="MsoPlainText">> > that, but we can prevent future mistakes.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> We should do it uniformly. Not per-format. That will make the code</p>
<p class="MsoPlainText">> unmaintainable real quick.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > >> +</p>
<p class="MsoPlainText">> > >> +                plane_state->base.src.x1 =</p>
<p class="MsoPlainText">> > >> +                                DIV_ROUND_CLOSEST(plane_state->base.src.x1, 1 << 18) <<</p>
<p class="MsoPlainText">> 18;</p>
<p class="MsoPlainText">> > >> +                plane_state->base.src.x2 =</p>
<p class="MsoPlainText">> > >> +                                DIV_ROUND_CLOSEST(plane_state->base.src.x2, 1 << 18) <<</p>
<p class="MsoPlainText">> 18;</p>
<p class="MsoPlainText">> > >> +                plane_state->base.src.y1 =</p>
<p class="MsoPlainText">> > >> +                                DIV_ROUND_CLOSEST(plane_state->base.src.y1, 1 << 18) <<</p>
<p class="MsoPlainText">> 18;</p>
<p class="MsoPlainText">> > >> +                plane_state->base.src.y2 =</p>
<p class="MsoPlainText">> > >> +                                DIV_ROUND_CLOSEST(plane_state->base.src.y2, 1 << 18) <<</p>
<p class="MsoPlainText">> 18;</p>
<p class="MsoPlainText">> > > Since this can now increase the size of the source rectangle our</p>
<p class="MsoPlainText">> > > scaling factor checks are no longer 100% valid. We might end up with</p>
<p class="MsoPlainText">> > > a scaling factor that is too high.</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > > I don't really like any of these "let's make NV12 behave special"</p>
<p class="MsoPlainText">> > > tricks. We should make the code behave the same way for all pixel</p>
<p class="MsoPlainText">> > > formats instead of adding format specific hacks.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > This is not nivalid because we restrict the original src coordinates</p>
<p class="MsoPlainText">> > to be a multiple of 4, you can only clip to something smaller, not to</p>
<p class="MsoPlainText">> > something bigger. :)</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> The clipped coordinates can be whatever thanks to scaling/etc.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> Also why are we trying to make everything a multiple of four? I don't</p>
<p class="MsoPlainText">> remember any hw restrictions like that.</p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:black">Hi<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:3.0pt;margin-bottom:6.0pt;margin-left:0cm">
<span style="color:black">As per WA1106, </span><span style="font-size:10.0pt;font-family:"Segoe UI",sans-serif">Display corruption/color shift observed when using NV12 with 270 rotation or 90 rotation + horizontal flip.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-size:10.0pt;font-family:"Segoe UI",sans-serif">WA: NV12 with 270 rotation or 90 rotation + horizontal flip requires the programmed plane height to be a multiple of 4.</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:black">As per experiments on APL and KBL, when we don’t keep them multiple of 4, we see fifo underruns.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:black">Regards<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">Vidya<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> --</p>
<p class="MsoPlainText">> Ville Syrjälä</p>
<p class="MsoPlainText">> Intel</p>
</div>
</body>
</html>