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 <kenneth@whitecape.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Mark Janes
2019-07-31 16:16:50 -07:00
parent 7852fe5415
commit 1186f6ea69

View 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)