/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
 */

#ifndef _UAPI_AMDXDNA_ACCEL_H_
#define _UAPI_AMDXDNA_ACCEL_H_

#include <linux/stddef.h>
#include "drm.h"

#if defined(__cplusplus)
extern "C" {
#endif

#define AMDXDNA_INVALID_CMD_HANDLE	(~0UL)
#define AMDXDNA_INVALID_ADDR		(~0UL)
#define AMDXDNA_INVALID_CTX_HANDLE	0
#define AMDXDNA_INVALID_BO_HANDLE	0
#define AMDXDNA_INVALID_FENCE_HANDLE	0
#define AMDXDNA_INVALID_DOORBELL_OFFSET	(~0U)

/*
 * Define hardware context priority
 */
#define AMDXDNA_QOS_REALTIME_PRIORITY	0x100
#define AMDXDNA_QOS_HIGH_PRIORITY	0x180
#define AMDXDNA_QOS_NORMAL_PRIORITY	0x200
#define AMDXDNA_QOS_LOW_PRIORITY	0x280

enum amdxdna_device_type {
	AMDXDNA_DEV_TYPE_UNKNOWN = -1,
	AMDXDNA_DEV_TYPE_KMQ = 0,
	AMDXDNA_DEV_TYPE_UMQ = 1,
	AMDXDNA_DEV_TYPE_PF = 2,
};

enum amdxdna_drm_ioctl_id {
	DRM_AMDXDNA_CREATE_HWCTX,
	DRM_AMDXDNA_DESTROY_HWCTX,
	DRM_AMDXDNA_CONFIG_HWCTX,
	DRM_AMDXDNA_CREATE_BO,
	DRM_AMDXDNA_GET_BO_INFO,
	DRM_AMDXDNA_SYNC_BO,
	DRM_AMDXDNA_EXEC_CMD,
	DRM_AMDXDNA_GET_INFO,
	DRM_AMDXDNA_SET_STATE,
	DRM_AMDXDNA_WAIT_CMD,
	DRM_AMDXDNA_GET_ARRAY,
};

/**
 * struct qos_info - QoS information for driver.
 * @gops: Giga operations per second.
 * @fps: Frames per second.
 * @dma_bandwidth: DMA bandwidtha.
 * @latency: Frame response latency.
 * @frame_exec_time: Frame execution time.
 * @priority: Request priority.
 *
 * User program can provide QoS hints to driver.
 */
struct amdxdna_qos_info {
	__u32 gops;
	__u32 fps;
	__u32 dma_bandwidth;
	__u32 latency;
	__u32 frame_exec_time;
	__u32 priority;
};

/**
 * struct amdxdna_drm_create_hwctx - Create hardware context.
 * @ext: MBZ.
 * @ext_flags: MBZ.
 * @qos_p: Address of QoS info.
 * @umq_bo: BO handle for user mode queue(UMQ).
 * @log_buf_bo: BO handle for log buffer.
 * @max_opc: Maximum operations per cycle.
 * @num_tiles: Number of AIE tiles.
 * @mem_size: Size of AIE tile memory.
 * @umq_doorbell: Returned offset of doorbell associated with UMQ.
 * @handle: Returned hardware context handle.
 * @syncobj_handle: Returned syncobj handle for command completion.
 */
struct amdxdna_drm_create_hwctx {
	__u64 ext;
	__u64 ext_flags;
	__u64 qos_p;
	__u32 umq_bo;
	__u32 log_buf_bo;
	__u32 max_opc;
	__u32 num_tiles;
	__u32 mem_size;
	__u32 umq_doorbell;
	__u32 handle;
	__u32 syncobj_handle;
};

/**
 * struct amdxdna_drm_destroy_hwctx - Destroy hardware context.
 * @handle: Hardware context handle.
 * @pad: MBZ.
 */
struct amdxdna_drm_destroy_hwctx {
	__u32 handle;
	__u32 pad;
};

/**
 * struct amdxdna_cu_config - configuration for one CU
 * @cu_bo: CU configuration buffer bo handle.
 * @cu_func: Function of a CU.
 * @pad: MBZ.
 */
struct amdxdna_cu_config {
	__u32 cu_bo;
	__u8  cu_func;
	__u8  pad[3];
};

/**
 * struct amdxdna_hwctx_param_config_cu - configuration for CUs in hardware context
 * @num_cus: Number of CUs to configure.
 * @pad: MBZ.
 * @cu_configs: Array of CU configurations of struct amdxdna_cu_config.
 */
struct amdxdna_hwctx_param_config_cu {
	__u16 num_cus;
	__u16 pad[3];
	struct amdxdna_cu_config cu_configs[] __counted_by(num_cus);
};

enum amdxdna_drm_config_hwctx_param {
	DRM_AMDXDNA_HWCTX_CONFIG_CU,
	DRM_AMDXDNA_HWCTX_ASSIGN_DBG_BUF,
	DRM_AMDXDNA_HWCTX_REMOVE_DBG_BUF,
};

/**
 * struct amdxdna_drm_config_hwctx - Configure hardware context.
 * @handle: hardware context handle.
 * @param_type: Value in enum amdxdna_drm_config_hwctx_param. Specifies the
 *              structure passed in via param_val.
 * @param_val: A structure specified by the param_type struct member.
 * @param_val_size: Size of the parameter buffer pointed to by the param_val.
 *		    If param_val is not a pointer, driver can ignore this.
 * @pad: MBZ.
 *
 * Note: if the param_val is a pointer pointing to a buffer, the maximum size
 * of the buffer is 4KiB(PAGE_SIZE).
 */
struct amdxdna_drm_config_hwctx {
	__u32 handle;
	__u32 param_type;
	__u64 param_val;
	__u32 param_val_size;
	__u32 pad;
};

enum amdxdna_bo_type {
	AMDXDNA_BO_INVALID = 0,
	AMDXDNA_BO_SHMEM = 1, /* Be compatible with legacy application code. */
	AMDXDNA_BO_SHARE = 1,
	AMDXDNA_BO_DEV_HEAP = 2,
	AMDXDNA_BO_DEV = 3,
	AMDXDNA_BO_CMD = 4,
};

/**
 * struct amdxdna_drm_va_entry
 * @vaddr: Virtual address.
 * @len: Size of entry.
 */
struct amdxdna_drm_va_entry {
	__u64 vaddr;
	__u64 len;
};

/**
 * struct amdxdna_drm_va_tbl
 * @dmabuf_fd: The fd of dmabuf.
 * @num_entries: Number of va entries.
 * @va_entries: Array of va entries.
 *
 * The input can be either a dmabuf fd or a virtual address entry table.
 * When dmabuf_fd is used, num_entries must be zero.
 */
struct amdxdna_drm_va_tbl {
	__s32 dmabuf_fd;
	__u32 num_entries;
	struct amdxdna_drm_va_entry va_entries[];
};

/**
 * struct amdxdna_drm_create_bo - Create a buffer object.
 * @flags: Buffer flags. MBZ.
 * @vaddr: User VA of buffer if applied. MBZ.
 * @size: Size in bytes.
 * @type: Buffer type.
 * @handle: Returned DRM buffer object handle.
 */
struct amdxdna_drm_create_bo {
	__u64	flags;
	__u64	vaddr;
	__u64	size;
	__u32	type;
	__u32	handle;
};

/**
 * struct amdxdna_drm_get_bo_info - Get buffer object information.
 * @ext: MBZ.
 * @ext_flags: MBZ.
 * @handle: DRM buffer object handle.
 * @pad: MBZ.
 * @map_offset: Returned DRM fake offset for mmap().
 * @vaddr: Returned user VA of buffer. 0 in case user needs mmap().
 * @xdna_addr: Returned XDNA device virtual address.
 */
struct amdxdna_drm_get_bo_info {
	__u64 ext;
	__u64 ext_flags;
	__u32 handle;
	__u32 pad;
	__u64 map_offset;
	__u64 vaddr;
	__u64 xdna_addr;
};

/**
 * struct amdxdna_drm_sync_bo - Sync buffer object.
 * @handle: Buffer object handle.
 * @direction: Direction of sync, can be from device or to device.
 * @offset: Offset in the buffer to sync.
 * @size: Size in bytes.
 */
struct amdxdna_drm_sync_bo {
	__u32 handle;
#define SYNC_DIRECT_TO_DEVICE	0U
#define SYNC_DIRECT_FROM_DEVICE	1U
	__u32 direction;
	__u64 offset;
	__u64 size;
};

enum amdxdna_cmd_type {
	AMDXDNA_CMD_SUBMIT_EXEC_BUF = 0,
	AMDXDNA_CMD_SUBMIT_DEPENDENCY,
	AMDXDNA_CMD_SUBMIT_SIGNAL,
};

/**
 * struct amdxdna_drm_exec_cmd - Execute command.
 * @ext: MBZ.
 * @ext_flags: MBZ.
 * @hwctx: Hardware context handle.
 * @type: One of command type in enum amdxdna_cmd_type.
 * @cmd_handles: Array of command handles or the command handle itself
 *               in case of just one.
 * @args: Array of arguments for all command handles.
 * @cmd_count: Number of command handles in the cmd_handles array.
 * @arg_count: Number of arguments in the args array.
 * @seq: Returned sequence number for this command.
 */
struct amdxdna_drm_exec_cmd {
	__u64 ext;
	__u64 ext_flags;
	__u32 hwctx;
	__u32 type;
	__u64 cmd_handles;
	__u64 args;
	__u32 cmd_count;
	__u32 arg_count;
	__u64 seq;
};

/**
 * struct amdxdna_drm_wait_cmd - Wait execution command.
 *
 * @hwctx: Context handle.
 * @timeout: timeout in ms, 0 implies infinite wait.
 * @seq: sequence number of the command returned by execute command.
 *
 * Wait a command specified by seq to be completed.
 */
struct amdxdna_drm_wait_cmd {
	__u32 hwctx;
	__u32 timeout;
	__u64 seq;
};

/**
 * struct amdxdna_drm_query_aie_status - Query the status of the AIE hardware
 * @buffer: The user space buffer that will return the AIE status.
 * @buffer_size: The size of the user space buffer.
 * @cols_filled: A bitmap of AIE columns whose data has been returned in the buffer.
 */
struct amdxdna_drm_query_aie_status {
	__u64 buffer; /* out */
	__u32 buffer_size; /* in */
	__u32 cols_filled; /* out */
};

/**
 * struct amdxdna_drm_query_aie_version - Query the version of the AIE hardware
 * @major: The major version number.
 * @minor: The minor version number.
 */
struct amdxdna_drm_query_aie_version {
	__u32 major; /* out */
	__u32 minor; /* out */
};

/**
 * struct amdxdna_drm_query_aie_tile_metadata - Query the metadata of AIE tile (core, mem, shim)
 * @row_count: The number of rows.
 * @row_start: The starting row number.
 * @dma_channel_count: The number of dma channels.
 * @lock_count: The number of locks.
 * @event_reg_count: The number of events.
 * @pad: Structure padding.
 */
struct amdxdna_drm_query_aie_tile_metadata {
	__u16 row_count;
	__u16 row_start;
	__u16 dma_channel_count;
	__u16 lock_count;
	__u16 event_reg_count;
	__u16 pad[3];
};

/**
 * struct amdxdna_drm_query_aie_metadata - Query the metadata of the AIE hardware
 * @col_size: The size of a column in bytes.
 * @cols: The total number of columns.
 * @rows: The total number of rows.
 * @version: The version of the AIE hardware.
 * @core: The metadata for all core tiles.
 * @mem: The metadata for all mem tiles.
 * @shim: The metadata for all shim tiles.
 */
struct amdxdna_drm_query_aie_metadata {
	__u32 col_size;
	__u16 cols;
	__u16 rows;
	struct amdxdna_drm_query_aie_version version;
	struct amdxdna_drm_query_aie_tile_metadata core;
	struct amdxdna_drm_query_aie_tile_metadata mem;
	struct amdxdna_drm_query_aie_tile_metadata shim;
};

/**
 * struct amdxdna_drm_query_clock - Metadata for a clock
 * @name: The clock name.
 * @freq_mhz: The clock frequency.
 * @pad: Structure padding.
 */
struct amdxdna_drm_query_clock {
	__u8 name[16];
	__u32 freq_mhz;
	__u32 pad;
};

/**
 * struct amdxdna_drm_query_clock_metadata - Query metadata for clocks
 * @mp_npu_clock: The metadata for MP-NPU clock.
 * @h_clock: The metadata for H clock.
 */
struct amdxdna_drm_query_clock_metadata {
	struct amdxdna_drm_query_clock mp_npu_clock;
	struct amdxdna_drm_query_clock h_clock;
};

enum amdxdna_sensor_type {
	AMDXDNA_SENSOR_TYPE_POWER,
	AMDXDNA_SENSOR_TYPE_COLUMN_UTILIZATION
};

/**
 * struct amdxdna_drm_query_sensor - The data for single sensor.
 * @label: The name for a sensor.
 * @input: The current value of the sensor.
 * @max: The maximum value possible for the sensor.
 * @average: The average value of the sensor.
 * @highest: The highest recorded sensor value for this driver load for the sensor.
 * @status: The sensor status.
 * @units: The sensor units.
 * @unitm: Translates value member variables into the correct unit via (pow(10, unitm) * value).
 * @type: The sensor type from enum amdxdna_sensor_type.
 * @pad: Structure padding.
 */
struct amdxdna_drm_query_sensor {
	__u8  label[64];
	__u32 input;
	__u32 max;
	__u32 average;
	__u32 highest;
	__u8  status[64];
	__u8  units[16];
	__s8  unitm;
	__u8  type;
	__u8  pad[6];
};

/**
 * struct amdxdna_drm_query_hwctx - The data for single context.
 * @context_id: The ID for this context.
 * @start_col: The starting column for the partition assigned to this context.
 * @num_col: The number of columns in the partition assigned to this context.
 * @pad: Structure padding.
 * @pid: The Process ID of the process that created this context.
 * @command_submissions: The number of commands submitted to this context.
 * @command_completions: The number of commands completed by this context.
 * @migrations: The number of times this context has been moved to a different partition.
 * @preemptions: The number of times this context has been preempted by another context in the
 *               same partition.
 * @errors: The errors for this context.
 */
struct amdxdna_drm_query_hwctx {
	__u32 context_id;
	__u32 start_col;
	__u32 num_col;
	__u32 pad;
	__s64 pid;
	__u64 command_submissions;
	__u64 command_completions;
	__u64 migrations;
	__u64 preemptions;
	__u64 errors;
};

enum amdxdna_power_mode_type {
	POWER_MODE_DEFAULT, /* Fallback to calculated DPM */
	POWER_MODE_LOW,     /* Set frequency to lowest DPM */
	POWER_MODE_MEDIUM,  /* Set frequency to medium DPM */
	POWER_MODE_HIGH,    /* Set frequency to highest DPM */
	POWER_MODE_TURBO,   /* Maximum power */
};

/**
 * struct amdxdna_drm_get_power_mode - Get the configured power mode
 * @power_mode: The mode type from enum amdxdna_power_mode_type
 * @pad: Structure padding.
 */
struct amdxdna_drm_get_power_mode {
	__u8 power_mode;
	__u8 pad[7];
};

/**
 * struct amdxdna_drm_query_firmware_version - Query the firmware version
 * @major: The major version number
 * @minor: The minor version number
 * @patch: The patch level version number
 * @build: The build ID
 */
struct amdxdna_drm_query_firmware_version {
	__u32 major; /* out */
	__u32 minor; /* out */
	__u32 patch; /* out */
	__u32 build; /* out */
};

enum amdxdna_drm_get_param {
	DRM_AMDXDNA_QUERY_AIE_STATUS,
	DRM_AMDXDNA_QUERY_AIE_METADATA,
	DRM_AMDXDNA_QUERY_AIE_VERSION,
	DRM_AMDXDNA_QUERY_CLOCK_METADATA,
	DRM_AMDXDNA_QUERY_SENSORS,
	DRM_AMDXDNA_QUERY_HW_CONTEXTS,
	DRM_AMDXDNA_QUERY_FIRMWARE_VERSION = 8,
	DRM_AMDXDNA_GET_POWER_MODE,
	DRM_AMDXDNA_QUERY_TELEMETRY,
	DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE,
	DRM_AMDXDNA_QUERY_RESOURCE_INFO,
	DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE,
};

/**
 * struct amdxdna_drm_get_resource_info - Get resource information
 */
struct amdxdna_drm_get_resource_info {
	/** @npu_clk_max: max H-Clocks */
	__u64 npu_clk_max;
	/** @npu_tops_max: max TOPs */
	__u64 npu_tops_max;
	/** @npu_task_max: max number of tasks */
	__u64 npu_task_max;
	/** @npu_tops_curr: current TOPs */
	__u64 npu_tops_curr;
	/** @npu_task_curr: current number of tasks */
	__u64 npu_task_curr;
};

/**
 * struct amdxdna_drm_attribute_state - State of an attribute
 */
struct amdxdna_drm_attribute_state {
	/** @state: enabled or disabled */
	__u8 state;
	/** @pad: MBZ */
	__u8 pad[7];
};

/**
 * struct amdxdna_drm_query_telemetry_header - Telemetry data header
 */
struct amdxdna_drm_query_telemetry_header {
	/** @major: Firmware telemetry interface major version number */
	__u32 major;
	/** @minor: Firmware telemetry interface minor version number */
	__u32 minor;
	/** @type: Telemetry query type */
	__u32 type;
	/** @map_num_elements: Total number of elements in the map table */
	__u32 map_num_elements;
	/** @map: Element map */
	__u32 map[];
};

/**
 * struct amdxdna_drm_get_info - Get some information from the AIE hardware.
 * @param: Value in enum amdxdna_drm_get_param. Specifies the structure passed in the buffer.
 * @buffer_size: Size of the input buffer. Size needed/written by the kernel.
 * @buffer: A structure specified by the param struct member.
 */
struct amdxdna_drm_get_info {
	__u32 param; /* in */
	__u32 buffer_size; /* in/out */
	__u64 buffer; /* in/out */
};

#define AMDXDNA_HWCTX_STATE_IDLE	0
#define AMDXDNA_HWCTX_STATE_ACTIVE	1

/**
 * struct amdxdna_drm_hwctx_entry - The hardware context array entry
 */
struct amdxdna_drm_hwctx_entry {
	/** @context_id: Context ID. */
	__u32 context_id;
	/** @start_col: Start AIE array column assigned to context. */
	__u32 start_col;
	/** @num_col: Number of AIE array columns assigned to context. */
	__u32 num_col;
	/** @hwctx_id: The real hardware context id. */
	__u32 hwctx_id;
	/** @pid: ID of process which created this context. */
	__s64 pid;
	/** @command_submissions: Number of commands submitted. */
	__u64 command_submissions;
	/** @command_completions: Number of commands completed. */
	__u64 command_completions;
	/** @migrations: Number of times been migrated. */
	__u64 migrations;
	/** @preemptions: Number of times been preempted. */
	__u64 preemptions;
	/** @errors: Number of errors happened. */
	__u64 errors;
	/** @priority: Context priority. */
	__u64 priority;
	/** @heap_usage: Usage of device heap buffer. */
	__u64 heap_usage;
	/** @suspensions: Number of times been suspended. */
	__u64 suspensions;
	/**
	 * @state: Context state.
	 * %AMDXDNA_HWCTX_STATE_IDLE
	 * %AMDXDNA_HWCTX_STATE_ACTIVE
	 */
	__u32 state;
	/** @pasid: PASID been bound. */
	__u32 pasid;
	/** @gops: Giga operations per second. */
	__u32 gops;
	/** @fps: Frames per second. */
	__u32 fps;
	/** @dma_bandwidth: DMA bandwidth. */
	__u32 dma_bandwidth;
	/** @latency: Frame response latency. */
	__u32 latency;
	/** @frame_exec_time: Frame execution time. */
	__u32 frame_exec_time;
	/** @txn_op_idx: Index of last control code executed. */
	__u32 txn_op_idx;
	/** @ctx_pc: Program counter. */
	__u32 ctx_pc;
	/** @fatal_error_type: Fatal error type if context crashes. */
	__u32 fatal_error_type;
	/** @fatal_error_exception_type: Firmware exception type. */
	__u32 fatal_error_exception_type;
	/** @fatal_error_exception_pc: Firmware exception program counter. */
	__u32 fatal_error_exception_pc;
	/** @fatal_error_app_module: Exception module name. */
	__u32 fatal_error_app_module;
	/** @pad: Structure pad. */
	__u32 pad;
};

/**
 * struct amdxdna_async_error - XDNA async error structure
 */
struct amdxdna_async_error {
	/** @err_code: Error code. */
	__u64 err_code;
	/** @ts_us: Timestamp. */
	__u64 ts_us;
	/** @ex_err_code: Extra error code */
	__u64 ex_err_code;
};

/**
 * struct amdxdna_drm_bo_usage - all types of BO usage
 * BOs managed by XRT/SHIM/driver is counted as internal.
 * Others are counted as external which are managed by applications.
 *
 * Among all types of BOs:
 *   AMDXDNA_BO_DEV_HEAP - is counted for internal.
 *   AMDXDNA_BO_SHARE    - is counted for external.
 *   AMDXDNA_BO_CMD      - is counted for internal.
 *   AMDXDNA_BO_DEV      - is counted by heap_usage only, not internal
 *                         or external. It does not add to the total memory
 *                         footprint since its mem comes from heap which is
 *                         already counted as internal.
 */
struct amdxdna_drm_bo_usage {
	/** @pid: The ID of the process to query from. */
	__s64 pid;
	/** @total_usage: Total BO size used by process. */
	__u64 total_usage;
	/** @internal_usage: Total internal BO size used by process. */
	__u64 internal_usage;
	/** @heap_usage: Total device BO size used by process. */
	__u64 heap_usage;
};

/*
 * Supported params in struct amdxdna_drm_get_array
 */
#define DRM_AMDXDNA_HW_CONTEXT_ALL	0
#define DRM_AMDXDNA_HW_LAST_ASYNC_ERR	2
#define DRM_AMDXDNA_BO_USAGE		6

/**
 * struct amdxdna_drm_get_array - Get information array.
 */
struct amdxdna_drm_get_array {
	/**
	 * @param:
	 *
	 * Supported params:
	 *
	 * %DRM_AMDXDNA_HW_CONTEXT_ALL:
	 * Returns all created hardware contexts.
	 *
	 * %DRM_AMDXDNA_HW_LAST_ASYNC_ERR:
	 * Returns last async error.
	 *
	 * %DRM_AMDXDNA_BO_USAGE:
	 * Returns usage of heap/internal/external BOs.
	 */
	__u32 param;
	/**
	 * @element_size:
	 *
	 * Specifies maximum element size and returns the actual element size.
	 */
	__u32 element_size;
	/**
	 * @num_element:
	 *
	 * Specifies maximum number of elements and returns the actual number
	 * of elements.
	 */
	__u32 num_element; /* in/out */
	/** @pad: MBZ */
	__u32 pad;
	/**
	 * @buffer:
	 *
	 * Specifies the match conditions and returns the matched information
	 * array.
	 */
	__u64 buffer;
};

enum amdxdna_drm_set_param {
	DRM_AMDXDNA_SET_POWER_MODE,
	DRM_AMDXDNA_WRITE_AIE_MEM,
	DRM_AMDXDNA_WRITE_AIE_REG,
	DRM_AMDXDNA_SET_FORCE_PREEMPT,
	DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT,
};

/**
 * struct amdxdna_drm_set_state - Set the state of the AIE hardware.
 * @param: Value in enum amdxdna_drm_set_param.
 * @buffer_size: Size of the input param.
 * @buffer: Pointer to the input param.
 */
struct amdxdna_drm_set_state {
	__u32 param; /* in */
	__u32 buffer_size; /* in */
	__u64 buffer; /* in */
};

/**
 * struct amdxdna_drm_set_power_mode - Set the power mode of the AIE hardware
 * @power_mode: The sensor type from enum amdxdna_power_mode_type
 * @pad: MBZ.
 */
struct amdxdna_drm_set_power_mode {
	__u8 power_mode;
	__u8 pad[7];
};

#define DRM_IOCTL_AMDXDNA_CREATE_HWCTX \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_CREATE_HWCTX, \
		 struct amdxdna_drm_create_hwctx)

