From 683a3df3081e11c80e0939e8aee1b8b7512733c5 Mon Sep 17 00:00:00 2001 From: zhangyichix Date: Fri, 5 Jan 2024 14:42:50 +0800 Subject: [PATCH] Fixed testOtherH264ImageReader case failure Offset mmap cannot convert from y-tiled to linear. We have to use GTT mmap to do it.But only none and KVM vm-type with iGPU support GTT mmap. TODO: There is no way to convert y-tiled to liear with dGPU. Tracked-On: OAM-114674 Signed-off-by: zhangyichix --- i915.c | 81 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/i915.c b/i915.c index 9c68d5c0..1b44ec72 100644 --- a/i915.c +++ b/i915.c @@ -924,7 +924,39 @@ static void *i915_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t if (bo->meta.format_modifiers[0] == I915_FORMAT_MOD_Y_TILED_CCS) return MAP_FAILED; - if (i915->has_mmap_offset) { + if (i915->genx10 < 125 && (vm_type() == HYPERTYPE_TYPE_KVM || vm_type() == HYPERTYPE_NONE)) { + struct drm_i915_gem_mmap_gtt gem_map; + memset(&gem_map, 0, sizeof(gem_map)); + + gem_map.handle = bo->handles[0].u32; + + ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &gem_map); + if (ret) { + struct drm_i915_gem_mmap gem_map; + memset(&gem_map, 0, sizeof(gem_map)); + + if ((bo->meta.use_flags & BO_USE_SCANOUT) && + !(bo->meta.use_flags & + (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))) + gem_map.flags = I915_MMAP_WC; + gem_map.handle = bo->handles[0].u32; + gem_map.offset = 0; + gem_map.size = bo->meta.total_size; + ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_MMAP, &gem_map); + + if (ret) { + drv_log("DRM_IOCTL_I915_GEM_MMAP failed\n"); + return MAP_FAILED; + } + addr = (void *)(uintptr_t)gem_map.addr_ptr; + + vma->length = bo->meta.total_size; + return addr; + } + + addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags), MAP_SHARED, + bo->drv->fd, gem_map.offset); + } else if (i915->has_mmap_offset) { struct drm_i915_gem_mmap_offset mmap_arg = { .handle = bo->handles[0].u32, }; @@ -932,13 +964,13 @@ static void *i915_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t if (i915->has_local_mem) { mmap_arg.flags = I915_MMAP_OFFSET_FIXED; } else { - if ((bo->meta.use_flags & BO_USE_SCANOUT) && - !(bo->meta.use_flags & - (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))) { - mmap_arg.flags = I915_MMAP_OFFSET_WC; - } else { - mmap_arg.flags = I915_MMAP_OFFSET_WB; - } + if ((bo->meta.use_flags & BO_USE_SCANOUT) && + !(bo->meta.use_flags & + (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))) { + mmap_arg.flags = I915_MMAP_OFFSET_WC; + } else { + mmap_arg.flags = I915_MMAP_OFFSET_WB; + } } /* Get the fake offset back */ @@ -995,38 +1027,9 @@ static void *i915_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t } addr = (void *)(uintptr_t)gem_map.addr_ptr; + } else { - struct drm_i915_gem_mmap_gtt gem_map; - memset(&gem_map, 0, sizeof(gem_map)); - - gem_map.handle = bo->handles[0].u32; - - ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_MMAP_GTT, &gem_map); - if (ret) { - struct drm_i915_gem_mmap gem_map; - memset(&gem_map, 0, sizeof(gem_map)); - - if ((bo->meta.use_flags & BO_USE_SCANOUT) && - !(bo->meta.use_flags & - (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE))) - gem_map.flags = I915_MMAP_WC; - gem_map.handle = bo->handles[0].u32; - gem_map.offset = 0; - gem_map.size = bo->meta.total_size; - ret = drmIoctl(bo->drv->fd, DRM_IOCTL_I915_GEM_MMAP, &gem_map); - - if (ret) { - drv_log("DRM_IOCTL_I915_GEM_MMAP failed\n"); - return MAP_FAILED; - } - addr = (void *)(uintptr_t)gem_map.addr_ptr; - - vma->length = bo->meta.total_size; - return addr; - } - - addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags), MAP_SHARED, - bo->drv->fd, gem_map.offset); + addr = MAP_FAILED; } if (addr == MAP_FAILED) {