From: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
To: Ashutosh Dixit <ashutosh.dixit@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: Re: [PATCH 14/17] drm/xe/oa/uapi: Query OA unit properties
Date: Fri, 22 Dec 2023 16:40:47 -0800 [thread overview]
Message-ID: <ZYYsj+nKv6SAtVWu@unerlige-ril> (raw)
In-Reply-To: <20231208064329.2387604-15-ashutosh.dixit@intel.com>
On Thu, Dec 07, 2023 at 10:43:26PM -0800, Ashutosh Dixit wrote:
>Implement query for properties of OA units present on a device.
>
>Signed-off-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
>---
> drivers/gpu/drm/xe/xe_oa.h | 2 +
> drivers/gpu/drm/xe/xe_query.c | 81 +++++++++++++++++++++++++++++++++++
> include/uapi/drm/xe_drm.h | 64 +++++++++++++++++++++++++++
> 3 files changed, 147 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_oa.h b/drivers/gpu/drm/xe/xe_oa.h
>index a0f9a876ea6b4..b88914693cdb3 100644
>--- a/drivers/gpu/drm/xe/xe_oa.h
>+++ b/drivers/gpu/drm/xe/xe_oa.h
>@@ -25,5 +25,7 @@ int xe_oa_add_config_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file);
> int xe_oa_remove_config_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file);
>+u32 xe_oa_timestamp_frequency(struct xe_gt *gt);
>+u16 xe_oa_unit_id(struct xe_hw_engine *hwe);
>
> #endif
>diff --git a/drivers/gpu/drm/xe/xe_query.c b/drivers/gpu/drm/xe/xe_query.c
>index 56d61bf596b2b..abe2ea088e2ec 100644
>--- a/drivers/gpu/drm/xe/xe_query.c
>+++ b/drivers/gpu/drm/xe/xe_query.c
>@@ -501,6 +501,86 @@ static int query_gt_topology(struct xe_device *xe,
> return 0;
> }
>
>+static size_t calc_oa_unit_query_size(struct xe_device *xe)
>+{
>+ size_t size = sizeof(struct drm_xe_query_oa_units);
>+ struct xe_gt *gt;
>+ int i, id;
>+
>+ for_each_gt(gt, xe, id) {
>+ for (i = 0; i < gt->oa.num_oa_units; i++) {
>+ size += sizeof(struct drm_xe_oa_unit);
>+ size += gt->oa.oa_unit[i].num_engines *
>+ sizeof(struct drm_xe_engine_class_instance);
>+ }
>+ }
>+
>+ return size;
>+}
>+
>+static int query_oa_units(struct xe_device *xe,
>+ struct drm_xe_device_query *query)
>+{
>+ void __user *query_ptr = u64_to_user_ptr(query->data);
>+ size_t size = calc_oa_unit_query_size(xe);
>+ struct drm_xe_query_oa_units *qoa;
>+ enum xe_hw_engine_id hwe_id;
>+ struct drm_xe_oa_unit *du;
>+ struct xe_hw_engine *hwe;
>+ struct xe_oa_unit *u;
>+ int gt_id, i, j, ret;
>+ struct xe_gt *gt;
>+ u8 *pdu;
>+
>+ if (query->size == 0) {
>+ query->size = size;
>+ return 0;
>+ } else if (XE_IOCTL_DBG(xe, query->size != size)) {
>+ return -EINVAL;
>+ }
>+
>+ qoa = kzalloc(size, GFP_KERNEL);
>+ if (!qoa)
>+ return -ENOMEM;
>+
>+ pdu = (u8 *)&qoa->oa_units[0];
>+ for_each_gt(gt, xe, gt_id) {
>+ for (i = 0; i < gt->oa.num_oa_units; i++) {
>+ u = >->oa.oa_unit[i];
>+ du = (struct drm_xe_oa_unit *)pdu;
>+
>+ du->oa_unit_id = u->oa_unit_id;
>+ du->oa_unit_type = u->type;
>+ du->gt_id = gt->info.id;
>+ du->open_stream = !!u->exclusive_stream;
>+ du->oa_timestamp_freq = xe_oa_timestamp_frequency(gt);
>+ du->oa_buf_size = XE_OA_BUFFER_SIZE;
>+ du->num_engines = u->num_engines;
>+
>+ for (j = 1; j < DRM_XE_OA_PROPERTY_MAX; j++)
>+ du->capabilities |= BIT(j);
>+
>+ j = 0;
>+ for_each_hw_engine(hwe, gt, hwe_id) {
>+ if (xe_oa_unit_id(hwe) == u->oa_unit_id) {
>+ du->eci[j].engine_class =
>+ xe_to_user_engine_class[hwe->class];
>+ du->eci[j].engine_instance = hwe->logical_instance;
>+ du->eci[j].gt_id = gt->info.id;
>+ j++;
>+ }
>+ }
>+ pdu += sizeof(*du) + j * sizeof(du->eci[0]);
>+ qoa->num_oa_units++;
>+ }
>+ }
>+
>+ ret = copy_to_user(query_ptr, qoa, size);
>+ kfree(qoa);
>+
>+ return ret ? -EFAULT : 0;
>+}
>+
> static int (* const xe_query_funcs[])(struct xe_device *xe,
> struct drm_xe_device_query *query) = {
> query_engines,
>@@ -510,6 +590,7 @@ static int (* const xe_query_funcs[])(struct xe_device *xe,
> query_hwconfig,
> query_gt_topology,
> query_engine_cycles,
>+ query_oa_units,
> };
>
> int xe_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
>diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
>index 8156301df7315..5f41c5bfe5e0e 100644
>--- a/include/uapi/drm/xe_drm.h
>+++ b/include/uapi/drm/xe_drm.h
>@@ -517,6 +517,7 @@ struct drm_xe_device_query {
> #define DRM_XE_DEVICE_QUERY_HWCONFIG 4
> #define DRM_XE_DEVICE_QUERY_GT_TOPOLOGY 5
> #define DRM_XE_DEVICE_QUERY_ENGINE_CYCLES 6
>+#define DRM_XE_DEVICE_QUERY_OA_UNITS 7
> /** @query: The type of data to query */
> __u32 query;
>
>@@ -1182,6 +1183,69 @@ enum drm_xe_oa_unit_type {
> DRM_XE_OA_UNIT_TYPE_OAM,
> };
>
>+/**
>+ * struct drm_xe_query_oa_units - describe OA units
>+ *
>+ * If a query is made with a struct drm_xe_device_query where .query
>+ * is equal to DRM_XE_DEVICE_QUERY_OA_UNITS, then the reply uses struct
>+ * drm_xe_query_oa_units in .data.
>+ *
>+ * When there is an @open_stream, the query returns properties specific to
>+ * that @open_stream. Else default properties are returned.
>+ */
>+struct drm_xe_query_oa_units {
>+ /** @extensions: Pointer to the first extension struct, if any */
>+ __u64 extensions;
>+
>+ /** @num_oa_units: number of OA units returned in oau[] */
>+ __u32 num_oa_units;
>+
>+ /** @pad: MBZ */
>+ __u32 pad;
>+
>+ /** @reserved: MBZ */
>+ __u64 reserved[4];
For some reason I have assumed reserved fields are added only at the end
of the uApi struct, not sure though.
>+
>+ /** @oa_units: OA units returned for this device */
>+ struct drm_xe_oa_unit {
>+ /** @oa_unit_id: OA unit ID */
>+ __u16 oa_unit_id;
>+
>+ /** @oa_unit_type: OA unit type of @drm_xe_oa_unit_type */
>+ __u16 oa_unit_type;
>+
>+ /** @gt_id: GT ID for this OA unit */
>+ __u16 gt_id;
>+
>+ /** @open_stream: True if a stream is open on the OA unit */
>+ __u16 open_stream;
>+
>+ /** @internal_events: True if internal events are available */
>+ __u16 internal_events;
>+
>+ /** @pad: MBZ */
>+ __u16 pad;
__u16 pad[3] for 64bit alignment
>+
>+ /** @capabilities: OA capabilities bit-mask */
>+ __u64 capabilities;
>+
>+ /** @oa_timestamp_freq: OA timestamp freq */
>+ __u64 oa_timestamp_freq;
>+
>+ /** @oa_buf_size: OA buffer size */
>+ __u64 oa_buf_size;
>+
>+ /** @reserved: MBZ */
>+ __u64 reserved[4];
>+
>+ /** @num_engines: number of engines in @eci array */
>+ __u64 num_engines;
>+
>+ /** @eci: engines attached to this OA unit */
>+ struct drm_xe_engine_class_instance eci[];
>+ } oa_units[];
nesting of flexible arrays; not sure about that. i think some compilers
may throw an error/warning. Sending an old message from Joonas offline.
In general, I feel the pad and reserved fields sprinkled into the
structure. If we can avoid that in a way that they are all located at
the end of the struct, I think that would look good. Not sure about the
technical aspect though. I always assumed they were meant to be at the
end (but then structs are nested anyways, so really not sure).
Thanks,
Umesh
>+};
>+
> /** enum drm_xe_oa_format_type - OA format types */
> enum drm_xe_oa_format_type {
> DRM_XE_OA_FMT_TYPE_OAG,
>--
>2.41.0
>
next prev parent reply other threads:[~2023-12-23 0:41 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-08 6:43 [PATCH v7 00/17] Add OA functionality to Xe Ashutosh Dixit
2023-12-08 6:43 ` [PATCH 01/17] drm/xe/perf/uapi: "Perf" layer to support multiple perf counter stream types Ashutosh Dixit
2023-12-08 6:43 ` [PATCH 02/17] drm/xe/perf/uapi: Add perf_stream_paranoid sysctl Ashutosh Dixit
2023-12-14 0:57 ` Umesh Nerlige Ramappa
2023-12-19 20:28 ` Dixit, Ashutosh
2024-01-20 2:35 ` Dixit, Ashutosh
2024-01-24 14:10 ` Joel Granados
2023-12-08 6:43 ` [PATCH 03/17] drm/xe/oa/uapi: Add oa_max_sample_rate sysctl Ashutosh Dixit
2023-12-14 0:58 ` Umesh Nerlige Ramappa
2024-01-20 2:36 ` Dixit, Ashutosh
2024-01-24 14:11 ` Joel Granados
2023-12-08 6:43 ` [PATCH 04/17] drm/xe/oa/uapi: Add OA data formats Ashutosh Dixit
2023-12-19 1:11 ` Umesh Nerlige Ramappa
2023-12-19 1:17 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 05/17] drm/xe/oa/uapi: Initialize OA units Ashutosh Dixit
2023-12-19 16:11 ` Umesh Nerlige Ramappa
2024-01-20 2:43 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 06/17] drm/xe/oa/uapi: Add/remove OA config perf ops Ashutosh Dixit
2023-12-19 19:10 ` Umesh Nerlige Ramappa
2024-01-20 2:44 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 07/17] drm/xe/oa/uapi: Define and parse OA stream properties Ashutosh Dixit
2023-12-09 22:53 ` Dixit, Ashutosh
2023-12-19 2:59 ` Dixit, Ashutosh
2023-12-19 16:26 ` Umesh Nerlige Ramappa
2023-12-19 16:29 ` Lionel Landwerlin
2023-12-19 16:40 ` Umesh Nerlige Ramappa
2023-12-19 17:48 ` Lionel Landwerlin
2023-12-19 23:23 ` Umesh Nerlige Ramappa
2024-01-20 2:48 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 08/17] drm/xe/oa: OA stream initialization (OAG) Ashutosh Dixit
2023-12-20 2:31 ` Umesh Nerlige Ramappa
2024-01-20 2:49 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 09/17] drm/xe/oa/uapi: Expose OA stream fd Ashutosh Dixit
2023-12-20 2:52 ` Umesh Nerlige Ramappa
2024-01-20 2:50 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 10/17] drm/xe/oa/uapi: Read file_operation Ashutosh Dixit
2023-12-20 3:01 ` Umesh Nerlige Ramappa
2024-01-20 2:51 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 11/17] drm/xe/oa: Disable overrun mode for Xe2+ OAG Ashutosh Dixit
2023-12-20 3:05 ` Umesh Nerlige Ramappa
2024-01-20 2:51 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 12/17] drm/xe/oa: Add OAR support Ashutosh Dixit
2023-12-20 4:37 ` Umesh Nerlige Ramappa
2023-12-08 6:43 ` [PATCH 13/17] drm/xe/oa: Add OAC support Ashutosh Dixit
2023-12-20 4:59 ` Umesh Nerlige Ramappa
2024-01-20 2:52 ` FIXME " Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 14/17] drm/xe/oa/uapi: Query OA unit properties Ashutosh Dixit
2023-12-23 0:40 ` Umesh Nerlige Ramappa [this message]
2024-01-20 3:10 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 15/17] drm/xe/oa/uapi: OA buffer mmap Ashutosh Dixit
2023-12-23 2:39 ` Umesh Nerlige Ramappa
2024-01-20 3:11 ` Dixit, Ashutosh
2024-02-06 23:51 ` Umesh Nerlige Ramappa
2024-01-02 11:16 ` Thomas Hellström
2024-01-08 19:50 ` Umesh Nerlige Ramappa
2024-01-09 5:14 ` Dixit, Ashutosh
2023-12-08 6:43 ` [PATCH 16/17] drm/xe/oa: Add MMIO trigger support Ashutosh Dixit
2023-12-20 4:35 ` Umesh Nerlige Ramappa
2023-12-08 6:43 ` [PATCH 17/17] drm/xe/oa: Override GuC RC with OA on PVC Ashutosh Dixit
2023-12-08 9:22 ` ✗ CI.Patch_applied: failure for Add OA functionality to Xe (rev7) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZYYsj+nKv6SAtVWu@unerlige-ril \
--to=umesh.nerlige.ramappa@intel.com \
--cc=ashutosh.dixit@intel.com \
--cc=intel-xe@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.