#define DRM_IOCTL_AMDXDNA_DESTROY_HWCTX \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_DESTROY_HWCTX, \
		 struct amdxdna_drm_destroy_hwctx)

#define DRM_IOCTL_AMDXDNA_CONFIG_HWCTX \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_CONFIG_HWCTX, \
		 struct amdxdna_drm_config_hwctx)

#define DRM_IOCTL_AMDXDNA_CREATE_BO \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_CREATE_BO, \
		 struct amdxdna_drm_create_bo)

#define DRM_IOCTL_AMDXDNA_GET_BO_INFO \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_GET_BO_INFO, \
		 struct amdxdna_drm_get_bo_info)

#define DRM_IOCTL_AMDXDNA_SYNC_BO \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_SYNC_BO, \
		 struct amdxdna_drm_sync_bo)

#define DRM_IOCTL_AMDXDNA_EXEC_CMD \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_EXEC_CMD, \
		 struct amdxdna_drm_exec_cmd)

#define DRM_IOCTL_AMDXDNA_GET_INFO \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_GET_INFO, \
		 struct amdxdna_drm_get_info)

#define DRM_IOCTL_AMDXDNA_SET_STATE \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_SET_STATE, \
		 struct amdxdna_drm_set_state)

#define DRM_IOCTL_AMDXDNA_GET_ARRAY \
	DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDXDNA_GET_ARRAY, \
		 struct amdxdna_drm_get_array)

#define DRM_IOCTL_AMDXDNA_WAIT_CMD \
	DRM_IOW(DRM_COMMAND_BASE + DRM_AMDXDNA_WAIT_CMD, \
		struct amdxdna_drm_wait_cmd)

#if defined(__cplusplus)
} /* extern c end */
#endif

#endif /* _UAPI_AMDXDNA_ACCEL_H_ */
