Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
36extern const struct drm_driver amdxdna_drm_drv;
37
38struct amdxdna_client;
39struct amdxdna_dev;
40struct amdxdna_drm_get_info;
41struct amdxdna_drm_set_state;
42struct amdxdna_gem_obj;
43struct amdxdna_hwctx;
44struct amdxdna_sched_job;
45
46/*
47 * struct amdxdna_dev_ops - Device hardware operation callbacks
48 */
49struct 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 */
69struct 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
85struct amdxdna_fw_ver {
86 u32 major;
87 u32 minor;
88 u32 sub;
89 u32 build;
90};
91
92struct 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 */
108struct 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 */
118struct 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 */
140extern const struct amdxdna_dev_info dev_npu1_info;
141extern const struct amdxdna_dev_info dev_npu2_info;
142extern const struct amdxdna_dev_info dev_npu4_info;
143extern const struct amdxdna_dev_info dev_npu5_info;
144extern const struct amdxdna_dev_info dev_npu6_info;
145
146int amdxdna_sysfs_init(struct amdxdna_dev *xdna);
147void amdxdna_sysfs_fini(struct amdxdna_dev *xdna);
148
149#endif /* _AMDXDNA_PCI_DRV_H_ */