xref: /OK3568_Linux_fs/kernel/include/linux/soc/ti/k3-ringacc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * K3 Ring Accelerator (RA) subsystem interface
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __SOC_TI_K3_RINGACC_API_H_
9*4882a593Smuzhiyun #define __SOC_TI_K3_RINGACC_API_H_
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct device_node;
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /**
16*4882a593Smuzhiyun  * enum k3_ring_mode - &struct k3_ring_cfg mode
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * RA ring operational modes
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  * @K3_RINGACC_RING_MODE_RING: Exposed Ring mode for SW direct access
21*4882a593Smuzhiyun  * @K3_RINGACC_RING_MODE_MESSAGE: Messaging mode. Messaging mode requires
22*4882a593Smuzhiyun  *	that all accesses to the queue must go through this IP so that all
23*4882a593Smuzhiyun  *	accesses to the memory are controlled and ordered. This IP then
24*4882a593Smuzhiyun  *	controls the entire state of the queue, and SW has no directly control,
25*4882a593Smuzhiyun  *	such as through doorbells and cannot access the storage memory directly.
26*4882a593Smuzhiyun  *	This is particularly useful when more than one SW or HW entity can be
27*4882a593Smuzhiyun  *	the producer and/or consumer at the same time
28*4882a593Smuzhiyun  * @K3_RINGACC_RING_MODE_CREDENTIALS: Credentials mode is message mode plus
29*4882a593Smuzhiyun  *	stores credentials with each message, requiring the element size to be
30*4882a593Smuzhiyun  *	doubled to fit the credentials. Any exposed memory should be protected
31*4882a593Smuzhiyun  *	by a firewall from unwanted access
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun enum k3_ring_mode {
34*4882a593Smuzhiyun 	K3_RINGACC_RING_MODE_RING = 0,
35*4882a593Smuzhiyun 	K3_RINGACC_RING_MODE_MESSAGE,
36*4882a593Smuzhiyun 	K3_RINGACC_RING_MODE_CREDENTIALS,
37*4882a593Smuzhiyun 	K3_RINGACC_RING_MODE_INVALID
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /**
41*4882a593Smuzhiyun  * enum k3_ring_size - &struct k3_ring_cfg elm_size
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  * RA ring element's sizes in bytes.
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun enum k3_ring_size {
46*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_4 = 0,
47*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_8,
48*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_16,
49*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_32,
50*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_64,
51*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_128,
52*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_256,
53*4882a593Smuzhiyun 	K3_RINGACC_RING_ELSIZE_INVALID
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct k3_ringacc;
57*4882a593Smuzhiyun struct k3_ring;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /**
60*4882a593Smuzhiyun  * enum k3_ring_cfg - RA ring configuration structure
61*4882a593Smuzhiyun  *
62*4882a593Smuzhiyun  * @size: Ring size, number of elements
63*4882a593Smuzhiyun  * @elm_size: Ring element size
64*4882a593Smuzhiyun  * @mode: Ring operational mode
65*4882a593Smuzhiyun  * @flags: Ring configuration flags. Possible values:
66*4882a593Smuzhiyun  *	 @K3_RINGACC_RING_SHARED: when set allows to request the same ring
67*4882a593Smuzhiyun  *	 few times. It's usable when the same ring is used as Free Host PD ring
68*4882a593Smuzhiyun  *	 for different flows, for example.
69*4882a593Smuzhiyun  *	 Note: Locking should be done by consumer if required
70*4882a593Smuzhiyun  */
71*4882a593Smuzhiyun struct k3_ring_cfg {
72*4882a593Smuzhiyun 	u32 size;
73*4882a593Smuzhiyun 	enum k3_ring_size elm_size;
74*4882a593Smuzhiyun 	enum k3_ring_mode mode;
75*4882a593Smuzhiyun #define K3_RINGACC_RING_SHARED BIT(1)
76*4882a593Smuzhiyun 	u32 flags;
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define K3_RINGACC_RING_ID_ANY (-1)
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * of_k3_ringacc_get_by_phandle - find a RA by phandle property
83*4882a593Smuzhiyun  * @np: device node
84*4882a593Smuzhiyun  * @propname: property name containing phandle on RA node
85*4882a593Smuzhiyun  *
86*4882a593Smuzhiyun  * Returns pointer on the RA - struct k3_ringacc
87*4882a593Smuzhiyun  * or -ENODEV if not found,
88*4882a593Smuzhiyun  * or -EPROBE_DEFER if not yet registered
89*4882a593Smuzhiyun  */
90*4882a593Smuzhiyun struct k3_ringacc *of_k3_ringacc_get_by_phandle(struct device_node *np,
91*4882a593Smuzhiyun 						const char *property);
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #define K3_RINGACC_RING_USE_PROXY BIT(1)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun /**
96*4882a593Smuzhiyun  * k3_ringacc_request_ring - request ring from ringacc
97*4882a593Smuzhiyun  * @ringacc: pointer on ringacc
98*4882a593Smuzhiyun  * @id: ring id or K3_RINGACC_RING_ID_ANY for any general purpose ring
99*4882a593Smuzhiyun  * @flags:
100*4882a593Smuzhiyun  *	@K3_RINGACC_RING_USE_PROXY: if set - proxy will be allocated and
101*4882a593Smuzhiyun  *		used to access ring memory. Sopported only for rings in
102*4882a593Smuzhiyun  *		Message/Credentials/Queue mode.
103*4882a593Smuzhiyun  *
104*4882a593Smuzhiyun  * Returns pointer on the Ring - struct k3_ring
105*4882a593Smuzhiyun  * or NULL in case of failure.
106*4882a593Smuzhiyun  */
107*4882a593Smuzhiyun struct k3_ring *k3_ringacc_request_ring(struct k3_ringacc *ringacc,
108*4882a593Smuzhiyun 					int id, u32 flags);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun int k3_ringacc_request_rings_pair(struct k3_ringacc *ringacc,
111*4882a593Smuzhiyun 				  int fwd_id, int compl_id,
112*4882a593Smuzhiyun 				  struct k3_ring **fwd_ring,
113*4882a593Smuzhiyun 				  struct k3_ring **compl_ring);
114*4882a593Smuzhiyun /**
115*4882a593Smuzhiyun  * k3_ringacc_ring_reset - ring reset
116*4882a593Smuzhiyun  * @ring: pointer on Ring
117*4882a593Smuzhiyun  *
118*4882a593Smuzhiyun  * Resets ring internal state ((hw)occ, (hw)idx).
119*4882a593Smuzhiyun  */
120*4882a593Smuzhiyun void k3_ringacc_ring_reset(struct k3_ring *ring);
121*4882a593Smuzhiyun /**
122*4882a593Smuzhiyun  * k3_ringacc_ring_reset - ring reset for DMA rings
123*4882a593Smuzhiyun  * @ring: pointer on Ring
124*4882a593Smuzhiyun  *
125*4882a593Smuzhiyun  * Resets ring internal state ((hw)occ, (hw)idx). Should be used for rings
126*4882a593Smuzhiyun  * which are read by K3 UDMA, like TX or Free Host PD rings.
127*4882a593Smuzhiyun  */
128*4882a593Smuzhiyun void k3_ringacc_ring_reset_dma(struct k3_ring *ring, u32 occ);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /**
131*4882a593Smuzhiyun  * k3_ringacc_ring_free - ring free
132*4882a593Smuzhiyun  * @ring: pointer on Ring
133*4882a593Smuzhiyun  *
134*4882a593Smuzhiyun  * Resets ring and free all alocated resources.
135*4882a593Smuzhiyun  */
136*4882a593Smuzhiyun int k3_ringacc_ring_free(struct k3_ring *ring);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /**
139*4882a593Smuzhiyun  * k3_ringacc_get_ring_id - Get the Ring ID
140*4882a593Smuzhiyun  * @ring: pointer on ring
141*4882a593Smuzhiyun  *
142*4882a593Smuzhiyun  * Returns the Ring ID
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun u32 k3_ringacc_get_ring_id(struct k3_ring *ring);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /**
147*4882a593Smuzhiyun  * k3_ringacc_get_ring_irq_num - Get the irq number for the ring
148*4882a593Smuzhiyun  * @ring: pointer on ring
149*4882a593Smuzhiyun  *
150*4882a593Smuzhiyun  * Returns the interrupt number which can be used to request the interrupt
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun int k3_ringacc_get_ring_irq_num(struct k3_ring *ring);
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /**
155*4882a593Smuzhiyun  * k3_ringacc_ring_cfg - ring configure
156*4882a593Smuzhiyun  * @ring: pointer on ring
157*4882a593Smuzhiyun  * @cfg: Ring configuration parameters (see &struct k3_ring_cfg)
158*4882a593Smuzhiyun  *
159*4882a593Smuzhiyun  * Configures ring, including ring memory allocation.
160*4882a593Smuzhiyun  * Returns 0 on success, errno otherwise.
161*4882a593Smuzhiyun  */
162*4882a593Smuzhiyun int k3_ringacc_ring_cfg(struct k3_ring *ring, struct k3_ring_cfg *cfg);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /**
165*4882a593Smuzhiyun  * k3_ringacc_ring_get_size - get ring size
166*4882a593Smuzhiyun  * @ring: pointer on ring
167*4882a593Smuzhiyun  *
168*4882a593Smuzhiyun  * Returns ring size in number of elements.
169*4882a593Smuzhiyun  */
170*4882a593Smuzhiyun u32 k3_ringacc_ring_get_size(struct k3_ring *ring);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /**
173*4882a593Smuzhiyun  * k3_ringacc_ring_get_free - get free elements
174*4882a593Smuzhiyun  * @ring: pointer on ring
175*4882a593Smuzhiyun  *
176*4882a593Smuzhiyun  * Returns number of free elements in the ring.
177*4882a593Smuzhiyun  */
178*4882a593Smuzhiyun u32 k3_ringacc_ring_get_free(struct k3_ring *ring);
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun /**
181*4882a593Smuzhiyun  * k3_ringacc_ring_get_occ - get ring occupancy
182*4882a593Smuzhiyun  * @ring: pointer on ring
183*4882a593Smuzhiyun  *
184*4882a593Smuzhiyun  * Returns total number of valid entries on the ring
185*4882a593Smuzhiyun  */
186*4882a593Smuzhiyun u32 k3_ringacc_ring_get_occ(struct k3_ring *ring);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun /**
189*4882a593Smuzhiyun  * k3_ringacc_ring_is_full - checks if ring is full
190*4882a593Smuzhiyun  * @ring: pointer on ring
191*4882a593Smuzhiyun  *
192*4882a593Smuzhiyun  * Returns true if the ring is full
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun u32 k3_ringacc_ring_is_full(struct k3_ring *ring);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /**
197*4882a593Smuzhiyun  * k3_ringacc_ring_push - push element to the ring tail
198*4882a593Smuzhiyun  * @ring: pointer on ring
199*4882a593Smuzhiyun  * @elem: pointer on ring element buffer
200*4882a593Smuzhiyun  *
201*4882a593Smuzhiyun  * Push one ring element to the ring tail. Size of the ring element is
202*4882a593Smuzhiyun  * determined by ring configuration &struct k3_ring_cfg elm_size.
203*4882a593Smuzhiyun  *
204*4882a593Smuzhiyun  * Returns 0 on success, errno otherwise.
205*4882a593Smuzhiyun  */
206*4882a593Smuzhiyun int k3_ringacc_ring_push(struct k3_ring *ring, void *elem);
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /**
209*4882a593Smuzhiyun  * k3_ringacc_ring_pop - pop element from the ring head
210*4882a593Smuzhiyun  * @ring: pointer on ring
211*4882a593Smuzhiyun  * @elem: pointer on ring element buffer
212*4882a593Smuzhiyun  *
213*4882a593Smuzhiyun  * Push one ring element from the ring head. Size of the ring element is
214*4882a593Smuzhiyun  * determined by ring configuration &struct k3_ring_cfg elm_size..
215*4882a593Smuzhiyun  *
216*4882a593Smuzhiyun  * Returns 0 on success, errno otherwise.
217*4882a593Smuzhiyun  */
218*4882a593Smuzhiyun int k3_ringacc_ring_pop(struct k3_ring *ring, void *elem);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /**
221*4882a593Smuzhiyun  * k3_ringacc_ring_push_head - push element to the ring head
222*4882a593Smuzhiyun  * @ring: pointer on ring
223*4882a593Smuzhiyun  * @elem: pointer on ring element buffer
224*4882a593Smuzhiyun  *
225*4882a593Smuzhiyun  * Push one ring element to the ring head. Size of the ring element is
226*4882a593Smuzhiyun  * determined by ring configuration &struct k3_ring_cfg elm_size.
227*4882a593Smuzhiyun  *
228*4882a593Smuzhiyun  * Returns 0 on success, errno otherwise.
229*4882a593Smuzhiyun  * Not Supported by ring modes: K3_RINGACC_RING_MODE_RING
230*4882a593Smuzhiyun  */
231*4882a593Smuzhiyun int k3_ringacc_ring_push_head(struct k3_ring *ring, void *elem);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /**
234*4882a593Smuzhiyun  * k3_ringacc_ring_pop_tail - pop element from the ring tail
235*4882a593Smuzhiyun  * @ring: pointer on ring
236*4882a593Smuzhiyun  * @elem: pointer on ring element buffer
237*4882a593Smuzhiyun  *
238*4882a593Smuzhiyun  * Push one ring element from the ring tail. Size of the ring element is
239*4882a593Smuzhiyun  * determined by ring configuration &struct k3_ring_cfg elm_size.
240*4882a593Smuzhiyun  *
241*4882a593Smuzhiyun  * Returns 0 on success, errno otherwise.
242*4882a593Smuzhiyun  * Not Supported by ring modes: K3_RINGACC_RING_MODE_RING
243*4882a593Smuzhiyun  */
244*4882a593Smuzhiyun int k3_ringacc_ring_pop_tail(struct k3_ring *ring, void *elem);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun u32 k3_ringacc_get_tisci_dev_id(struct k3_ring *ring);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun #endif /* __SOC_TI_K3_RINGACC_API_H_ */
249