<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=utf-8">
<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;}
/* 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;}
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;
        font-family:"Calibri",sans-serif;}
@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: Srinivas, Vidya</p>
<p class="MsoPlainText">> Sent: Tuesday, April 17, 2018 8:17 AM</p>
<p class="MsoPlainText">> To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>; intel-gfx-</p>
<p class="MsoPlainText">> trybot@lists.freedesktop.org</p>
<p class="MsoPlainText">> Cc: Kamath, Sunil <sunil.kamath@intel.com>; Saarinen, Jani</p>
<p class="MsoPlainText">> <jani.saarinen@intel.com></p>
<p class="MsoPlainText">> Subject: RE: [PATCH v2 6/6] drm/i915: Do not do fb src adjustments for</p>
<p class="MsoPlainText">> NV12</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> > -----Original Message-----</p>
<p class="MsoPlainText">> > From: Maarten Lankhorst [<a href="mailto:maarten.lankhorst@linux.intel.com"><span style="color:windowtext;text-decoration:none">mailto:maarten.lankhorst@linux.intel.com</span></a>]</p>
<p class="MsoPlainText">> > Sent: Monday, April 16, 2018 8:00 PM</p>
<p class="MsoPlainText">> > To: Srinivas, Vidya <<a href="mailto:vidya.srinivas@intel.com"><span style="color:windowtext;text-decoration:none">vidya.srinivas@intel.com</span></a>>; intel-gfx-</p>
<p class="MsoPlainText">> > <a href="mailto:trybot@lists.freedesktop.org"><span style="color:windowtext;text-decoration:none">trybot@lists.freedesktop.org</span></a></p>
<p class="MsoPlainText">> > Cc: Kamath, Sunil <<a href="mailto:sunil.kamath@intel.com"><span style="color:windowtext;text-decoration:none">sunil.kamath@intel.com</span></a>>; Saarinen, Jani</p>
<p class="MsoPlainText">> > <<a href="mailto:jani.saarinen@intel.com"><span style="color:windowtext;text-decoration:none">jani.saarinen@intel.com</span></a>></p>
<p class="MsoPlainText">> > Subject: Re: [PATCH v2 6/6] drm/i915: Do not do fb src adjustments for</p>
<p class="MsoPlainText">> > NV12</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Hmm, more thought about src adjustments...</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Op 13-04-18 om 07:22 schreef Vidya Srinivas:</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">> > > Credits-to: 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">> > > 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 | 11 +++++++++++</p>
<p class="MsoPlainText">> > > drivers/gpu/drm/i915/intel_sprite.c  | 15 +++++++++++++++</p>
<p class="MsoPlainText">> > >  2 files changed, 26 insertions(+)</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 bc83f10..f64708f 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">> > > @@ -12978,6 +12978,10 @@ intel_check_primary_plane(struct</p>
<p class="MsoPlainText">> > intel_plane *plane,</p>
<p class="MsoPlainText">> > >      bool can_position = false;</p>
<p class="MsoPlainText">> > >      int ret;</p>
<p class="MsoPlainText">> > >      uint32_t pixel_format = 0;</p>
<p class="MsoPlainText">> > > +  struct drm_plane_state *plane_state = &state->base;</p>
<p class="MsoPlainText">> > > +  struct drm_rect *src = &plane_state->src;</p>
<p class="MsoPlainText">> > > +</p>
<p class="MsoPlainText">> > > +  *src = drm_plane_state_src(plane_state);</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > >      if (INTEL_GEN(dev_priv) >= 9) {</p>
<p class="MsoPlainText">> > >                      /* use scaler when colorkey is not required */ @@ -13001,6</p>
<p class="MsoPlainText">> > > +13005,13 @@ intel_check_primary_plane(struct intel_plane *plane,</p>
<p class="MsoPlainText">> > >      if (!state->base.fb)</p>
<p class="MsoPlainText">> > >                      return 0;</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > > +  if (pixel_format == DRM_FORMAT_NV12) {</p>
<p class="MsoPlainText">> > > +                  src->x1 = (((src->x1 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                  src->x2 = (((src->x2 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                  src->y1 = (((src->y1 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                  src->y2 = (((src->y2 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +  }</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > Lets reject non multiple of 4 coordinates for plane_state's src_x and</p>
<p class="MsoPlainText">> > src_y, and before adjustment also reject non multiple of 4</p>
<p class="MsoPlainText">> > src_w/src_h.fter that we can also reject clipping to the right/bottom</p>
<p class="MsoPlainText">> > edge of the screen, if the pipe_src_w/h is not a multiple of 4. That</p>
<p class="MsoPlainText">> > way an application trying to go beyond the screen.</p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> kms_plane_scaling and some other tests during execution generate lots of</p>
<p class="MsoPlainText">> non mult of 4 buffer width/height. All these tests will show fail in the IGT</p>
<p class="MsoPlainText">> BAT.</p>
<p class="MsoPlainText">> In some cases, even thought the width and height will be multiple of 4</p>
<p class="MsoPlainText">> before the Adjustment (say our 16x16 buffer), this after adjustment</p>
<p class="MsoPlainText">> becomes a 15 in intel_check_sprite_plane.</p>
<p class="MsoPlainText">> This again would cause underrun. If we reject non multiple of 4s in our</p>
<p class="MsoPlainText">> skl_update_scaler also, then even simple tests with 16x16 like rotation will</p>
<p class="MsoPlainText">> fail due to it getting adjusted.</p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:black">Example:<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">During kms_plane_scaling-with-rotation execution - print cooridinates here: src->x1, src->x2, src->y1, src->y2<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;background:yellow;mso-highlight:yellow">[   43.542044] [drm:intel_check_sprite_plane] *ERROR* Before adjust: 1040: 0 16 0 16<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black;background:yellow;mso-highlight:yellow">[   43.542054] [drm:intel_check_sprite_plane] *ERROR* After adjust: 1054: 0 15 0 15</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">[   43.542058] [drm:intel_check_sprite_plane] *ERROR* Before check plane surface: 1135: 0 15 0 15<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black;background:yellow;mso-highlight:yellow">[   43.570827] [drm:intel_cpu_fifo_underrun_irq_handler] *ERROR* CPU pipe A FIFO underrun</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">16x16 becomes 15x15 after rect adjustment in check_sprite_plane<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">During kms_plane_scaling-with-clipping-clamping – print coordinates here src->x1, src->x2, src->y1, src->y2<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">[  125.432029] [drm:intel_check_primary_plane] *ERROR* Before check plane state: 12998: 0 300 0 300<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black;background:yellow;mso-highlight:yellow">[  125.432041] [drm:intel_check_primary_plane] *ERROR* After check plane state: 13004: 0 257 0 159</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">[  128.057081] [drm:intel_cpu_fifo_underrun_irq_handler] *ERROR* CPU pipe A FIFO underrun<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">300x300 after primary plane clipping becomes 257 in check_primary_plane<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">All these generate fifo underruns. In the first example here, 16x16, before adjustment we check if it is multiplier<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">of 4, and since it is, we allow. But after rect_adjust it becomes 15x15<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">In example 2, clipping clamping, 300x300 is the value before clipping in primary plane, since it is a multiple of 4, we allow<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">But after clipping it becomes 257x159.<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"><o:p> </o:p></span></p>
<p class="MsoPlainText">> </p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > skl_check_plane_surface could do all the fixups and is allowed to</p>
<p class="MsoPlainText">> > return an error code, so we could put all SKL specific NV12 handling in</p>
<p class="MsoPlainText">> there.</p>
<p class="MsoPlainText">> > It doesn't matter that we calculate potentially illegal values, if we</p>
<p class="MsoPlainText">> > never program them and return -EINVAL there. If it turns out we've</p>
<p class="MsoPlainText">> > been too paranoid we could relax the condition.</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > This would mean unified handling for NV12 for primary and sprite. :)</p>
<p class="MsoPlainText">> ></p>
<p class="MsoPlainText">> > >      if (INTEL_GEN(dev_priv) >= 9) {</p>
<p class="MsoPlainText">> > >                      ret = skl_check_plane_surface(crtc_state, state);</p>
<p class="MsoPlainText">> > >                      if (ret)</p>
<p class="MsoPlainText">> > > diff --git a/drivers/gpu/drm/i915/intel_sprite.c</p>
<p class="MsoPlainText">> > > b/drivers/gpu/drm/i915/intel_sprite.c</p>
<p class="MsoPlainText">> > > index 8b7947d..c1dd85e 100644</p>
<p class="MsoPlainText">> > > --- a/drivers/gpu/drm/i915/intel_sprite.c</p>
<p class="MsoPlainText">> > > +++ b/drivers/gpu/drm/i915/intel_sprite.c</p>
<p class="MsoPlainText">> > > @@ -1035,11 +1035,20 @@ intel_check_sprite_plane(struct intel_plane</p>
<p class="MsoPlainText">> > *plane,</p>
<p class="MsoPlainText">> > >                                      return vscale;</p>
<p class="MsoPlainText">> > >                      }</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > > +                  if (fb->format->format == DRM_FORMAT_NV12) {</p>
<p class="MsoPlainText">> > > +                                  if (src->x2 >> 16 == 16)</p>
<p class="MsoPlainText">> > > +                                                  src->x2 = 16 << 16;</p>
<p class="MsoPlainText">> > > +                                  if (src->y2 >> 16 == 16)</p>
<p class="MsoPlainText">> > > +                                                  src->y2 = 16 << 16;</p>
<p class="MsoPlainText">> > This part doesn't look required, the magic below for the nv12 format</p>
<p class="MsoPlainText">> > is similar.. Just conditionally call adjust_size for format != NV12.</p>
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:black">This part is required only if we retain 16x16 buffer, Because after adjust_size it becomes<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">15x15 as I have mentioned above. Then our minimum criteria for NV12 fails and our igt buffer<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:black">As of now is 16x16. To get a IGT pass I had added this work around.<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">> > > +                                  goto nv12_min_no_clip;</p>
<p class="MsoPlainText">> > > +                  }</p>
<p class="MsoPlainText">> > > +</p>
<p class="MsoPlainText">> > >                      /* Make the source viewport size an exact multiple of the</p>
<p class="MsoPlainText">> > scaling factors. */</p>
<p class="MsoPlainText">> > >                      drm_rect_adjust_size(src,</p>
<p class="MsoPlainText">> > >                                                           drm_rect_width(dst) * hscale -</p>
<p class="MsoPlainText">> > drm_rect_width(src),</p>
<p class="MsoPlainText">> > >                                                           drm_rect_height(dst) * vscale -</p>
<p class="MsoPlainText">> > drm_rect_height(src));</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > > +nv12_min_no_clip:</p>
<p class="MsoPlainText">> > >                      drm_rect_rotate_inv(src, fb->width << 16, fb->height << 16,</p>
<p class="MsoPlainText">> > >                                                          state->base.rotation);</p>
<p class="MsoPlainText">> > ></p>
<p class="MsoPlainText">> > > @@ -1105,6 +1114,12 @@ intel_check_sprite_plane(struct intel_plane</p>
<p class="MsoPlainText">> > *plane,</p>
<p class="MsoPlainText">> > >                      src->x2 = (src_x + src_w) << 16;</p>
<p class="MsoPlainText">> > >                      src->y1 = src_y << 16;</p>
<p class="MsoPlainText">> > >                      src->y2 = (src_y + src_h) << 16;</p>
<p class="MsoPlainText">> > > +                  if (fb->format->format == DRM_FORMAT_NV12) {</p>
<p class="MsoPlainText">> > > +                                  src->x1 = (((src->x1 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                                  src->x2 = (((src->x2 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                                  src->y1 = (((src->y1 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                                  src->y2 = (((src->y2 >> 16)/4)*4) << 16;</p>
<p class="MsoPlainText">> > > +                  }</p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div>
</body>
</html>