drm/xe/display: Avoid calling readq()
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 19 Jan 2024 00:16:10 +0000 (16:16 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Fri, 19 Jan 2024 21:08:53 +0000 (13:08 -0800)
readq() is not available in 32bits and i915_gem_object_read_from_page()
is supposed to allow reading arbitrary sizes determined by the `size`
argument. Currently the only caller only passes a size == 8 so the
second problem is not that big. Migrate to calling
memcpy()/memcpy_fromio() to allow possible changes in the display side
and to fix the build on 32b architectures.

v2: Use memcpy/memcpy_fromio directly rather than using iosys-map with
    the same size == 8 bytes restriction (Matt Roper)

Fixes: 44e694958b95 ("drm/xe/display: Implement display support")
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240119001612.2991381-4-lucas.demarchi@intel.com
drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object.h

index 5f19550cc845360ada430477180405fe66bf84b9..68d9f6116bdfc3522ee5d6d94ef2bb763ec81090 100644 (file)
@@ -35,12 +35,10 @@ static inline int i915_gem_object_read_from_page(struct xe_bo *bo,
                                          u32 ofs, u64 *ptr, u32 size)
 {
        struct ttm_bo_kmap_obj map;
-       void *virtual;
+       void *src;
        bool is_iomem;
        int ret;
 
-       XE_WARN_ON(size != 8);
-
        ret = xe_bo_lock(bo, true);
        if (ret)
                return ret;
@@ -50,11 +48,12 @@ static inline int i915_gem_object_read_from_page(struct xe_bo *bo,
                goto out_unlock;
 
        ofs &= ~PAGE_MASK;
-       virtual = ttm_kmap_obj_virtual(&map, &is_iomem);
+       src = ttm_kmap_obj_virtual(&map, &is_iomem);
+       src += ofs;
        if (is_iomem)
-               *ptr = readq((void __iomem *)(virtual + ofs));
+               memcpy_fromio(ptr, (void __iomem *)src, size);
        else
-               *ptr = *(u64 *)(virtual + ofs);
+               memcpy(ptr, src, size);
 
        ttm_bo_kunmap(&map);
 out_unlock: