[igt-dev] [PATCH i-g-t v5 2/2] tests: add slice power programming test
Chris Wilson
chris at chris-wilson.co.uk
Thu May 24 15:23:49 UTC 2018
Quoting Lionel Landwerlin (2018-05-24 15:58:57)
> +static int drm_fd;
> +static int devid;
> +static uint64_t device_slice_mask = 0;
> +static uint64_t device_subslice_mask = 0;
> +static uint32_t device_slice_count = 0;
> +static uint32_t device_subslice_count = 0;
Any reason for using globals?
> +static uint64_t mask_minus_one(uint64_t mask)
minus/plus was making me think you were trying to do the equivalent of
mask += 1 etc.
I think mask_clear_first() and mask_set_next() would be clearer, and
I would just lose the _one variants and just pass N in everywhere.
> +{
> + int i;
> +
mask_clear_first:
bit = ffs(mask);
igt_assert(bit);
return mask & ~BIT(bit-1);
mask_set_next:
bit = ffs(~mask);
igt_assert(bit);
return mask | BIT(bit-1);
?
> +static uint32_t
> +read_rpcs_reg(drm_intel_bufmgr *bufmgr,
> + drm_intel_context *context,
> + uint32_t expected_slices)
> +{
> + struct intel_batchbuffer *batch;
> + drm_intel_bo *dst_bo;
Bleurgh. Why the dependency on libdrm_intel?
Do you have to keep using libdrm_intel? For testing the kernel
interfaces, the obfuscation is not helpful.
> +static bool
> +platform_has_per_context_sseu_support(void)
> +{
> + drm_intel_bufmgr *bufmgr;
> + drm_intel_context *context;
> + struct drm_i915_gem_context_param arg;
> + struct drm_i915_gem_context_param_sseu sseu;
> + uint32_t context_id;
> + int ret;
> +
> + bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
> + igt_assert(bufmgr);
> +
> + context = drm_intel_gem_context_create(bufmgr);
> + igt_assert(context);
> +
> + ret = drm_intel_gem_context_get_id(context, &context_id);
> + igt_assert_eq(ret, 0);
> +
> + memset(&sseu, 0, sizeof(sseu));
> + sseu.class = 0; /* rcs */
> + sseu.instance = 0;
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.ctx_id = context_id;
0 is a perfectly valid context, owned by the fd.
> + arg.param = I915_CONTEXT_PARAM_SSEU;
> + arg.value = (uintptr_t) &sseu;
> +
> + if (igt_ioctl(drm_fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &arg))
> + return false;
> +
> + if (igt_ioctl(drm_fd, DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &arg))
> + return false;
gem_context_get_param/set_param?
> +static void
> +test_sseu_invalid_engine(void)
> +{
> + drm_intel_bufmgr *bufmgr;
> + drm_intel_context *context;
> + struct drm_i915_gem_context_param arg;
> + struct drm_i915_gem_context_param_sseu sseu;
> + uint32_t context_id;
> + int ret;
> +
> + bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
> + igt_assert(bufmgr);
> +
> + context = drm_intel_gem_context_create(bufmgr);
> + igt_assert(context);
> +
> + memset(&sseu, 0, sizeof(sseu));
> +
> + ret = drm_intel_gem_context_get_id(context, &context_id);
> + igt_assert_eq(ret, 0);
> +
> + memset(&arg, 0, sizeof(arg));
> + arg.ctx_id = context_id;
> + arg.param = I915_CONTEXT_PARAM_SSEU;
> + arg.value = (uintptr_t) &sseu;
> +
> + sseu.class = 0xffff; /* invalid */
> + sseu.instance = 0;
> + do_ioctl_err(drm_fd, DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM, &arg, EINVAL);
__gem_context_get_param
Never use do_ioctl or do_ioctl_err in new code. The resultant error
messages are a punishment upon the unfortunate reader.
-Chris
More information about the igt-dev
mailing list