<div dir="ltr"><div>Correction we just had 3 MMU faults, not 4.</div><div>The faults only occur when clip->y2 == 24, or clip->y2 == 27, but vSrc.height==768.</div><div><br></div><div>It is probably not clipping just 24 or 27 pixels, but trying instead to clip the full 768 height pixels.<br></div><div><br></div>The complete circumvent conditions for the faults are these ones...<br> if (clip->x2 == 1024 && clip->y2 == 24) {<br> syslog(LOG_ERR, "A: clip[x1=%d,y1=%d], vSrc[w=%d,h=%d], drawable[x=%d,y=%d], src_offset[x=%d,y=%d}\n", <br> clip->x1, clip->y1, vSrc->width, vSrc->height, drawable->x, drawable->y, src_offset.x, src_offset.y);<br> if (vSrc->height == 768) {<br> goto fallback;<br> }<br> }<br><br> if (clip->x2 == 1024 && clip->y2 == 27) {<br> syslog(LOG_ERR, "B: clip[x1=%d,y1=%d], vSrc[w=%d,h=%d], drawable[x=%d,y=%d], src_offset[x=%d,y=%d}\n", <br> clip->x1, clip->y1, vSrc->width, vSrc->height, drawable->x, drawable->y, src_offset.x, src_offset.y);<br> if (vSrc->height == 768) {<br> goto fallback;<br> }<br> }<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 3, 2017 at 10:45 AM, Luís Mendes <span dir="ltr"><<a href="mailto:luis.p.mendes@gmail.com" target="_blank">luis.p.mendes@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Hi Russel,<br><br></div>I was able to identify and circumvent the root cause of the MMU faults. We had 4 MMU faults, it seems.<br></div>Each one for each of these conditions:<br>Nov 3 10:26:26 picolo xf86_armada[1271]: A: clip[x1=0,y1=0], vSrc[w=1024,h=768], drawable[x=0,y=0], src_offset[x=0,y=0}<br>Nov 3 10:26:26 picolo xf86_armada[1271]: A: clip[x1=0,y1=0], vSrc[w=1024,h=768], drawable[x=0,y=0], src_offset[x=0,y=0}<br>Nov 3 10:26:29 picolo xf86_armada[1271]: B: clip[x1=0,y1=0], vSrc[w=1024,h=768], drawable[x=0,y=0], src_offset[x=0,y=0}<br>Nov 3 10:26:32 picolo xf86_armada[1271]: B: clip[x1=0,y1=0], vSrc[w=1024,h=27], drawable[x=0,y=0], src_offset[x=0,y=0}<br><br></div>The modified etnaviv_render.c - etnaviv_acquire_src(...), that is able to circumvent the MMU faults and generate the above log is this one (changes in bold):<span class=""><br>static struct etnaviv_pixmap *etnaviv_acquire_src(ScreenPtr pScreen,<br> PicturePtr pict, const BoxRec *clip, PixmapPtr *ppPixTemp,<br> xPoint *src_topleft, Bool force_vtemp)<br>{<br> struct etnaviv *etnaviv = etnaviv_get_screen_priv(<wbr>pScreen);<br> struct etnaviv_pixmap *vSrc, *vTemp;<br> struct etnaviv_blend_op copy_op;<br> DrawablePtr drawable;<br> uint32_t colour;<br> xPoint src_offset;<br> int tx, ty;<br><br></span> if (etnaviv_pict_solid_argb(pict, &colour)) {<br> vTemp = etnaviv_get_scratch_argb(<wbr>pScreen, ppPixTemp,<br> clip->x2, clip->y2);<br> if (!vTemp)<br> return NULL;<br><br> if (!etnaviv_fill_single(etnaviv, vTemp, clip, colour))<br> return NULL;<br><br> src_topleft->x = 0;<br> src_topleft->y = 0;<br> return vTemp;<br> }<br><br> drawable = pict->pDrawable;<br> vSrc = etnaviv_drawable_offset(<wbr>drawable, &src_offset);<br> if (!vSrc)<br> goto fallback;<br><br> if (vSrc->width < clip->x2 || vSrc->height < clip->y2)<br> goto fallback;<br><br> etnaviv_set_format(vSrc, pict);<br> if (!etnaviv_src_format_valid(<wbr>etnaviv, vSrc->pict_format))<br> goto fallback;<br><br> if (!transform_is_integer_<wbr>translation(pict->transform, &tx, &ty))<br> goto fallback;<br><br> if (picture_needs_repeat(pict, src_topleft->x + tx, src_topleft->y + ty,<br> clip->x2, clip->y2))<br> goto fallback;<br><br><br><br> src_topleft->x += drawable->x + src_offset.x + tx;<br> src_topleft->y += drawable->y + src_offset.y + ty;<br> if (force_vtemp) {<br> goto copy_to_vtemp;<br> }<br><br><b> if (clip->x2 == 1024 && clip->y2 == 24) {<br> syslog(LOG_ERR, "A: clip[x1=%d,y1=%d], vSrc[w=%d,h=%d], drawable[x=%d,y=%d], src_offset[x=%d,y=%d}\n", <br> clip->x1, clip->y1, vSrc->width, vSrc->height, drawable->x, drawable->y, src_offset.x, src_offset.y);<br> goto fallback;<br> }<br><br> if (clip->x2 == 1024 && clip->y2 == 27) {<br> syslog(LOG_ERR, "B: clip[x1=%d,y1=%d], vSrc[w=%d,h=%d], drawable[x=%d,y=%d], src_offset[x=%d,y=%d}\n", <br> clip->x1, clip->y1, vSrc->width, vSrc->height, drawable->x, drawable->y, src_offset.x, src_offset.y);<br> goto fallback;<br> }<br></b><br> return vSrc;<br> ...<span class=""><br><div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 3, 2017 at 9:12 AM, Luís Mendes <span dir="ltr"><<a href="mailto:luis.p.mendes@gmail.com" target="_blank">luis.p.mendes@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div>Hi Russell,<br><br></div>Great news! The issue we were getting with copyNtoN(...) is just a side effect of etnaviv_render.c - etnaviv_acquire_src().<br></div>The root cause of the MMU falts is etnaviv_render.c - etnaviv_acquire_src().<br><br></div>I have enabled copyNtoN(...), but made etnaviv_acquire_src(...) always go to fallback and now I am able to log into Ubuntu MATE without any MMU faults.</div><div>I will include debug logs and get back with them.<br></div><div><br> static struct etnaviv_pixmap *etnaviv_acquire_src(ScreenPtr pScreen,<br> PicturePtr pict, const BoxRec *clip, PixmapPtr *ppPixTemp,<br> xPoint *src_topleft, Bool force_vtemp)<br>{<br> struct etnaviv *etnaviv = etnaviv_get_screen_priv(pScree<wbr>n);<br> struct etnaviv_pixmap *vSrc, *vTemp;<br> struct etnaviv_blend_op copy_op;<br> DrawablePtr drawable;<br> uint32_t colour;<br> xPoint src_offset;<br> int tx, ty;<br><br> goto fallback;<br></div> ...<br><div class="gmail_extra"><br></div><div class="gmail_extra">Luis<br></div><div><div class="m_-6161596941864965168h5"><div class="gmail_extra"><br></div></div></div></div></blockquote></div></div></span></div>
</blockquote></div><br></div>