xref: /OK3568_Linux_fs/kernel/include/soc/fsl/dpaa2-io.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2014-2016 Freescale Semiconductor Inc.
4*4882a593Smuzhiyun  * Copyright 2017-2019 NXP
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #ifndef __FSL_DPAA2_IO_H
8*4882a593Smuzhiyun #define __FSL_DPAA2_IO_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/types.h>
11*4882a593Smuzhiyun #include <linux/cpumask.h>
12*4882a593Smuzhiyun #include <linux/irqreturn.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "dpaa2-fd.h"
15*4882a593Smuzhiyun #include "dpaa2-global.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct dpaa2_io;
18*4882a593Smuzhiyun struct dpaa2_io_store;
19*4882a593Smuzhiyun struct device;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /**
22*4882a593Smuzhiyun  * DOC: DPIO Service
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * The DPIO service provides APIs for users to interact with the datapath
25*4882a593Smuzhiyun  * by enqueueing and dequeing frame descriptors.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * The following set of APIs can be used to enqueue and dequeue frames
28*4882a593Smuzhiyun  * as well as producing notification callbacks when data is available
29*4882a593Smuzhiyun  * for dequeue.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define DPAA2_IO_ANY_CPU	-1
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /**
35*4882a593Smuzhiyun  * struct dpaa2_io_desc - The DPIO descriptor
36*4882a593Smuzhiyun  * @receives_notifications: Use notificaton mode. Non-zero if the DPIO
37*4882a593Smuzhiyun  *                  has a channel.
38*4882a593Smuzhiyun  * @has_8prio:      Set to non-zero for channel with 8 priority WQs.  Ignored
39*4882a593Smuzhiyun  *                  unless receives_notification is TRUE.
40*4882a593Smuzhiyun  * @cpu:            The cpu index that at least interrupt handlers will
41*4882a593Smuzhiyun  *                  execute on.
42*4882a593Smuzhiyun  * @stash_affinity: The stash affinity for this portal favour 'cpu'
43*4882a593Smuzhiyun  * @regs_cena:      The cache enabled regs.
44*4882a593Smuzhiyun  * @regs_cinh:      The cache inhibited regs
45*4882a593Smuzhiyun  * @dpio_id:        The dpio index
46*4882a593Smuzhiyun  * @qman_version:   The qman version
47*4882a593Smuzhiyun  *
48*4882a593Smuzhiyun  * Describes the attributes and features of the DPIO object.
49*4882a593Smuzhiyun  */
50*4882a593Smuzhiyun struct dpaa2_io_desc {
51*4882a593Smuzhiyun 	int receives_notifications;
52*4882a593Smuzhiyun 	int has_8prio;
53*4882a593Smuzhiyun 	int cpu;
54*4882a593Smuzhiyun 	void *regs_cena;
55*4882a593Smuzhiyun 	void __iomem *regs_cinh;
56*4882a593Smuzhiyun 	int dpio_id;
57*4882a593Smuzhiyun 	u32 qman_version;
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct dpaa2_io *dpaa2_io_create(const struct dpaa2_io_desc *desc,
61*4882a593Smuzhiyun 				 struct device *dev);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun void dpaa2_io_down(struct dpaa2_io *d);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun irqreturn_t dpaa2_io_irq(struct dpaa2_io *obj);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun struct dpaa2_io *dpaa2_io_service_select(int cpu);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /**
70*4882a593Smuzhiyun  * struct dpaa2_io_notification_ctx - The DPIO notification context structure
71*4882a593Smuzhiyun  * @cb:           The callback to be invoked when the notification arrives
72*4882a593Smuzhiyun  * @is_cdan:      Zero for FQDAN, non-zero for CDAN
73*4882a593Smuzhiyun  * @id:           FQID or channel ID, needed for rearm
74*4882a593Smuzhiyun  * @desired_cpu:  The cpu on which the notifications will show up. Use
75*4882a593Smuzhiyun  *                DPAA2_IO_ANY_CPU if don't care
76*4882a593Smuzhiyun  * @dpio_id:      The dpio index
77*4882a593Smuzhiyun  * @qman64:       The 64-bit context value shows up in the FQDAN/CDAN.
78*4882a593Smuzhiyun  * @node:         The list node
79*4882a593Smuzhiyun  * @dpio_private: The dpio object internal to dpio_service
80*4882a593Smuzhiyun  *
81*4882a593Smuzhiyun  * Used when a FQDAN/CDAN registration is made by drivers.
82*4882a593Smuzhiyun  */
83*4882a593Smuzhiyun struct dpaa2_io_notification_ctx {
84*4882a593Smuzhiyun 	void (*cb)(struct dpaa2_io_notification_ctx *ctx);
85*4882a593Smuzhiyun 	int is_cdan;
86*4882a593Smuzhiyun 	u32 id;
87*4882a593Smuzhiyun 	int desired_cpu;
88*4882a593Smuzhiyun 	int dpio_id;
89*4882a593Smuzhiyun 	u64 qman64;
90*4882a593Smuzhiyun 	struct list_head node;
91*4882a593Smuzhiyun 	void *dpio_private;
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun int dpaa2_io_get_cpu(struct dpaa2_io *d);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun int dpaa2_io_service_register(struct dpaa2_io *service,
97*4882a593Smuzhiyun 			      struct dpaa2_io_notification_ctx *ctx,
98*4882a593Smuzhiyun 			      struct device *dev);
99*4882a593Smuzhiyun void dpaa2_io_service_deregister(struct dpaa2_io *service,
100*4882a593Smuzhiyun 				 struct dpaa2_io_notification_ctx *ctx,
101*4882a593Smuzhiyun 				 struct device *dev);
102*4882a593Smuzhiyun int dpaa2_io_service_rearm(struct dpaa2_io *service,
103*4882a593Smuzhiyun 			   struct dpaa2_io_notification_ctx *ctx);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun int dpaa2_io_service_pull_fq(struct dpaa2_io *d, u32 fqid,
106*4882a593Smuzhiyun 			     struct dpaa2_io_store *s);
107*4882a593Smuzhiyun int dpaa2_io_service_pull_channel(struct dpaa2_io *d, u32 channelid,
108*4882a593Smuzhiyun 				  struct dpaa2_io_store *s);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun int dpaa2_io_service_enqueue_fq(struct dpaa2_io *d, u32 fqid,
111*4882a593Smuzhiyun 				const struct dpaa2_fd *fd);
112*4882a593Smuzhiyun int dpaa2_io_service_enqueue_multiple_fq(struct dpaa2_io *d, u32 fqid,
113*4882a593Smuzhiyun 				const struct dpaa2_fd *fd, int number_of_frame);
114*4882a593Smuzhiyun int dpaa2_io_service_enqueue_multiple_desc_fq(struct dpaa2_io *d, u32 *fqid,
115*4882a593Smuzhiyun 				const struct dpaa2_fd *fd, int number_of_frame);
116*4882a593Smuzhiyun int dpaa2_io_service_enqueue_qd(struct dpaa2_io *d, u32 qdid, u8 prio,
117*4882a593Smuzhiyun 				u16 qdbin, const struct dpaa2_fd *fd);
118*4882a593Smuzhiyun int dpaa2_io_service_release(struct dpaa2_io *d, u16 bpid,
119*4882a593Smuzhiyun 			     const u64 *buffers, unsigned int num_buffers);
120*4882a593Smuzhiyun int dpaa2_io_service_acquire(struct dpaa2_io *d, u16 bpid,
121*4882a593Smuzhiyun 			     u64 *buffers, unsigned int num_buffers);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun struct dpaa2_io_store *dpaa2_io_store_create(unsigned int max_frames,
124*4882a593Smuzhiyun 					     struct device *dev);
125*4882a593Smuzhiyun void dpaa2_io_store_destroy(struct dpaa2_io_store *s);
126*4882a593Smuzhiyun struct dpaa2_dq *dpaa2_io_store_next(struct dpaa2_io_store *s, int *is_last);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun int dpaa2_io_query_fq_count(struct dpaa2_io *d, u32 fqid,
129*4882a593Smuzhiyun 			    u32 *fcnt, u32 *bcnt);
130*4882a593Smuzhiyun int dpaa2_io_query_bp_count(struct dpaa2_io *d, u16 bpid,
131*4882a593Smuzhiyun 			    u32 *num);
132*4882a593Smuzhiyun #endif /* __FSL_DPAA2_IO_H */
133