xref: /linux/drivers/accel/amdxdna/amdxdna_pci_drv.h (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce) !
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
4  */
5 
6 #ifndef _AMDXDNA_PCI_DRV_H_
7 #define _AMDXDNA_PCI_DRV_H_
8 
9 #include <linux/workqueue.h>
10 #include <linux/xarray.h>
11 
12 #define XDNA_INFO(xdna, fmt, args...)	drm_info(&(xdna)->ddev, fmt, ##args)
13 #define XDNA_WARN(xdna, fmt, args...)	drm_warn(&(xdna)->ddev, "%s: "fmt, __func__, ##args)
14 #define XDNA_ERR(xdna, fmt, args...)	drm_err(&(xdna)->ddev, "%s: "fmt, __func__, ##args)
15 #define XDNA_DBG(xdna, fmt, args...)	drm_dbg(&(xdna)->ddev, fmt, ##args)
16 #define XDNA_INFO_ONCE(xdna, fmt, args...) drm_info_once(&(xdna)->ddev, fmt, ##args)
17 
18 #define XDNA_MBZ_DBG(xdna, ptr, sz)					\
19 	({								\
20 		int __i;						\
21 		int __ret = 0;						\
22 		u8 *__ptr = (u8 *)(ptr);				\
23 		for (__i = 0; __i < (sz); __i++) {			\
24 			if (__ptr[__i]) {				\
25 				XDNA_DBG(xdna, "MBZ check failed");	\
26 				__ret = -EINVAL;			\
27 				break;					\
28 			}						\
29 		}							\
30 		__ret;							\
31 	})
32 
33 #define to_xdna_dev(drm_dev) \
34 	((struct amdxdna_dev *)container_of(drm_dev, struct amdxdna_dev, ddev))
35 
36 extern const struct drm_driver amdxdna_drm_drv;
37 
38 struct amdxdna_client;
39 struct amdxdna_dev;
40 struct amdxdna_drm_get_info;
41 struct amdxdna_drm_set_state;
42 struct amdxdna_gem_obj;
43 struct amdxdna_hwctx;
44 struct amdxdna_sched_job;
45 
46 /*
47  * struct amdxdna_dev_ops - Device hardware operation callbacks
48  */
49 struct amdxdna_dev_ops {
50 	int (*init)(struct amdxdna_dev *xdna);
51 	void (*fini)(struct amdxdna_dev *xdna);
52 	int (*resume)(struct amdxdna_dev *xdna);
53 	void (*suspend)(struct amdxdna_dev *xdna);
54 	int (*hwctx_init)(struct amdxdna_hwctx *hwctx);
55 	void (*hwctx_fini)(struct amdxdna_hwctx *hwctx);
56 	int (*hwctx_config)(struct amdxdna_hwctx *hwctx, u32 type, u64 value, void *buf, u32 size);
57 	void (*hmm_invalidate)(struct amdxdna_gem_obj *abo, unsigned long cur_seq);
58 	void (*hwctx_suspend)(struct amdxdna_hwctx *hwctx);
59 	void (*hwctx_resume)(struct amdxdna_hwctx *hwctx);
60 	int (*cmd_submit)(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job, u64 *seq);
61 	int (*get_aie_info)(struct amdxdna_client *client, struct amdxdna_drm_get_info *args);
62 	int (*set_aie_state)(struct amdxdna_client *client, struct amdxdna_drm_set_state *args);
63 };
64 
65 /*
66  * struct amdxdna_dev_info - Device hardware information
67  * Record device static information, like reg, mbox, PSP, SMU bar index
68  */
69 struct amdxdna_dev_info {
70 	int				reg_bar;
71 	int				mbox_bar;
72 	int				sram_bar;
73 	int				psp_bar;
74 	int				smu_bar;
75 	int				device_type;
76 	int				first_col;
77 	u32				dev_mem_buf_shift;
78 	u64				dev_mem_base;
79 	size_t				dev_mem_size;
80 	char				*vbnv;
81 	const struct amdxdna_dev_priv	*dev_priv;
82 	const struct amdxdna_dev_ops	*ops;
83 };
84 
85 struct amdxdna_fw_ver {
86 	u32 major;
87 	u32 minor;
88 	u32 sub;
89 	u32 build;
90 };
91 
92 struct amdxdna_dev {
93 	struct drm_device		ddev;
94 	struct amdxdna_dev_hdl		*dev_handle;
95 	const struct amdxdna_dev_info	*dev_info;
96 	void				*xrs_hdl;
97 
98 	struct mutex			dev_lock; /* per device lock */
99 	struct list_head		client_list;
100 	struct amdxdna_fw_ver		fw_ver;
101 	struct rw_semaphore		notifier_lock; /* for mmu notifier*/
102 	struct workqueue_struct		*notifier_wq;
103 };
104 
105 /*
106  * struct amdxdna_device_id - PCI device info
107  */
108 struct amdxdna_device_id {
109 	unsigned short device;
110 	u8 revision;
111 	const struct amdxdna_dev_info *dev_info;
112 };
113 
114 /*
115  * struct amdxdna_client - amdxdna client
116  * A per fd data structure for managing context and other user process stuffs.
117  */
118 struct amdxdna_client {
119 	struct list_head		node;
120 	pid_t				pid;
121 	struct mutex			hwctx_lock; /* protect hwctx */
122 	/* do NOT wait this srcu when hwctx_lock is held */
123 	struct srcu_struct		hwctx_srcu;
124 	struct xarray			hwctx_xa;
125 	u32				next_hwctxid;
126 	struct amdxdna_dev		*xdna;
127 	struct drm_file			*filp;
128 
129 	struct mutex			mm_lock; /* protect memory related */
130 	struct amdxdna_gem_obj		*dev_heap;
131 
132 	struct iommu_sva		*sva;
133 	int				pasid;
134 };
135 
136 #define amdxdna_for_each_hwctx(client, hwctx_id, entry)		\
137 	xa_for_each(&(client)->hwctx_xa, hwctx_id, entry)
138 
139 /* Add device info below */
140 extern const struct amdxdna_dev_info dev_npu1_info;
141 extern const struct amdxdna_dev_info dev_npu2_info;
142 extern const struct amdxdna_dev_info dev_npu4_info;
143 extern const struct amdxdna_dev_info dev_npu5_info;
144 extern const struct amdxdna_dev_info dev_npu6_info;
145 
146 int amdxdna_sysfs_init(struct amdxdna_dev *xdna);
147 void amdxdna_sysfs_fini(struct amdxdna_dev *xdna);
148 
149 #endif /* _AMDXDNA_PCI_DRV_H_ */
150