Skip to content

Commit

Permalink
Fixed testOtherH264ImageReader case failure
Browse files Browse the repository at this point in the history
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 <yichix.zhang@intel.com>
  • Loading branch information
zhangyichix committed Feb 4, 2024
1 parent 0e39b95 commit 683a3df
Showing 1 changed file with 42 additions and 39 deletions.
81 changes: 42 additions & 39 deletions i915.c
Original file line number Diff line number Diff line change
Expand Up @@ -924,21 +924,53 @@ 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,
};

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 */
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 683a3df

Please sign in to comment.