xref: /linux/drivers/accel/amdxdna/amdxdna_ctx.h (revision bbfd5594756011167b8f8de9a00e0c946afda1e6)
1be462c97SLizhi Hou /* SPDX-License-Identifier: GPL-2.0 */
2be462c97SLizhi Hou /*
3be462c97SLizhi Hou  * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
4be462c97SLizhi Hou  */
5be462c97SLizhi Hou 
6be462c97SLizhi Hou #ifndef _AMDXDNA_CTX_H_
7be462c97SLizhi Hou #define _AMDXDNA_CTX_H_
8be462c97SLizhi Hou 
9aac24309SLizhi Hou #include <linux/bitfield.h>
10aac24309SLizhi Hou 
11aac24309SLizhi Hou #include "amdxdna_gem.h"
12aac24309SLizhi Hou 
13aac24309SLizhi Hou struct amdxdna_hwctx_priv;
14aac24309SLizhi Hou 
15aac24309SLizhi Hou enum ert_cmd_opcode {
16aac24309SLizhi Hou 	ERT_START_CU      = 0,
17aac24309SLizhi Hou 	ERT_CMD_CHAIN     = 19,
18aac24309SLizhi Hou 	ERT_START_NPU     = 20,
19aac24309SLizhi Hou };
20aac24309SLizhi Hou 
21aac24309SLizhi Hou enum ert_cmd_state {
22aac24309SLizhi Hou 	ERT_CMD_STATE_INVALID,
23aac24309SLizhi Hou 	ERT_CMD_STATE_NEW,
24aac24309SLizhi Hou 	ERT_CMD_STATE_QUEUED,
25aac24309SLizhi Hou 	ERT_CMD_STATE_RUNNING,
26aac24309SLizhi Hou 	ERT_CMD_STATE_COMPLETED,
27aac24309SLizhi Hou 	ERT_CMD_STATE_ERROR,
28aac24309SLizhi Hou 	ERT_CMD_STATE_ABORT,
29aac24309SLizhi Hou 	ERT_CMD_STATE_SUBMITTED,
30aac24309SLizhi Hou 	ERT_CMD_STATE_TIMEOUT,
31aac24309SLizhi Hou 	ERT_CMD_STATE_NORESPONSE,
32aac24309SLizhi Hou };
33aac24309SLizhi Hou 
34aac24309SLizhi Hou /*
35aac24309SLizhi Hou  * Interpretation of the beginning of data payload for ERT_START_NPU in
36aac24309SLizhi Hou  * amdxdna_cmd. The rest of the payload in amdxdna_cmd is regular kernel args.
37aac24309SLizhi Hou  */
38aac24309SLizhi Hou struct amdxdna_cmd_start_npu {
39aac24309SLizhi Hou 	u64 buffer;       /* instruction buffer address */
40aac24309SLizhi Hou 	u32 buffer_size;  /* size of buffer in bytes */
41aac24309SLizhi Hou 	u32 prop_count;	  /* properties count */
42aac24309SLizhi Hou 	u32 prop_args[];  /* properties and regular kernel arguments */
43aac24309SLizhi Hou };
44aac24309SLizhi Hou 
45aac24309SLizhi Hou /*
46aac24309SLizhi Hou  * Interpretation of the beginning of data payload for ERT_CMD_CHAIN in
47aac24309SLizhi Hou  * amdxdna_cmd. The rest of the payload in amdxdna_cmd is cmd BO handles.
48aac24309SLizhi Hou  */
49aac24309SLizhi Hou struct amdxdna_cmd_chain {
50aac24309SLizhi Hou 	u32 command_count;
51aac24309SLizhi Hou 	u32 submit_index;
52aac24309SLizhi Hou 	u32 error_index;
53aac24309SLizhi Hou 	u32 reserved[3];
54aac24309SLizhi Hou 	u64 data[] __counted_by(command_count);
55aac24309SLizhi Hou };
56aac24309SLizhi Hou 
57ac49797cSLizhi Hou /* Exec buffer command header format */
58ac49797cSLizhi Hou #define AMDXDNA_CMD_STATE		GENMASK(3, 0)
59ac49797cSLizhi Hou #define AMDXDNA_CMD_EXTRA_CU_MASK	GENMASK(11, 10)
60ac49797cSLizhi Hou #define AMDXDNA_CMD_COUNT		GENMASK(22, 12)
61ac49797cSLizhi Hou #define AMDXDNA_CMD_OPCODE		GENMASK(27, 23)
62ac49797cSLizhi Hou struct amdxdna_cmd {
63ac49797cSLizhi Hou 	u32 header;
64ac49797cSLizhi Hou 	u32 data[];
65ac49797cSLizhi Hou };
66ac49797cSLizhi Hou 
67be462c97SLizhi Hou struct amdxdna_hwctx {
68be462c97SLizhi Hou 	struct amdxdna_client		*client;
69be462c97SLizhi Hou 	struct amdxdna_hwctx_priv	*priv;
70be462c97SLizhi Hou 	char				*name;
71be462c97SLizhi Hou 
72be462c97SLizhi Hou 	u32				id;
73be462c97SLizhi Hou 	u32				max_opc;
74be462c97SLizhi Hou 	u32				num_tiles;
75be462c97SLizhi Hou 	u32				mem_size;
76be462c97SLizhi Hou 	u32				fw_ctx_id;
77be462c97SLizhi Hou 	u32				col_list_len;
78be462c97SLizhi Hou 	u32				*col_list;
79be462c97SLizhi Hou 	u32				start_col;
80be462c97SLizhi Hou 	u32				num_col;
81be462c97SLizhi Hou #define HWCTX_STAT_INIT  0
82be462c97SLizhi Hou #define HWCTX_STAT_READY 1
83be462c97SLizhi Hou #define HWCTX_STAT_STOP  2
84be462c97SLizhi Hou 	u32				status;
85be462c97SLizhi Hou 	u32				old_status;
86be462c97SLizhi Hou 
87be462c97SLizhi Hou 	struct amdxdna_qos_info		     qos;
88be462c97SLizhi Hou 	struct amdxdna_hwctx_param_config_cu *cus;
89be462c97SLizhi Hou 	u32				syncobj_hdl;
90*4fd6ca90SLizhi Hou 
91*4fd6ca90SLizhi Hou 	atomic64_t			job_submit_cnt;
92*4fd6ca90SLizhi Hou 	atomic64_t			job_free_cnt ____cacheline_aligned_in_smp;
93be462c97SLizhi Hou };
94be462c97SLizhi Hou 
95aac24309SLizhi Hou #define drm_job_to_xdna_job(j) \
96aac24309SLizhi Hou 	container_of(j, struct amdxdna_sched_job, base)
97aac24309SLizhi Hou 
98aac24309SLizhi Hou struct amdxdna_sched_job {
99aac24309SLizhi Hou 	struct drm_sched_job	base;
100aac24309SLizhi Hou 	struct kref		refcnt;
101aac24309SLizhi Hou 	struct amdxdna_hwctx	*hwctx;
102aac24309SLizhi Hou 	struct mm_struct	*mm;
103aac24309SLizhi Hou 	/* The fence to notice DRM scheduler that job is done by hardware */
104aac24309SLizhi Hou 	struct dma_fence	*fence;
105aac24309SLizhi Hou 	/* user can wait on this fence */
106aac24309SLizhi Hou 	struct dma_fence	*out_fence;
107aac24309SLizhi Hou 	bool			job_done;
108aac24309SLizhi Hou 	u64			seq;
109aac24309SLizhi Hou 	struct amdxdna_gem_obj	*cmd_bo;
110aac24309SLizhi Hou 	size_t			bo_cnt;
111aac24309SLizhi Hou 	struct drm_gem_object	*bos[] __counted_by(bo_cnt);
112aac24309SLizhi Hou };
113aac24309SLizhi Hou 
114aac24309SLizhi Hou static inline u32
115aac24309SLizhi Hou amdxdna_cmd_get_op(struct amdxdna_gem_obj *abo)
116aac24309SLizhi Hou {
117aac24309SLizhi Hou 	struct amdxdna_cmd *cmd = abo->mem.kva;
118aac24309SLizhi Hou 
119aac24309SLizhi Hou 	return FIELD_GET(AMDXDNA_CMD_OPCODE, cmd->header);
120aac24309SLizhi Hou }
121aac24309SLizhi Hou 
122aac24309SLizhi Hou static inline void
123aac24309SLizhi Hou amdxdna_cmd_set_state(struct amdxdna_gem_obj *abo, enum ert_cmd_state s)
124aac24309SLizhi Hou {
125aac24309SLizhi Hou 	struct amdxdna_cmd *cmd = abo->mem.kva;
126aac24309SLizhi Hou 
127aac24309SLizhi Hou 	cmd->header &= ~AMDXDNA_CMD_STATE;
128aac24309SLizhi Hou 	cmd->header |= FIELD_PREP(AMDXDNA_CMD_STATE, s);
129aac24309SLizhi Hou }
130aac24309SLizhi Hou 
131aac24309SLizhi Hou static inline enum ert_cmd_state
132aac24309SLizhi Hou amdxdna_cmd_get_state(struct amdxdna_gem_obj *abo)
133aac24309SLizhi Hou {
134aac24309SLizhi Hou 	struct amdxdna_cmd *cmd = abo->mem.kva;
135aac24309SLizhi Hou 
136aac24309SLizhi Hou 	return FIELD_GET(AMDXDNA_CMD_STATE, cmd->header);
137aac24309SLizhi Hou }
138aac24309SLizhi Hou 
139aac24309SLizhi Hou void *amdxdna_cmd_get_payload(struct amdxdna_gem_obj *abo, u32 *size);
140aac24309SLizhi Hou int amdxdna_cmd_get_cu_idx(struct amdxdna_gem_obj *abo);
141aac24309SLizhi Hou 
142aac24309SLizhi Hou static inline u32 amdxdna_hwctx_col_map(struct amdxdna_hwctx *hwctx)
143aac24309SLizhi Hou {
144aac24309SLizhi Hou 	return GENMASK(hwctx->start_col + hwctx->num_col - 1,
145aac24309SLizhi Hou 		       hwctx->start_col);
146aac24309SLizhi Hou }
147aac24309SLizhi Hou 
148aac24309SLizhi Hou void amdxdna_sched_job_cleanup(struct amdxdna_sched_job *job);
149be462c97SLizhi Hou void amdxdna_hwctx_remove_all(struct amdxdna_client *client);
150bed4c73eSLizhi Hou void amdxdna_hwctx_suspend(struct amdxdna_client *client);
151bed4c73eSLizhi Hou void amdxdna_hwctx_resume(struct amdxdna_client *client);
152aac24309SLizhi Hou 
153aac24309SLizhi Hou int amdxdna_cmd_submit(struct amdxdna_client *client,
154aac24309SLizhi Hou 		       u32 cmd_bo_hdls, u32 *arg_bo_hdls, u32 arg_bo_cnt,
155aac24309SLizhi Hou 		       u32 hwctx_hdl, u64 *seq);
156aac24309SLizhi Hou 
157aac24309SLizhi Hou int amdxdna_cmd_wait(struct amdxdna_client *client, u32 hwctx_hdl,
158aac24309SLizhi Hou 		     u64 seq, u32 timeout);
159aac24309SLizhi Hou 
160be462c97SLizhi Hou int amdxdna_drm_create_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
161be462c97SLizhi Hou int amdxdna_drm_config_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
162be462c97SLizhi Hou int amdxdna_drm_destroy_hwctx_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
163aac24309SLizhi Hou int amdxdna_drm_submit_cmd_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
164be462c97SLizhi Hou 
165be462c97SLizhi Hou #endif /* _AMDXDNA_CTX_H_ */
166