[Intel-gfx] [PATCH i-g-t] tests/kms_properties: Add GET_PROPERTY ioctl sanity check
Chris Wilson
chris at chris-wilson.co.uk
Wed Apr 12 15:49:16 UTC 2017
On Wed, Apr 12, 2017 at 05:21:49PM +0200, Daniel Vetter wrote:
> I've broken this accidentally. Let's make sure this doesn't happen
> anymore. Testcases suggested by Chris.
>
> Acked-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> ---
> tests/kms_properties.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/tests/kms_properties.c b/tests/kms_properties.c
> index 591e1a019190..c15026b89acd 100644
> --- a/tests/kms_properties.c
> +++ b/tests/kms_properties.c
> @@ -358,6 +358,63 @@ static void test_object_invalid_properties(igt_display_t *display,
> test_invalid_properties(display->drm_fd, id, type, output->id, DRM_MODE_OBJECT_CONNECTOR, atomic);
> }
>
> +static void get_prop_sanity(igt_display_t *display)
> +{
> + int i, fd;
> + uint64_t *values;
> + struct drm_mode_property_enum *enums;
> +
> + fd = display->drm_fd;
> +
> + /*
> + * There's no way to enumerate all properties, we just have to
> + * brute-force the first few kms ids. 1000 should be enough.
> + */
> + for (i = 0; i < 1000; i++) {
> + struct drm_mode_get_property prop;
> +
> + memset(&prop, 0, sizeof(prop));
> + prop.prop_id = i;
> +
> + if (drmIoctl(fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
> + continue;
> +
> + if (prop.count_values) {
> + values = calloc(prop.count_values, sizeof(uint64_t));
> + igt_assert(values);
> + memset(values, 0x5c, sizeof(uint64_t)*prop.count_values);
> + prop.values_ptr = to_user_pointer(values);
> + }
> +
> + /* despite what libdrm makes you believe, we never supply
> + * additional information for BLOB properties, only for enums
> + * and bitmasks */
> + igt_assert_eq(!!prop.count_enum_blobs,
> + !!(prop.flags & (DRM_MODE_PROP_ENUM | DRM_MODE_PROP_BITMASK)));
> + if (prop.flags & (DRM_MODE_PROP_ENUM | DRM_MODE_PROP_BITMASK))
> + igt_assert(prop.count_enum_blobs == prop.count_values);
> +
> + if (prop.count_enum_blobs) {
> + enums = calloc(prop.count_enum_blobs, sizeof(*enums));
> + memset(enums, 0x5c, sizeof(*enums)*prop.count_enum_blobs);
> + igt_assert(enums);
> + prop.enum_blob_ptr = to_user_pointer(enums);
> + }
> +
> + do_ioctl(fd, DRM_IOCTL_MODE_GETPROPERTY, &prop);
> +
> + for (int j = 0; j < prop.count_values; j++) {
> + igt_assert(values[j] != 0x5c5c5c5c5c5c5c5cULL);
> +
> + if (!(prop.flags & (DRM_MODE_PROP_ENUM | DRM_MODE_PROP_BITMASK)))
> + continue;
> + igt_assert(enums[j].value != 0x5c5c5c5c5c5c5c5cULL);
> + igt_assert(enums[j].value == values[j]);
> + igt_assert(enums[j].name[0] != '\0');
> + }
Yikes, totally missed the callocs without free. A small leak today...
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list