From c2fd848002c43e340b259559917f77f48d38cc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Tue, 30 Apr 2024 13:51:52 -0700 Subject: [PATCH] intel/perf: Refactor and add Xe KMD support to change stream metrics id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Lionel Landwerlin Signed-off-by: José Roberto de Souza Part-of: --- src/intel/perf/i915/intel_perf.c | 7 +++++++ src/intel/perf/i915/intel_perf.h | 1 + src/intel/perf/intel_perf.c | 15 +++++++++++++++ src/intel/perf/intel_perf.h | 2 ++ src/intel/perf/xe/intel_perf.c | 12 ++++++++++++ src/intel/perf/xe/intel_perf.h | 1 + src/intel/vulkan/anv_perf.c | 5 +++-- src/intel/vulkan/i915/anv_batch_chain.c | 5 +++-- src/intel/vulkan_hasvk/anv_batch_chain.c | 5 +++-- src/intel/vulkan_hasvk/anv_perf.c | 5 +++-- 10 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/intel/perf/i915/intel_perf.c b/src/intel/perf/i915/intel_perf.c index e441de0ee52..5a619d54380 100644 --- a/src/intel/perf/i915/intel_perf.c +++ b/src/intel/perf/i915/intel_perf.c @@ -283,3 +283,10 @@ i915_perf_stream_set_state(int perf_stream_fd, bool enable) return intel_ioctl(perf_stream_fd, uapi, 0); } + +int +i915_perf_stream_set_metrics_id(int perf_stream_fd, uint64_t metrics_set_id) +{ + return intel_ioctl(perf_stream_fd, I915_PERF_IOCTL_CONFIG, + (void *)(uintptr_t)metrics_set_id); +} diff --git a/src/intel/perf/i915/intel_perf.h b/src/intel/perf/i915/intel_perf.h index 63c8a257a7c..826b2632746 100644 --- a/src/intel/perf/i915/intel_perf.h +++ b/src/intel/perf/i915/intel_perf.h @@ -21,6 +21,7 @@ int i915_perf_stream_open(struct intel_perf_config *perf_config, int drm_fd, bool hold_preemption, bool enable); int i915_perf_stream_read_samples(int perf_stream_fd, uint8_t *buffer, size_t buffer_len); int i915_perf_stream_set_state(int perf_stream_fd, bool enable); +int i915_perf_stream_set_metrics_id(int perf_stream_fd, uint64_t metrics_set_id); struct intel_perf_registers *i915_perf_load_configurations(struct intel_perf_config *perf_cfg, int fd, const char *guid); diff --git a/src/intel/perf/intel_perf.c b/src/intel/perf/intel_perf.c index 7674bac5fdd..c56e1a5ced3 100644 --- a/src/intel/perf/intel_perf.c +++ b/src/intel/perf/intel_perf.c @@ -1592,3 +1592,18 @@ intel_perf_stream_set_state(struct intel_perf_config *perf_config, return -1; } } + +int +intel_perf_stream_set_metrics_id(struct intel_perf_config *perf_config, + int perf_stream_fd, uint64_t metrics_set_id) +{ + switch (perf_config->devinfo->kmd_type) { + case INTEL_KMD_TYPE_I915: + return i915_perf_stream_set_metrics_id(perf_stream_fd, metrics_set_id); + case INTEL_KMD_TYPE_XE: + return xe_perf_stream_set_metrics_id(perf_stream_fd, metrics_set_id); + default: + unreachable("missing"); + return -1; + } +} diff --git a/src/intel/perf/intel_perf.h b/src/intel/perf/intel_perf.h index e1a8bd2794a..2d4f9ff0f54 100644 --- a/src/intel/perf/intel_perf.h +++ b/src/intel/perf/intel_perf.h @@ -602,6 +602,8 @@ int intel_perf_stream_read_samples(struct intel_perf_config *perf_config, size_t buffer_len); int intel_perf_stream_set_state(struct intel_perf_config *perf_config, int perf_stream_fd, bool enable); +int intel_perf_stream_set_metrics_id(struct intel_perf_config *perf_config, + int perf_stream_fd, uint64_t metrics_set_id); #ifdef __cplusplus } // extern "C" diff --git a/src/intel/perf/xe/intel_perf.c b/src/intel/perf/xe/intel_perf.c index caf5b6ac6a1..c748a813ce1 100644 --- a/src/intel/perf/xe/intel_perf.c +++ b/src/intel/perf/xe/intel_perf.c @@ -166,3 +166,15 @@ xe_perf_stream_set_state(int perf_stream_fd, bool enable) return intel_ioctl(perf_stream_fd, uapi, 0); } + +int +xe_perf_stream_set_metrics_id(int perf_stream_fd, uint64_t metrics_set_id) +{ + struct drm_xe_ext_set_property prop = {}; + uint32_t index = 0; + + perf_prop_set(&prop, &index, DRM_XE_OA_PROPERTY_OA_METRIC_SET, + metrics_set_id); + return intel_ioctl(perf_stream_fd, DRM_XE_PERF_IOCTL_CONFIG, + (void *)(uintptr_t)&prop); +} diff --git a/src/intel/perf/xe/intel_perf.h b/src/intel/perf/xe/intel_perf.h index 0b158136ced..cb31730a2ae 100644 --- a/src/intel/perf/xe/intel_perf.h +++ b/src/intel/perf/xe/intel_perf.h @@ -23,3 +23,4 @@ int xe_perf_stream_open(struct intel_perf_config *perf_config, int drm_fd, uint64_t report_format, uint64_t period_exponent, bool hold_preemption, bool enable); int xe_perf_stream_set_state(int perf_stream_fd, bool enable); +int xe_perf_stream_set_metrics_id(int perf_stream_fd, uint64_t metrics_set_id); diff --git a/src/intel/vulkan/anv_perf.c b/src/intel/vulkan/anv_perf.c index 2fe0a4e244f..5a94906733f 100644 --- a/src/intel/vulkan/anv_perf.c +++ b/src/intel/vulkan/anv_perf.c @@ -229,8 +229,9 @@ VkResult anv_QueueSetPerformanceConfigurationINTEL( if (device->perf_fd < 0) return VK_ERROR_INITIALIZATION_FAILED; } else { - int ret = intel_ioctl(device->perf_fd, I915_PERF_IOCTL_CONFIG, - (void *)(uintptr_t) config->config_id); + int ret = intel_perf_stream_set_metrics_id(device->physical->perf, + device->perf_fd, + config->config_id); if (ret < 0) return vk_device_set_lost(&device->vk, "i915-perf config failed: %m"); } diff --git a/src/intel/vulkan/i915/anv_batch_chain.c b/src/intel/vulkan/i915/anv_batch_chain.c index 3691203fbf6..f4b5a472d61 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.c +++ b/src/intel/vulkan/i915/anv_batch_chain.c @@ -934,8 +934,9 @@ i915_queue_exec_locked(struct anv_queue *queue, if (!INTEL_DEBUG(DEBUG_NO_OACONFIG) && (query_info->kind == INTEL_PERF_QUERY_TYPE_OA || query_info->kind == INTEL_PERF_QUERY_TYPE_RAW)) { - int ret = intel_ioctl(device->perf_fd, I915_PERF_IOCTL_CONFIG, - (void *)(uintptr_t) query_info->oa_metrics_set_id); + int ret = intel_perf_stream_set_metrics_id(device->physical->perf, + device->perf_fd, + query_info->oa_metrics_set_id); if (ret < 0) { result = vk_device_set_lost(&device->vk, "i915-perf config failed: %s", diff --git a/src/intel/vulkan_hasvk/anv_batch_chain.c b/src/intel/vulkan_hasvk/anv_batch_chain.c index de0a55b1b54..95690b2aae3 100644 --- a/src/intel/vulkan_hasvk/anv_batch_chain.c +++ b/src/intel/vulkan_hasvk/anv_batch_chain.c @@ -2222,8 +2222,9 @@ anv_queue_exec_locked(struct anv_queue *queue, if (!INTEL_DEBUG(DEBUG_NO_OACONFIG) && (query_info->kind == INTEL_PERF_QUERY_TYPE_OA || query_info->kind == INTEL_PERF_QUERY_TYPE_RAW)) { - int ret = intel_ioctl(device->perf_fd, I915_PERF_IOCTL_CONFIG, - (void *)(uintptr_t) query_info->oa_metrics_set_id); + int ret = intel_perf_stream_set_metrics_id(device->physical->perf, + device->perf_fd, + query_info->oa_metrics_set_id); if (ret < 0) { result = vk_device_set_lost(&device->vk, "i915-perf config failed: %s", diff --git a/src/intel/vulkan_hasvk/anv_perf.c b/src/intel/vulkan_hasvk/anv_perf.c index 5c3d419cbf0..4f826ec1e75 100644 --- a/src/intel/vulkan_hasvk/anv_perf.c +++ b/src/intel/vulkan_hasvk/anv_perf.c @@ -236,8 +236,9 @@ VkResult anv_QueueSetPerformanceConfigurationINTEL( if (device->perf_fd < 0) return VK_ERROR_INITIALIZATION_FAILED; } else { - int ret = intel_ioctl(device->perf_fd, I915_PERF_IOCTL_CONFIG, - (void *)(uintptr_t) config->config_id); + int ret = intel_perf_stream_set_metrics_id(device->physical->perf, + device->perf_fd, + config->config_id); if (ret < 0) return vk_device_set_lost(&device->vk, "i915-perf config failed: %m"); }