xref: /linux/drivers/accel/ethosu/ethosu_device.h (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1*5a5e9c02SRob Herring (Arm) /* SPDX-License-Identifier: GPL-2.0-only or MIT */
2*5a5e9c02SRob Herring (Arm) /* Copyright 2025 Arm, Ltd. */
3*5a5e9c02SRob Herring (Arm) 
4*5a5e9c02SRob Herring (Arm) #ifndef __ETHOSU_DEVICE_H__
5*5a5e9c02SRob Herring (Arm) #define __ETHOSU_DEVICE_H__
6*5a5e9c02SRob Herring (Arm) 
7*5a5e9c02SRob Herring (Arm) #include <linux/bitfield.h>
8*5a5e9c02SRob Herring (Arm) #include <linux/bits.h>
9*5a5e9c02SRob Herring (Arm) #include <linux/types.h>
10*5a5e9c02SRob Herring (Arm) 
11*5a5e9c02SRob Herring (Arm) #include <drm/drm_device.h>
12*5a5e9c02SRob Herring (Arm) #include <drm/gpu_scheduler.h>
13*5a5e9c02SRob Herring (Arm) 
14*5a5e9c02SRob Herring (Arm) #include <drm/ethosu_accel.h>
15*5a5e9c02SRob Herring (Arm) 
16*5a5e9c02SRob Herring (Arm) struct clk;
17*5a5e9c02SRob Herring (Arm) struct gen_pool;
18*5a5e9c02SRob Herring (Arm) 
19*5a5e9c02SRob Herring (Arm) #define NPU_REG_ID		0x0000
20*5a5e9c02SRob Herring (Arm) #define NPU_REG_STATUS		0x0004
21*5a5e9c02SRob Herring (Arm) #define NPU_REG_CMD		0x0008
22*5a5e9c02SRob Herring (Arm) #define NPU_REG_RESET		0x000c
23*5a5e9c02SRob Herring (Arm) #define NPU_REG_QBASE		0x0010
24*5a5e9c02SRob Herring (Arm) #define NPU_REG_QBASE_HI	0x0014
25*5a5e9c02SRob Herring (Arm) #define NPU_REG_QREAD		0x0018
26*5a5e9c02SRob Herring (Arm) #define NPU_REG_QCONFIG		0x001c
27*5a5e9c02SRob Herring (Arm) #define NPU_REG_QSIZE		0x0020
28*5a5e9c02SRob Herring (Arm) #define NPU_REG_PROT		0x0024
29*5a5e9c02SRob Herring (Arm) #define NPU_REG_CONFIG		0x0028
30*5a5e9c02SRob Herring (Arm) #define NPU_REG_REGIONCFG	0x003c
31*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXILIMIT0	0x0040		// U65
32*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXILIMIT1	0x0044		// U65
33*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXILIMIT2	0x0048		// U65
34*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXILIMIT3	0x004c		// U65
35*5a5e9c02SRob Herring (Arm) #define NPU_REG_MEM_ATTR0	0x0040		// U85
36*5a5e9c02SRob Herring (Arm) #define NPU_REG_MEM_ATTR1	0x0044		// U85
37*5a5e9c02SRob Herring (Arm) #define NPU_REG_MEM_ATTR2	0x0048		// U85
38*5a5e9c02SRob Herring (Arm) #define NPU_REG_MEM_ATTR3	0x004c		// U85
39*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXI_SRAM	0x0050		// U85
40*5a5e9c02SRob Herring (Arm) #define NPU_REG_AXI_EXT		0x0054		// U85
41*5a5e9c02SRob Herring (Arm) 
42*5a5e9c02SRob Herring (Arm) #define NPU_REG_BASEP(x)	(0x0080 + (x) * 8)
43*5a5e9c02SRob Herring (Arm) #define NPU_REG_BASEP_HI(x)	(0x0084 + (x) * 8)
44*5a5e9c02SRob Herring (Arm) #define NPU_BASEP_REGION_MAX	8
45*5a5e9c02SRob Herring (Arm) 
46*5a5e9c02SRob Herring (Arm) #define ID_ARCH_MAJOR_MASK	GENMASK(31, 28)
47*5a5e9c02SRob Herring (Arm) #define ID_ARCH_MINOR_MASK	GENMASK(27, 20)
48*5a5e9c02SRob Herring (Arm) #define ID_ARCH_PATCH_MASK	GENMASK(19, 16)
49*5a5e9c02SRob Herring (Arm) #define ID_VER_MAJOR_MASK	GENMASK(11, 8)
50*5a5e9c02SRob Herring (Arm) #define ID_VER_MINOR_MASK	GENMASK(7, 4)
51*5a5e9c02SRob Herring (Arm) 
52*5a5e9c02SRob Herring (Arm) #define CONFIG_MACS_PER_CC_MASK	GENMASK(3, 0)
53*5a5e9c02SRob Herring (Arm) #define CONFIG_CMD_STREAM_VER_MASK	GENMASK(7, 4)
54*5a5e9c02SRob Herring (Arm) 
55*5a5e9c02SRob Herring (Arm) #define STATUS_STATE_RUNNING	BIT(0)
56*5a5e9c02SRob Herring (Arm) #define STATUS_IRQ_RAISED	BIT(1)
57*5a5e9c02SRob Herring (Arm) #define STATUS_BUS_STATUS	BIT(2)
58*5a5e9c02SRob Herring (Arm) #define STATUS_RESET_STATUS	BIT(3)
59*5a5e9c02SRob Herring (Arm) #define STATUS_CMD_PARSE_ERR	BIT(4)
60*5a5e9c02SRob Herring (Arm) #define STATUS_CMD_END_REACHED	BIT(5)
61*5a5e9c02SRob Herring (Arm) 
62*5a5e9c02SRob Herring (Arm) #define CMD_CLEAR_IRQ		BIT(1)
63*5a5e9c02SRob Herring (Arm) #define CMD_TRANSITION_TO_RUN	BIT(0)
64*5a5e9c02SRob Herring (Arm) 
65*5a5e9c02SRob Herring (Arm) #define RESET_PENDING_CSL	BIT(1)
66*5a5e9c02SRob Herring (Arm) #define RESET_PENDING_CPL	BIT(0)
67*5a5e9c02SRob Herring (Arm) 
68*5a5e9c02SRob Herring (Arm) #define PROT_ACTIVE_CSL		BIT(1)
69*5a5e9c02SRob Herring (Arm) 
70*5a5e9c02SRob Herring (Arm) enum ethosu_cmds {
71*5a5e9c02SRob Herring (Arm) 	NPU_OP_CONV = 0x2,
72*5a5e9c02SRob Herring (Arm) 	NPU_OP_DEPTHWISE = 0x3,
73*5a5e9c02SRob Herring (Arm) 	NPU_OP_POOL = 0x5,
74*5a5e9c02SRob Herring (Arm) 	NPU_OP_ELEMENTWISE = 0x6,
75*5a5e9c02SRob Herring (Arm) 	NPU_OP_RESIZE = 0x7,	// U85 only
76*5a5e9c02SRob Herring (Arm) 	NPU_OP_DMA_START = 0x10,
77*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_PAD_TOP = 0x100,
78*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_PAD_LEFT = 0x101,
79*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_PAD_RIGHT = 0x102,
80*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_PAD_BOTTOM = 0x103,
81*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_DEPTH_M1 = 0x104,
82*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_PRECISION = 0x105,
83*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_BROADCAST = 0x108,
84*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_WIDTH0_M1 = 0x10a,
85*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_HEIGHT0_M1 = 0x10b,
86*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_HEIGHT1_M1 = 0x10c,
87*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_REGION = 0x10f,
88*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_WIDTH_M1 = 0x111,
89*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_HEIGHT_M1 = 0x112,
90*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_DEPTH_M1 = 0x113,
91*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_PRECISION = 0x114,
92*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_WIDTH0_M1 = 0x11a,
93*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_HEIGHT0_M1 = 0x11b,
94*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_HEIGHT1_M1 = 0x11c,
95*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_REGION = 0x11f,
96*5a5e9c02SRob Herring (Arm) 	NPU_SET_KERNEL_WIDTH_M1 = 0x120,
97*5a5e9c02SRob Herring (Arm) 	NPU_SET_KERNEL_HEIGHT_M1 = 0x121,
98*5a5e9c02SRob Herring (Arm) 	NPU_SET_KERNEL_STRIDE = 0x122,
99*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT_REGION = 0x128,
100*5a5e9c02SRob Herring (Arm) 	NPU_SET_SCALE_REGION = 0x129,
101*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SRC_REGION = 0x130,
102*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_DST_REGION = 0x131,
103*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SIZE0 = 0x132,
104*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SIZE1 = 0x133,
105*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_BROADCAST = 0x180,
106*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_PRECISION = 0x185,
107*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_WIDTH0_M1 = 0x18a,
108*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_HEIGHT0_M1 = 0x18b,
109*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_HEIGHT1_M1 = 0x18c,
110*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_REGION = 0x18f,
111*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_BASE0 = 0x4000,
112*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_BASE1 = 0x4001,
113*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_BASE2 = 0x4002,
114*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_BASE3 = 0x4003,
115*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_STRIDE_X = 0x4004,
116*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_STRIDE_Y = 0x4005,
117*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM_STRIDE_C = 0x4006,
118*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_BASE0 = 0x4010,
119*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_BASE1 = 0x4011,
120*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_BASE2 = 0x4012,
121*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_BASE3 = 0x4013,
122*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_STRIDE_X = 0x4014,
123*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_STRIDE_Y = 0x4015,
124*5a5e9c02SRob Herring (Arm) 	NPU_SET_OFM_STRIDE_C = 0x4016,
125*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT_BASE = 0x4020,
126*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT_LENGTH = 0x4021,
127*5a5e9c02SRob Herring (Arm) 	NPU_SET_SCALE_BASE = 0x4022,
128*5a5e9c02SRob Herring (Arm) 	NPU_SET_SCALE_LENGTH = 0x4023,
129*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SRC = 0x4030,
130*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_DST = 0x4031,
131*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_LEN = 0x4032,
132*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SRC_STRIDE0 = 0x4033,
133*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_SRC_STRIDE1 = 0x4034,
134*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_DST_STRIDE0 = 0x4035,
135*5a5e9c02SRob Herring (Arm) 	NPU_SET_DMA0_DST_STRIDE1 = 0x4036,
136*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_BASE0 = 0x4080,
137*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_BASE1 = 0x4081,
138*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_BASE2 = 0x4082,
139*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_BASE3 = 0x4083,
140*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_STRIDE_X = 0x4084,
141*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_STRIDE_Y = 0x4085,
142*5a5e9c02SRob Herring (Arm) 	NPU_SET_IFM2_STRIDE_C = 0x4086,
143*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT1_BASE = 0x4090,
144*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT1_LENGTH = 0x4091,
145*5a5e9c02SRob Herring (Arm) 	NPU_SET_SCALE1_BASE = 0x4092,
146*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT2_BASE = 0x4092,
147*5a5e9c02SRob Herring (Arm) 	NPU_SET_SCALE1_LENGTH = 0x4093,
148*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT2_LENGTH = 0x4093,
149*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT3_BASE = 0x4094,
150*5a5e9c02SRob Herring (Arm) 	NPU_SET_WEIGHT3_LENGTH = 0x4095,
151*5a5e9c02SRob Herring (Arm) };
152*5a5e9c02SRob Herring (Arm) 
153*5a5e9c02SRob Herring (Arm) #define ETHOSU_SRAM_REGION	2	/* Matching Vela compiler */
154*5a5e9c02SRob Herring (Arm) 
155*5a5e9c02SRob Herring (Arm) /**
156*5a5e9c02SRob Herring (Arm)  * struct ethosu_device - Ethosu device
157*5a5e9c02SRob Herring (Arm)  */
158*5a5e9c02SRob Herring (Arm) struct ethosu_device {
159*5a5e9c02SRob Herring (Arm) 	/** @base: Base drm_device. */
160*5a5e9c02SRob Herring (Arm) 	struct drm_device base;
161*5a5e9c02SRob Herring (Arm) 
162*5a5e9c02SRob Herring (Arm) 	/** @iomem: CPU mapping of the registers. */
163*5a5e9c02SRob Herring (Arm) 	void __iomem *regs;
164*5a5e9c02SRob Herring (Arm) 
165*5a5e9c02SRob Herring (Arm) 	void __iomem *sram;
166*5a5e9c02SRob Herring (Arm) 	struct gen_pool *srampool;
167*5a5e9c02SRob Herring (Arm) 	dma_addr_t sramphys;
168*5a5e9c02SRob Herring (Arm) 
169*5a5e9c02SRob Herring (Arm) 	struct clk_bulk_data *clks;
170*5a5e9c02SRob Herring (Arm) 	int num_clks;
171*5a5e9c02SRob Herring (Arm) 	int irq;
172*5a5e9c02SRob Herring (Arm) 
173*5a5e9c02SRob Herring (Arm) 	struct drm_ethosu_npu_info npu_info;
174*5a5e9c02SRob Herring (Arm) 
175*5a5e9c02SRob Herring (Arm) 	struct ethosu_job *in_flight_job;
176*5a5e9c02SRob Herring (Arm) 	/* For in_flight_job and ethosu_job_hw_submit() */
177*5a5e9c02SRob Herring (Arm) 	struct mutex job_lock;
178*5a5e9c02SRob Herring (Arm) 
179*5a5e9c02SRob Herring (Arm) 	/* For dma_fence */
180*5a5e9c02SRob Herring (Arm) 	spinlock_t fence_lock;
181*5a5e9c02SRob Herring (Arm) 
182*5a5e9c02SRob Herring (Arm) 	struct drm_gpu_scheduler sched;
183*5a5e9c02SRob Herring (Arm) 	/* For ethosu_job_do_push() */
184*5a5e9c02SRob Herring (Arm) 	struct mutex sched_lock;
185*5a5e9c02SRob Herring (Arm) 	u64 fence_context;
186*5a5e9c02SRob Herring (Arm) 	u64 emit_seqno;
187*5a5e9c02SRob Herring (Arm) };
188*5a5e9c02SRob Herring (Arm) 
189*5a5e9c02SRob Herring (Arm) #define to_ethosu_device(drm_dev) \
190*5a5e9c02SRob Herring (Arm) 	((struct ethosu_device *)container_of(drm_dev, struct ethosu_device, base))
191*5a5e9c02SRob Herring (Arm) 
192*5a5e9c02SRob Herring (Arm) static inline bool ethosu_is_u65(const struct ethosu_device *ethosudev)
193*5a5e9c02SRob Herring (Arm) {
194*5a5e9c02SRob Herring (Arm) 	return FIELD_GET(ID_ARCH_MAJOR_MASK, ethosudev->npu_info.id) == 1;
195*5a5e9c02SRob Herring (Arm) }
196*5a5e9c02SRob Herring (Arm) 
197*5a5e9c02SRob Herring (Arm) #endif
198