<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    Hi Cong,<br>
    <br>
    when I understand Robin correctly all mapping (host, guest, kernel,
    userspace etc..) must have the same caching attributes unless you
    use the S2FWB feature introduced with Armv8.4.<br>
    <br>
    If you don't follow those rules you usually run into coherency
    issues or even worse system hangs. So you not only need to adjust
    the kernel mappings, but also the function for userspace mappings to
    follow those rules.<br>
    <br>
    Additional to that I think I read Robin correctly that mapping the
    resource write combined should be sufficient to solve your problem.
    So I suggest to use that instead.<br>
    <br>
    On the other hand if you manage to fix this completely for arm64 by
    updating all the places to use cached mappings I'm fine with it as
    well. It's then up to Dave to decide if that's something we want
    because QXL is intentionally emulating a hardware device as far as I
    know.<br>
    <br>
    Regards,<br>
    Christian.<br>
    <br>
    <div class="moz-cite-prefix">Am 24.03.22 um 08:04 schrieb
      <a class="moz-txt-link-abbreviated" href="mailto:liucong2@kylinos.cn">liucong2@kylinos.cn</a>:<br>
    </div>
    <blockquote type="cite" cite="mid:2n05d7wxagz-2n05d7wxah0@nsmail6.0">
      
      <p>Hi Christian,</p>
      <p><br>
      </p>
      <p>Can you help explain more detail under what circumstances
        userspace mapping</p>
      <p>will be problematic, you mean cached mappings also need
        adjustment in</p>
      <p>function ttm_prot_from_caching?</p>
      <p><br>
      </p>
      <p>Regards,</p>
      <p>Cong.</p>
      <div id="re" style="margin-left:0.5em;padding-left:0.5em;border-left:1px
        solid green;"><br>
        <br>
        <br>
               
        <div style="background-color:#f5f7fa"><b>主 题:</b><span id="subject">Re: 回复: Re: 回复: Re: [PATCH v1 1/2] drm/qxl:
            replace ioremap by ioremap_cache on arm64</span>            <br>
          <b>日 期:</b><span id="date">2022-03-23 18:17</span>            <br>
          <b>发件人:</b><span id="from">Christian König</span>            <br>
          <b>收件人:</b><span id="to"><a class="moz-txt-link-abbreviated" href="mailto:liucong2@kylinos.cnairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org">liucong2@kylinos.cnairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org</a></span>
                             </div>
        <br>
               
        <div id="content">
          <div class="viewer_part">
            <div>Hi Cong,<br>
                 <br>
                 yes I've seen that, but that is still not sufficient.<br>
                 <br>
                 You need to update the check in ttm_module.c as well or
              otherwise    your userspace mapping might not work
              correctly either.<br>
                 <br>
                 Regards,<br>
                 Christian. <br>
                 <br>
                 
              <div class="moz-cite-prefix">Am 23.03.22 um 11:00 schrieb
                     <a class="moz-txt-link-abbreviated
                  moz-txt-link-freetext" href="mailto:liucong2@kylinos.cn" moz-do-not-send="true">liucong2@kylinos.cn</a>:<br>
                   </div>
              <blockquote type="cite" cite="mid:odhwkkfdf7-odj6iduf90@nsmail6.0">   <br>
                     
                <p>Hi <span style="background-color: rgb(245, 247,
                    250);">Christian,</span></p>
                <p><br>
                       </p>
                <p>another commit fix the case in ttm. I send two
                  patches at the        same time, but seems I miss</p>
                <p> '--cover-letter' when run format-patch or some other
                  bad        operation.</p>
                <p>----</p>
                <div id="cs2c_mail_sigature">
                  <p><br>
                           </p>
                  <p>Regards,</p>
                  <p>Cong.</p>
                </div>
                <div id="re" style="margin-left:0.5em;padding-left:0.5em;border-left:1px
                  solid green;"><br>
                         <br>
                         <br>
                                
                  <div style="background-color:#f5f7fa"><b>主 题:</b><span id="subject">Re: 回复: Re: [PATCH v1 1/2] drm/qxl:
                      replace            ioremap by ioremap_cache on
                      arm64</span>            <br>
                             <b>日 期:</b><span id="date">2022-03-23 17:34</span>
                               <br>
                             <b>发件人:</b><span id="from">Christian König</span>
                               <br>
                             <b>收件人:</b><span id="to"><a class="moz-txt-link-abbreviated
                        moz-txt-link-freetext" href="mailto:liucong2@kylinos.cnairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org" moz-do-not-send="true">liucong2@kylinos.cnairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org</a></span>
                                                </div>
                  <br>
                                
                  <div id="content">
                    <div class="viewer_part">
                      <div>Hi Cong,<br>
                                        <br>
                                        well than Dave must decide what
                        to do here.<br>
                                        <br>
                                        When QXL emulates a device it
                        should also not use              memory accesses
                           which won't work on a physical device.<br>
                                        <br>
                                        BTW: Your patch is really buggy,
                        it misses the cases in              ttm_module.c<br>
                                        <br>
                                        Regards,<br>
                                        Christian.<br>
                                        <br>
                                        
                        <div class="moz-cite-prefix">Am 23.03.22 um
                          09:48 schrieb                     <a class="moz-txt-link-abbreviated
                            moz-txt-link-freetext" href="mailto:liucong2@kylinos.cn" moz-do-not-send="true">liucong2@kylinos.cn</a>:<br>
                                            </div>
                        <blockquote type="cite" cite="mid:18a8ijpwp6j-18a9shjbr0c@nsmail6.0">
                          <p>Hi Christian,</p>
                          <p><br>
                                                  </p>
                          <p>according to 'Arm Architecture Reference
                            Manual                  Armv8,for      
                             Armv8-A</p>
                          <p>architecture profile' pdf E2.6.5</p>
                          <p><br>
                                                  </p>
                          <p>E2.6.5 Generation of Alignment faults by
                            load/store                  multiple      
                             accesses to</p>
                          <p> Device memory</p>
                          <p><br>
                                                  </p>
                          <p><span style="white-space:pre">       </span>When
                                             FEAT_LSMAOC is      
                             implemented and the value of the          
                                   applicable nTLSMD</p>
                          <p><span style="white-space:pre">       </span>field
                            is 0, any                  memory      
                             access by an AArch32 Load Multiple or      
                                       Store </p>
                          <p><span style="white-space:pre">       </span>Multiple
                                             instruction to        an
                            address that the stage 1                
                             translation </p>
                          <p><span style="white-space:pre">       </span>assigns
                            as                  Device-nGRE,      
                             Device-nGnRE, or Device-nGnRnE            
                                 generates </p>
                          <p><span style="white-space: pre;">     </span>an
                            Alignment                  fault.</p>
                          <br>
                                              
                          <p>so it seems not just some ARM boards
                            doesn't allow                  unaligned    
                               access to MMIO </p>
                          <p>space, all pci memory mapped
                            as Device-nGnRE in arm64                
                             cannot        support</p>
                          <p>unaligned access. and qxl is a
                            device simulated by                  qemu,
                            it        should be able to access </p>
                          <p>to MMIO space in a more flexible
                            way(PROT_NORMAL)                  than the
                            real        physical </p>
                          <p>graphics card.</p>
                          <p><br>
                                                  </p>
                          <p>----</p>
                          <p><br>
                                                  </p>
                          <p><br>
                                                  </p>
                          <p>Cong.<br>
                                                  </p>
                          <p><br>
                                                  </p>
                          <p><br>
                                                    <br>
                                                    <br>
                                                           </p>
                          <p><strong>主 题:</strong><span id="subject">Re:
                              [PATCH v1                    1/2]        
                               drm/qxl: replace ioremap by              
                                   ioremap_cache on arm64</span>        
                                      <br>
                                                    <strong>日 期:</strong><span id="date">2022-03-23                  
                               15:15</span>                   <br>
                                                    <strong>发件人:</strong><span id="from">Christian                  
                               König</span>                   <br>
                                                    <strong>收件人:</strong><span id="to">Cong<a class="moz-txt-link-abbreviated
                                moz-txt-link-freetext" href="mailto:Liuairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org" moz-do-not-send="true">Liuairlied@redhat.comkraxel@redhat.comairlied@linux.iedaniel@ffwll.chray.huang@amd.comvirtualization@lists.linux-foundation.orgspice-devel@lists.freedesktop.orgdri-devel@lists.freedesktop.org</a></span>
                                                                       </p>
                          <p><br>
                                                           </p>
                          <p>Am 22.03.22 um 10:34 schrieb Cong Liu:<br>
                                                    > qxl use ioremap
                            to map ram_header and rom,                
                             in the arm64        implementation,<br>
                                                    > the device is
                            mapped as DEVICE_nGnRE, it                
                             can not support        unaligned<br>
                                                    > access.<br>
                                                    <br>
                                                    Well that some ARM
                            boards doesn't allow                
                             unaligned access to MMIO        space <br>
                                                    is a well known bug
                            of those ARM boards.<br>
                                                    <br>
                                                    So as far as I know
                            this is a hardware bug you                
                             are trying to        workaround <br>
                                                    here and I'm not
                            100% sure that this is                
                             correct.<br>
                                                    <br>
                                                    Christian.<br>
                                                    <br>
                                                    ><br>
                                                    >    6.620515] pc
                            : setup_hw_slot+0x24/0x60                
                             [qxl]<br>
                                                    > [    6.620961]
                            lr : setup_slot+0x34/0xf0                
                             [qxl]<br>
                                                    > [    6.621376]
                            sp : ffff800012b73760<br>
                                                    > [    6.621701]
                            x29: ffff800012b73760 x28:                
                             0000000000000001        x27:
                            0000000010000000<br>
                                                    > [    6.622400]
                            x26: 0000000000000001 x25:                
                             0000000004000000        x24:
                            ffffcf376848c000<br>
                                                    > [    6.623099]
                            x23: ffff0000c4087400 x22:                
                             ffffcf3718e17140        x21:
                            0000000000000000<br>
                                                    > [    6.623823]
                            x20: ffff0000c4086000 x19:                
                             ffff0000c40870b0        x18:
                            0000000000000014<br>
                                                    > [    6.624519]
                            x17: 000000004d3605ab x16:                
                             00000000bb3b6129        x15:
                            000000006e771809<br>
                                                    > [    6.625214]
                            x14: 0000000000000001 x13:                
                             007473696c5f7974        x12:
                            696e696666615f65<br>
                                                    > [    6.625909]
                            x11: 00000000d543656a x10:                
                             0000000000000000        x9 :
                            ffffcf3718e085a4<br>
                                                    > [    6.626616]
                            x8 : 00000000006c7871 x7 :                
                             000000000000000a        x6 :
                            0000000000000017<br>
                                                    > [    6.627343]
                            x5 : 0000000000001400 x4 :                
                             ffff800011f63400        x3 :
                            0000000014000000<br>
                                                    > [    6.628047]
                            x2 : 0000000000000000 x1 :                
                             ffff0000c40870b0        x0 :
                            ffff0000c4086000<br>
                                                    > [    6.628751]
                            Call trace:<br>
                                                    > [    6.628994]
                             setup_hw_slot+0x24/0x60                
                             [qxl]<br>
                                                    > [    6.629404]
                             setup_slot+0x34/0xf0 [qxl]<br>
                                                    > [    6.629790]
                                           
                              qxl_device_init+0x6f0/0x7f0 [qxl]<br>
                                                    > [    6.630235]
                             qxl_pci_probe+0xdc/0x1d0                
                             [qxl]<br>
                                                    > [    6.630654]
                             local_pci_probe+0x48/0xb8<br>
                                                    > [    6.631027]
                                           
                              pci_device_probe+0x194/0x208<br>
                                                    > [    6.631464]
                             really_probe+0xd0/0x458<br>
                                                    > [    6.631818]
                                           
                              __driver_probe_device+0x124/0x1c0<br>
                                                    > [    6.632256]
                                           
                              driver_probe_device+0x48/0x130<br>
                                                    > [    6.632669]
                             __driver_attach+0xc4/0x1a8<br>
                                                    > [    6.633049]
                             bus_for_each_dev+0x78/0xd0<br>
                                                    > [    6.633437]
                             driver_attach+0x2c/0x38<br>
                                                    > [    6.633789]
                             bus_add_driver+0x154/0x248<br>
                                                    > [    6.634168]
                             driver_register+0x6c/0x128<br>
                                                    > [    6.635205]
                                           
                              __pci_register_driver+0x4c/0x58<br>
                                                    > [    6.635628]
                             qxl_init+0x48/0x1000 [qxl]<br>
                                                    > [    6.636013]
                             do_one_initcall+0x50/0x240<br>
                                                    > [    6.636390]
                             do_init_module+0x60/0x238<br>
                                                    > [    6.636768]
                             load_module+0x2458/0x2900<br>
                                                    > [    6.637136]
                                           
                              __do_sys_finit_module+0xbc/0x128<br>
                                                    > [    6.637561]
                                           
                              __arm64_sys_finit_module+0x28/0x38<br>
                                                    > [    6.638004]
                             invoke_syscall+0x74/0xf0<br>
                                                    > [    6.638366]
                                           
                              el0_svc_common.constprop.0+0x58/0x1a8<br>
                                                    > [    6.638836]
                             do_el0_svc+0x2c/0x90<br>
                                                    > [    6.639216]
                             el0_svc+0x40/0x190<br>
                                                    > [    6.639526]
                                           
                              el0t_64_sync_handler+0xb0/0xb8<br>
                                                    > [    6.639934]
                             el0t_64_sync+0x1a4/0x1a8<br>
                                                    > [    6.640294]
                            Code: 910003fd f9484804                
                             f9400c23 8b050084        (f809c083)<br>
                                                    > [    6.640889]
                            ---[ end trace                
                             95615d89b7c87f95 ]---<br>
                                                    ><br>
                                                    > Signed-off-by:
                            Cong Liu<liucong2@kylinos.cn><br>
                                                          > ---<br>
                                                          >  
                              drivers/gpu/drm/qxl/qxl_kms.c | 10        
                                         ++++++++++<br>
                                                          >   1 file
                              changed, 10 insertions(+)<br>
                                                          ><br>
                                                          > diff
                              --git                  
                               a/drivers/gpu/drm/qxl/qxl_kms.c          
                                             
                                b/drivers/gpu/drm/qxl/qxl_kms.c<br>
                                                          > index
                              4dc5ad13f12c..0e61ac04d8ad                
                                 100644<br>
                                                          > ---
                              a/drivers/gpu/drm/qxl/qxl_kms.c<br>
                                                          > +++
                              b/drivers/gpu/drm/qxl/qxl_kms.c<br>
                                                          > @@ -165,7
                              +165,11 @@ int                  
                               qxl_device_init(struct        
                               qxl_device *qdev,<br>
                                                          >  
                              (int)qdev->surfaceram_size /          
                                       1024,<br>
                                                          >   (sb ==
                              4) ? "64bit" : "32bit");<br>
                                                          >   <br>
                                                          > +#ifdef
                              CONFIG_ARM64<br>
                                                          > +
                              qdev->rom =                  
                               ioremap_cache(qdev->rom_base,        
                                                  qdev->rom_size);<br>
                                                          > +#else<br>
                                                          >  
                              qdev->rom =                  
                               ioremap(qdev->rom_base,              
                                            qdev->rom_size);<br>
                                                          > +#endif<br>
                                                          >   if
                              (!qdev->rom) {<br>
                                                          >  
                              pr_err("Unable to ioremap ROM\n");<br>
                                                          >   r =
                              -ENOMEM;<br>
                                                          > @@ -183,9
                              +187,15 @@ int                  
                               qxl_device_init(struct        
                               qxl_device *qdev,<br>
                                                          >   goto
                              rom_unmap;<br>
                                                          >   }<br>
                                                          >   <br>
                                                          > +#ifdef
                              CONFIG_ARM64<br>
                                                          > +
                              qdev->ram_header =                  
                               ioremap_cache(qdev->vram_base        
                               +<br>
                                                          > +        
                                         
                               qdev->rom->ram_header_offset,<br>
                                                          > +  
                              sizeof(*qdev->ram_header));<br>
                                                          > +#else<br>
                                                          >  
                              qdev->ram_header =                  
                               ioremap(qdev->vram_base +<br>
                                                          >          
                                         
                               qdev->rom->ram_header_offset,<br>
                                                          >    
                              sizeof(*qdev->ram_header));<br>
                                                          > +#endif<br>
                                                          >   if
                              (!qdev->ram_header) {<br>
                                                          >  
                              DRM_ERROR("Unable to ioremap RAM          
                                       header\n");<br>
                                                          >   r =
                              -ENOMEM;<br>
                                                          <br>
                                                        </liucong2@kylinos.cn></p>
                        </blockquote>
                        <br>
                                      </div>
                    </div>
                  </div>
                </div>
              </blockquote>
              <br>
               </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>