[PATCH i-g-t v5 06/10] tests/imagination: Add DEV_QUERY static data area tests
Robert Mazur <[email protected]> Tue, 28 Jul 2026 09:19:01 +0200
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <20260728-test-imagination-add-support-v5-6-33049f0d1937@imgtec.com> |
From: Donald Robson <[email protected]> Add subtest validating static data areas returned by DEV_QUERY. Signed-off-by: Donald Robson <[email protected]> Signed-off-by: Robert Mazur <[email protected]> Acked-by: Kamil Konieczny <[email protected]> --- lib/igt_pvr.c | 29 +++++++++++++++++++++++++++++ lib/igt_pvr.h | 2 ++ tests/imagination/pvr_heap_info.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/lib/igt_pvr.c b/lib/igt_pvr.c index 40a68d4e6..c1e68aef1 100644 --- a/lib/igt_pvr.c +++ b/lib/igt_pvr.c @@ -135,3 +135,32 @@ igt_pvr_get_heap_info(int fd, uint32_t *array_len_out) return heaps; } +/** + * igt_pvr_get_static_data_areas: + * @fd: The file descriptor of the DRM device. + * @array_len_out: Pointer to store the number of static data areas. + * + * Function to get information about the device static data areas. + * + * Returns: An array of drm_pvr_static_data_area structures. The caller is responsible + * for freeing the array. + */ +struct drm_pvr_static_data_area * +igt_pvr_get_static_data_areas(int fd, uint32_t *array_len_out) +{ + struct drm_pvr_static_data_area *sdas = + calloc(DRM_PVR_STATIC_DATA_AREA_YUV_CSC + 1, sizeof(*sdas)); + struct drm_pvr_dev_query_static_data_areas sdas_get = { + .static_data_areas = + DRM_PVR_OBJ_ARRAY(DRM_PVR_STATIC_DATA_AREA_YUV_CSC + 1, + sdas), + }; + + igt_pvr_ioctl_dev_query(fd, DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET, + sizeof(sdas_get), &sdas_get, 0); + + if (array_len_out) + *array_len_out = sdas_get.static_data_areas.count; + + return sdas; +} diff --git a/lib/igt_pvr.h b/lib/igt_pvr.h index ca09f39e1..19909480b 100644 --- a/lib/igt_pvr.h +++ b/lib/igt_pvr.h @@ -18,5 +18,7 @@ igt_pvr_ioctl_dev_query(int fd, enum drm_pvr_dev_query type, uint64_t size, void *pointer, int expect_err); struct drm_pvr_heap * igt_pvr_get_heap_info(int fd, uint32_t *array_len_out); +struct drm_pvr_static_data_area * +igt_pvr_get_static_data_areas(int fd, uint32_t *array_len_out); #endif /* IGT_PVR_H */ diff --git a/tests/imagination/pvr_heap_info.c b/tests/imagination/pvr_heap_info.c index 7d953044e..fa8591a97 100644 --- a/tests/imagination/pvr_heap_info.c +++ b/tests/imagination/pvr_heap_info.c @@ -123,6 +123,45 @@ int igt_main() free(heaps); } + igt_describe("Test validity of static data areas"); + igt_subtest("heap-info-static-data-areas-valid") + { + uint32_t heaps_count = 0; + struct drm_pvr_heap *heaps = + igt_pvr_get_heap_info(fd, &heaps_count); + + uint32_t sda_count = 0; + struct drm_pvr_static_data_area *static_data_areas = + igt_pvr_get_static_data_areas(fd, &sda_count); + + igt_assert(heaps); + igt_assert(static_data_areas); + + for (uint32_t i = 0; i < sda_count; i++) { + const uint64_t start_offset = static_data_areas[i].offset; + const uint64_t end_offset = + start_offset + static_data_areas[i].size; + const struct drm_pvr_heap *const heap = + &heaps[static_data_areas[i].location_heap_id]; + + igt_assert_lte(static_data_areas[i].area_usage, + DRM_PVR_STATIC_DATA_AREA_YUV_CSC); + igt_assert_lt(static_data_areas[i].location_heap_id, + DRM_PVR_HEAP_COUNT); + + if (!static_data_areas[i].size) + /* Not present for device. */ + continue; + + /* Ensure reported range is inside the heap. */ + igt_assert_lte_u64(start_offset, heap->size); + igt_assert_lte_u64(end_offset, heap->size); + } + + free(heaps); + free(static_data_areas); + } + igt_fixture() { drm_close_driver(fd); -- 2.43.0