319 lines · 8.0 KB · C
RawDownload
/* SPDX-License-Identifier: MIT *//* Copyright (C) 2025 Arm, Ltd. */#ifndef _ETHOSU_DRM_H_#define _ETHOSU_DRM_H_ #include "drm.h" #if defined(__cplusplus)extern "C" {#endif /** * DOC: IOCTL IDs * * enum drm_ethosu_ioctl_id - IOCTL IDs * * Place new ioctls at the end, don't re-order, don't replace or remove entries. * * These IDs are not meant to be used directly. Use the DRM_IOCTL_ETHOSU_xxx * definitions instead. */enum drm_ethosu_ioctl_id {	/** @DRM_ETHOSU_DEV_QUERY: Query device information. */	DRM_ETHOSU_DEV_QUERY = 0, 	/** @DRM_ETHOSU_BO_CREATE: Create a buffer object. */	DRM_ETHOSU_BO_CREATE, 	/** @DRM_ETHOSU_BO_WAIT: Wait on a buffer object's fence. */	DRM_ETHOSU_BO_WAIT, 	/**	 * @DRM_ETHOSU_BO_MMAP_OFFSET: Get the file offset to pass to	 * mmap to map a GEM object.	 */	DRM_ETHOSU_BO_MMAP_OFFSET, 	/**	 * @DRM_ETHOSU_CMDSTREAM_BO_CREATE: Create a command stream buffer	 * object.	 */	DRM_ETHOSU_CMDSTREAM_BO_CREATE, 	/** @DRM_ETHOSU_SUBMIT: Submit a job and BOs to run. */	DRM_ETHOSU_SUBMIT, 	DRM_ETHOSU_PERFMON_CREATE,	DRM_ETHOSU_PERFMON_DESTROY,	DRM_ETHOSU_PERFMON_GET_VALUES,	DRM_ETHOSU_PERFMON_SET_GLOBAL,}; /** * DOC: IOCTL arguments */ /** * enum drm_ethosu_dev_query_type - Query type * * Place new types at the end, don't re-order, don't remove or replace. */enum drm_ethosu_dev_query_type {	/** @DRM_ETHOSU_DEV_QUERY_NPU_INFO: Query NPU information. */	DRM_ETHOSU_DEV_QUERY_NPU_INFO = 0,}; /** * struct drm_ethosu_gpu_info - NPU information * * Structure grouping all queryable information relating to the NPU. */struct drm_ethosu_npu_info {	/** @id : NPU ID. */	__u32 id;#define DRM_ETHOSU_ARCH_MAJOR(x)			((x) >> 28)#define DRM_ETHOSU_ARCH_MINOR(x)			(((x) >> 20) & 0xff)#define DRM_ETHOSU_ARCH_PATCH(x)			(((x) >> 16) & 0xf)#define DRM_ETHOSU_PRODUCT_MAJOR(x)		(((x) >> 12) & 0xf)#define DRM_ETHOSU_VERSION_MAJOR(x)		(((x) >> 8) & 0xf)#define DRM_ETHOSU_VERSION_MINOR(x)		(((x) >> 4) & 0xff)#define DRM_ETHOSU_VERSION_STATUS(x)		((x) & 0xf) 	/** @gpu_rev: GPU revision. */	__u32 config; 	__u32 sram_size;	__u32 pmu_counters;}; /** * struct drm_ethosu_dev_query - Arguments passed to DRM_ETHOSU_IOCTL_DEV_QUERY */struct drm_ethosu_dev_query {	/** @type: the query type (see drm_ethosu_dev_query_type). */	__u32 type; 	/**	 * @size: size of the type being queried.	 *	 * If pointer is NULL, size is updated by the driver to provide the	 * output structure size. If pointer is not NULL, the driver will	 * only copy min(size, actual_structure_size) bytes to the pointer,	 * and update the size accordingly. This allows us to extend query	 * types without breaking userspace.	 */	__u32 size; 	/**	 * @pointer: user pointer to a query type struct.	 *	 * Pointer can be NULL, in which case, nothing is copied, but the	 * actual structure size is returned. If not NULL, it must point to	 * a location that's large enough to hold size bytes.	 */	__u64 pointer;}; /** * enum drm_ethosu_bo_flags - Buffer object flags, passed at creation time. */enum drm_ethosu_bo_flags {	/**	 * @DRM_ETHOSU_BO_NO_MMAP: The buffer object will never be CPU-mapped	 * in userspace.	 */	DRM_ETHOSU_BO_NO_MMAP = (1 << 0),}; /** * struct drm_ethosu_bo_create - Arguments passed to DRM_IOCTL_ETHOSU_BO_CREATE. */struct drm_ethosu_bo_create {	/**	 * @size: Requested size for the object	 *	 * The (page-aligned) allocated size for the object will be returned.	 */	__u64 size; 	/**	 * @flags: Flags. Must be a combination of drm_ethosu_bo_flags flags.	 */	__u32 flags; 	/**	 * @handle: Returned handle for the object.	 *	 * Object handles are nonzero.	 */	__u32 handle;}; /** * struct drm_ethosu_bo_mmap_offset - Arguments passed to DRM_IOCTL_ETHOSU_BO_MMAP_OFFSET. */struct drm_ethosu_bo_mmap_offset {	/** @handle: Handle of the object we want an mmap offset for. */	__u32 handle; 	/** @pad: MBZ. */	__u32 pad; 	/** @offset: The fake offset to use for subsequent mmap calls. */	__u64 offset;}; /** * struct drm_ethosu_wait_bo - ioctl argument for waiting for * completion of the last DRM_ETHOSU_SUBMIT on a BO. * * This is useful for cases where multiple processes might be * rendering to a BO and you want to wait for all rendering to be * completed. */struct drm_ethosu_bo_wait {	__u32 handle;	__u32 pad;	__s64 timeout_ns;	/* absolute */}; struct drm_ethosu_cmdstream_bo_create {	/* Size of the data argument. */	__u32 size; 	/* Flags, currently must be 0. */	__u32 flags; 	/* Pointer to the data. */	__u64 data; 	/** Returned GEM handle for the BO. */	__u32 handle; 	/* Pad, must be 0. */	__u32 pad;}; /** * struct drm_ethosu_job - A job to be run on the NPU * * The kernel will schedule the execution of this job taking into account its * dependencies with other jobs. All tasks in the same job will be executed * sequentially on the same core, to benefit from memory residency in SRAM. */struct drm_ethosu_job {	/** Input: BO handle for cmdstream. */	__u32 cmd_bo; 	/** Input: Amount of SRAM to use. */	__u32 sram_size; #define ETHOSU_MAX_REGIONS	8	/** Input: Array of BO handles for each region. */	__u32 region_bo_handles[ETHOSU_MAX_REGIONS];}; /** * struct drm_ethosu_submit - ioctl argument for submitting commands to the NPU. * * The kernel will schedule the execution of these jobs in dependency order. */struct drm_ethosu_submit {	/** Input: Pointer to an array of struct drm_ethosu_job. */	__u64 jobs; 	/** Input: Number of jobs passed in. */	__u32 job_count; 	/** Input: Id returned by DRM_ETHOSU_PERFMON_CREATE */	__u32 perfmon_id;}; #define DRM_ETHOSU_MAX_PERF_EVENT_COUNTERS	8#define DRM_ETHOSU_MAX_PERF_COUNTERS \	(DRM_ETHOSU_MAX_PERF_EVENT_COUNTERS + 1) struct drm_ethosu_perfmon_create {	__u32 id;	__u32 ncounters;	__u16 counters[DRM_ETHOSU_MAX_PERF_EVENT_COUNTERS];}; struct drm_ethosu_perfmon_destroy {	__u32 id;	__u32 pad;}; /* * Returns the values of the performance counters tracked by this * perfmon (as an array of (ncounters + 1) u64 values). * * No implicit synchronization is performed, so the user has to * guarantee that any jobs using this perfmon have already been * completed. */struct drm_ethosu_perfmon_get_values {	__u32 id;	__u32 pad;	__u64 values_ptr;}; #define DRM_ETHOSU_PERFMON_CLEAR_GLOBAL    0x0001 /** * struct drm_ethosu_perfmon_set_global - ioctl to define a global performance * monitor * * The global performance monitor will be used for all jobs. If a global * performance monitor is defined, jobs with a self-defined performance * monitor won't be allowed. */struct drm_ethosu_perfmon_set_global {	__u32 flags;	__u32 id;}; /** * DRM_IOCTL_ETHOSU() - Build a ethosu IOCTL number * @__access: Access type. Must be R, W or RW. * @__id: One of the DRM_ETHOSU_xxx id. * @__type: Suffix of the type being passed to the IOCTL. * * Don't use this macro directly, use the DRM_IOCTL_ETHOSU_xxx * values instead. * * Return: An IOCTL number to be passed to ioctl() from userspace. */#define DRM_IOCTL_ETHOSU(__access, __id, __type) \	DRM_IO ## __access(DRM_COMMAND_BASE + DRM_ETHOSU_ ## __id, \			   struct drm_ethosu_ ## __type) enum {	DRM_IOCTL_ETHOSU_DEV_QUERY =		DRM_IOCTL_ETHOSU(WR, DEV_QUERY, dev_query),	DRM_IOCTL_ETHOSU_BO_CREATE =		DRM_IOCTL_ETHOSU(WR, BO_CREATE, bo_create),	DRM_IOCTL_ETHOSU_BO_WAIT =		DRM_IOCTL_ETHOSU(WR, BO_WAIT, bo_wait),	DRM_IOCTL_ETHOSU_BO_MMAP_OFFSET =		DRM_IOCTL_ETHOSU(WR, BO_MMAP_OFFSET, bo_mmap_offset),	DRM_IOCTL_ETHOSU_CMDSTREAM_BO_CREATE =		DRM_IOCTL_ETHOSU(WR, CMDSTREAM_BO_CREATE, cmdstream_bo_create),	DRM_IOCTL_ETHOSU_SUBMIT =		DRM_IOCTL_ETHOSU(WR, SUBMIT, submit),	DRM_IOCTL_ETHOSU_PERFMON_CREATE =		DRM_IOCTL_ETHOSU(WR, PERFMON_CREATE, perfmon_create),	DRM_IOCTL_ETHOSU_PERFMON_DESTROY =		DRM_IOCTL_ETHOSU(WR, PERFMON_DESTROY, perfmon_destroy),	DRM_IOCTL_ETHOSU_PERFMON_GET_VALUES =		DRM_IOCTL_ETHOSU(WR, PERFMON_GET_VALUES, perfmon_get_values),	DRM_IOCTL_ETHOSU_PERFMON_SET_GLOBAL =		DRM_IOCTL_ETHOSU(WR, PERFMON_SET_GLOBAL, perfmon_set_global),}; #if defined(__cplusplus)}#endif #endif /* _ETHOSU_DRM_H_ */