From 1186f6ea6947e779b99b87e48b8e5ac6d25b87bf Mon Sep 17 00:00:00 2001 From: Mark Janes Date: Wed, 31 Jul 2019 16:16:50 -0700 Subject: [PATCH] i965/perf: verify kernel support before registering OA metrics When gen_device_info updates the topology in it's initializer, the kernel queries will fail silently. Iris and anv have minimum kernel requirements that support the queries. i965 must verify kernel support before reporting OA metrics. Reviewed-by: Kenneth Graunke Reviewed-by: Lionel Landwerlin --- .../drivers/dri/i965/brw_performance_query.c | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c index 6c168d0adf3..a04bf65e1ca 100644 --- a/src/mesa/drivers/dri/i965/brw_performance_query.c +++ b/src/mesa/drivers/dri/i965/brw_performance_query.c @@ -1743,6 +1743,47 @@ getparam_topology(struct brw_context *brw) return true; } +/* gen_device_info will have incorrect default topology values for unsupported kernels. + * verify kernel support to ensure OA metrics are accurate. + */ +static bool +oa_metrics_kernel_support(int fd, const struct gen_device_info *devinfo) +{ + if (devinfo->gen >= 10) { + /* topology uAPI required for CNL+ (kernel 4.17+) make a call to the api + * to verify support + */ + struct drm_i915_query_item item = { + .query_id = DRM_I915_QUERY_TOPOLOGY_INFO, + }; + struct drm_i915_query query = { + .num_items = 1, + .items_ptr = (uintptr_t) &item, + }; + + /* kernel 4.17+ supports the query */ + return drmIoctl(fd, DRM_IOCTL_I915_QUERY, &query) == 0; + } + + if (devinfo->gen >= 8) { + /* 4.13+ api required for gen8 - gen9 */ + int mask; + struct drm_i915_getparam gp = { + .param = I915_PARAM_SLICE_MASK, + .value = &mask, + }; + /* kernel 4.13+ supports this parameter */ + return drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp) == 0; + } + + if (devinfo->gen == 7) + /* default topology values are correct for HSW */ + return true; + + /* oa not supported before gen 7*/ + return false; +} + static unsigned brw_init_perf_query_info(struct gl_context *ctx) { @@ -1758,6 +1799,9 @@ brw_init_perf_query_info(struct gl_context *ctx) init_pipeline_statistic_query_registers(brw); brw_perf_query_register_mdapi_statistic_query(brw); + if (!oa_metrics_kernel_support(screen->fd, devinfo)) + return false; + if (!query_topology(brw)) { /* We need the i915 query uAPI on CNL+ (kernel 4.17+). */ if (devinfo->gen >= 10)