• Matt Roper's avatar
    drm/xe: Avoid 64-bit register reads · 07431945
    Matt Roper authored
    Intel hardware officially only supports GTTMMADR register accesses of
    32-bits or less (although 64-bit accesses to device memory and PTEs in
    the GSM are fine).  Even though we do usually seem to get back
    reasonable values when performing readq() operations on registers in
    BAR0, we shouldn't rely on this violation of the spec working
    consistently.  It's likely that even when we do get proper register
    values back the hardware is internally satisfying the request via a
    non-atomic sequence of two 32-bit reads, which can be problematic for
    timestamps and counters if rollover of the lower bits is not considered.
    
    Replace xe_mmio_read64() with xe_mmio_read64_2x32() that implements
    64-bit register reads as two 32-bit reads and attempts to ensure that
    the upper dword has stabilized to avoid problematic rollovers for
    counter and timestamp registers.
    
    v2:
     - Move function from xe_mmio.h to xe_mmio.c.  (Lucas)
     - Convert comment to kerneldoc and note that it shouldn't be used on
       registers where reads may trigger side effects.  (Lucas)
    
    Bspec: 60027
    Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
    Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
    Link: https://lore.kernel.org/r/20230823003312.1356779-3-matthew.d.roper@intel.comSigned-off-by: default avatarMatt Roper <matthew.d.roper@intel.com>
    Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
    07431945
xe_mmio.c 15.3 KB