summaryrefslogtreecommitdiff
path: root/lib/igt_fb.c
diff options
context:
space:
mode:
authorJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>2024-05-30 17:23:43 +0300
committerKamil Konieczny <kamil.konieczny@linux.intel.com>2024-06-12 11:50:18 +0200
commit9781dd706fe353b268c22d1f12071d72a4ea1fd3 (patch)
tree3bc4fb3aee21e9e9c69c598bff4f635a96ef764f /lib/igt_fb.c
parent169f57fe5964c225928b9eee069ef838ce57ad94 (diff)
lib/igt_fb: Sanitize blt_fb_init
Sanitize building of Intel blitter setup Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Zbigniew KempczyƄski <zbigniew.kempczynski@intel.com>
Diffstat (limited to 'lib/igt_fb.c')
-rw-r--r--lib/igt_fb.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index f4b9c8bf3..964e7c10f 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -2760,21 +2760,18 @@ static void copy_with_engine(struct fb_blit_upload *blit,
fini_buf(src);
}
-static struct blt_copy_object *blt_fb_init(const struct igt_fb *fb,
- uint32_t plane, uint32_t memregion)
+static struct blt_copy_object *allocate_and_initialize_blt(const struct igt_fb *fb,
+ uint32_t handle,
+ uint32_t memregion,
+ enum blt_tiling_type blt_tile,
+ uint32_t plane)
{
- uint32_t name, handle;
- struct blt_copy_object *blt;
- enum blt_tiling_type blt_tile;
uint64_t stride;
+ struct blt_copy_object *blt = calloc(1, sizeof(*blt));
- blt = malloc(sizeof(*blt));
- igt_assert(blt);
+ if (!blt)
+ return NULL;
- name = gem_flink(fb->fd, fb->gem_handle);
- handle = gem_open(fb->fd, name);
-
- blt_tile = fb_tile_to_blt_tile(fb->modifier);
stride = blt_tile == T_LINEAR ? fb->strides[plane] : fb->strides[plane] / 4;
blt_set_object(blt, handle, fb->size, memregion,
@@ -2785,17 +2782,48 @@ static struct blt_copy_object *blt_fb_init(const struct igt_fb *fb,
is_gen12_mc_ccs_modifier(fb->modifier) ? COMPRESSION_TYPE_MEDIA : COMPRESSION_TYPE_3D);
blt_set_geom(blt, stride, 0, 0, fb->width, fb->plane_height[plane], 0, 0);
-
blt->plane_offset = fb->offsets[plane];
- igt_assert(fb->size);
+ return blt;
+}
- if (is_xe_device(fb->fd))
- blt->ptr = xe_bo_mmap_ext(fb->fd, handle, fb->size,
- PROT_READ | PROT_WRITE);
+static void *map_buffer(int fd, uint32_t handle, size_t size)
+{
+ if (is_xe_device(fd))
+ return xe_bo_mmap_ext(fd, handle, size, PROT_READ | PROT_WRITE);
else
- blt->ptr = gem_mmap__device_coherent(fb->fd, handle, 0, fb->size,
- PROT_READ | PROT_WRITE);
+ return gem_mmap__device_coherent(fd, handle, 0, size,
+ PROT_READ | PROT_WRITE);
+}
+
+static struct blt_copy_object *blt_fb_init(const struct igt_fb *fb,
+ uint32_t plane, uint32_t memregion)
+{
+ uint32_t name, handle;
+ enum blt_tiling_type blt_tile;
+ struct blt_copy_object *blt;
+
+ if (!fb)
+ return NULL;
+
+ name = gem_flink(fb->fd, fb->gem_handle);
+ handle = gem_open(fb->fd, name);
+
+ if (!handle)
+ return NULL;
+
+ blt_tile = fb_tile_to_blt_tile(fb->modifier);
+ blt = allocate_and_initialize_blt(fb, handle, memregion, blt_tile, plane);
+
+ if (!blt)
+ return NULL;
+
+ blt->ptr = map_buffer(fb->fd, handle, fb->size);
+ if (!blt->ptr) {
+ free(blt);
+ return NULL;
+ }
+
return blt;
}