• Fei Yang's avatar
    drm/i915: use pat_index instead of cache_level · 9275277d
    Fei Yang authored
    Currently the KMD is using enum i915_cache_level to set caching policy for
    buffer objects. This is flaky because the PAT index which really controls
    the caching behavior in PTE has far more levels than what's defined in the
    enum. In addition, the PAT index is platform dependent, having to translate
    between i915_cache_level and PAT index is not reliable, and makes the code
    more complicated.
    
    From UMD's perspective there is also a necessity to set caching policy for
    performance fine tuning. It's much easier for the UMD to directly use PAT
    index because the behavior of each PAT index is clearly defined in Bspec.
    Having the abstracted i915_cache_level sitting in between would only cause
    more ambiguity. PAT is expected to work much like MOCS already works today,
    and by design userspace is expected to select the index that exactly
    matches the desired behavior described in the hardware specification.
    
    For these reasons this patch replaces i915_cache_level with PAT index. Also
    note, the cache_level is not completely removed yet, because the KMD still
    has the need of creating buffer objects with simple cache settings such as
    cached, uncached, or writethrough. For kernel objects, cache_level is used
    for simplicity and backward compatibility. For Pre-gen12 platforms PAT can
    have 1:1 mapping to i915_cache_level, so these two are interchangeable. see
    the use of LEGACY_CACHELEVEL.
    
    One consequence of this change is that gen8_pte_encode is no longer working
    for gen12 platforms due to the fact that gen12 platforms has different PAT
    definitions. In the meantime the mtl_pte_encode introduced specfically for
    MTL becomes generic for all gen12 platforms. This patch renames the MTL
    PTE encode function into gen12_pte_encode and apply it to all gen12. Even
    though this change looks unrelated, but separating them would temporarily
    break gen12 PTE encoding, thus squash them in one patch.
    
    Special note: this patch changes the way caching behavior is controlled in
    the sense that some objects are left to be managed by userspace. For such
    objects we need to be careful not to change the userspace settings.There
    are kerneldoc and comments added around obj->cache_coherent, cache_dirty,
    and how to bypass the checkings by i915_gem_object_has_cache_level. For
    full understanding, these changes need to be looked at together with the
    two follow-up patches, one disables the {set|get}_caching ioctl's and the
    other adds set_pat extension to the GEM_CREATE uAPI.
    
    Bspec: 63019
    
    Cc: Chris Wilson <chris.p.wilson@linux.intel.com>
    Signed-off-by: default avatarFei Yang <fei.yang@intel.com>
    Reviewed-by: default avatarAndi Shyti <andi.shyti@linux.intel.com>
    Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
    Signed-off-by: default avatarAndi Shyti <andi.shyti@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20230509165200.1740-3-fei.yang@intel.com
    9275277d
selftest_timeline.c 31.3 KB