i965/perf: verify kernel support before registering OA metrics
authorMark Janes <mark.a.janes@intel.com>
Wed, 31 Jul 2019 23:16:50 +0000 (16:16 -0700)
committerMark Janes <mark.a.janes@intel.com>
Thu, 1 Aug 2019 23:39:41 +0000 (16:39 -0700)
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 <kenneth@whitecape.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/mesa/drivers/dri/i965/brw_performance_query.c

index 6c168d0adf3fdfebe9d8b93a2018092820e41290..a04bf65e1caf1989fae3d38c67ad2cedbfa7f8d3 100644 (file)
@@ -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)