xref: /openbmc/u-boot/include/fsl-mc/fsl_qbman_portal.h (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2a2a55e51SPrabhakar Kushwaha /*
3a2a55e51SPrabhakar Kushwaha  * Copyright (C) 2014 Freescale Semiconductor
4a2a55e51SPrabhakar Kushwaha  */
5a2a55e51SPrabhakar Kushwaha 
6a2a55e51SPrabhakar Kushwaha #ifndef _FSL_QBMAN_PORTAL_H
7a2a55e51SPrabhakar Kushwaha #define _FSL_QBMAN_PORTAL_H
8a2a55e51SPrabhakar Kushwaha 
9a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_qbman_base.h>
10a2a55e51SPrabhakar Kushwaha 
11a2a55e51SPrabhakar Kushwaha /* Create and destroy a functional object representing the given QBMan portal
12a2a55e51SPrabhakar Kushwaha  * descriptor. */
13a2a55e51SPrabhakar Kushwaha struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *);
14a2a55e51SPrabhakar Kushwaha 
15a2a55e51SPrabhakar Kushwaha 	/************/
16a2a55e51SPrabhakar Kushwaha 	/* Dequeues */
17a2a55e51SPrabhakar Kushwaha 	/************/
18a2a55e51SPrabhakar Kushwaha 
19a2a55e51SPrabhakar Kushwaha /* See the QBMan driver API documentation for details on the enqueue
20a2a55e51SPrabhakar Kushwaha  * mechanisms. NB: the use of a 'ldpaa_' prefix for this type is because it is
21a2a55e51SPrabhakar Kushwaha  * primarily used by the "DPIO" layer that sits above (and hides) the QBMan
22a2a55e51SPrabhakar Kushwaha  * driver. The structure is defined in the DPIO interface, but to avoid circular
23a2a55e51SPrabhakar Kushwaha  * dependencies we just pre/re-declare it here opaquely. */
24a2a55e51SPrabhakar Kushwaha struct ldpaa_dq;
25a2a55e51SPrabhakar Kushwaha 
26a2a55e51SPrabhakar Kushwaha 
27a2a55e51SPrabhakar Kushwaha /* ------------------- */
28a2a55e51SPrabhakar Kushwaha /* Pull-mode dequeuing */
29a2a55e51SPrabhakar Kushwaha /* ------------------- */
30a2a55e51SPrabhakar Kushwaha 
31a2a55e51SPrabhakar Kushwaha struct qbman_pull_desc {
32a2a55e51SPrabhakar Kushwaha 	uint32_t dont_manipulate_directly[6];
33a2a55e51SPrabhakar Kushwaha };
34a2a55e51SPrabhakar Kushwaha 
35a2a55e51SPrabhakar Kushwaha /* Clear the contents of a descriptor to default/starting state. */
36a2a55e51SPrabhakar Kushwaha void qbman_pull_desc_clear(struct qbman_pull_desc *);
37a2a55e51SPrabhakar Kushwaha /* If not called, or if called with 'storage' as NULL, the result pull dequeues
38a2a55e51SPrabhakar Kushwaha  * will produce results to DQRR. If 'storage' is non-NULL, then results are
39a2a55e51SPrabhakar Kushwaha  * produced to the given memory location (using the physical/DMA address which
40a2a55e51SPrabhakar Kushwaha  * the caller provides in 'storage_phys'), and 'stash' controls whether or not
41a2a55e51SPrabhakar Kushwaha  * those writes to main-memory express a cache-warming attribute. */
42a2a55e51SPrabhakar Kushwaha void qbman_pull_desc_set_storage(struct qbman_pull_desc *,
43a2a55e51SPrabhakar Kushwaha 				 struct ldpaa_dq *storage,
44a2a55e51SPrabhakar Kushwaha 				 dma_addr_t storage_phys,
45a2a55e51SPrabhakar Kushwaha 				 int stash);
46a2a55e51SPrabhakar Kushwaha /* numframes must be between 1 and 16, inclusive */
47a2a55e51SPrabhakar Kushwaha void qbman_pull_desc_set_numframes(struct qbman_pull_desc *, uint8_t numframes);
48a2a55e51SPrabhakar Kushwaha /* token is the value that shows up in the dequeue results that can be used to
49a2a55e51SPrabhakar Kushwaha  * detect when the results have been published, and is not really used when
50a2a55e51SPrabhakar Kushwaha  * dequeue results go to DQRR. The easiest technique is to zero result "storage"
51a2a55e51SPrabhakar Kushwaha  * before issuing a pull dequeue, and use any non-zero 'token' value. */
52a2a55e51SPrabhakar Kushwaha void qbman_pull_desc_set_token(struct qbman_pull_desc *, uint8_t token);
53a2a55e51SPrabhakar Kushwaha /* Exactly one of the following descriptor "actions" should be set. (Calling any
54a2a55e51SPrabhakar Kushwaha  * one of these will replace the effect of any prior call to one of these.)
55a2a55e51SPrabhakar Kushwaha  * - pull dequeue from the given frame queue (FQ)
56a2a55e51SPrabhakar Kushwaha  * - pull dequeue from any FQ in the given work queue (WQ)
57a2a55e51SPrabhakar Kushwaha  * - pull dequeue from any FQ in any WQ in the given channel
58a2a55e51SPrabhakar Kushwaha  */
59a2a55e51SPrabhakar Kushwaha void qbman_pull_desc_set_fq(struct qbman_pull_desc *, uint32_t fqid);
60a2a55e51SPrabhakar Kushwaha 
61a2a55e51SPrabhakar Kushwaha /* Issue the pull dequeue command */
62a2a55e51SPrabhakar Kushwaha int qbman_swp_pull(struct qbman_swp *, struct qbman_pull_desc *);
63a2a55e51SPrabhakar Kushwaha 
64a2a55e51SPrabhakar Kushwaha /* -------------------------------- */
65a2a55e51SPrabhakar Kushwaha /* Polling DQRR for dequeue results */
66a2a55e51SPrabhakar Kushwaha /* -------------------------------- */
67a2a55e51SPrabhakar Kushwaha 
68a2a55e51SPrabhakar Kushwaha /* NULL return if there are no unconsumed DQRR entries. Returns a DQRR entry
69a2a55e51SPrabhakar Kushwaha  * only once, so repeated calls can return a sequence of DQRR entries, without
70a2a55e51SPrabhakar Kushwaha  * requiring they be consumed immediately or in any particular order. */
71a2a55e51SPrabhakar Kushwaha const struct ldpaa_dq *qbman_swp_dqrr_next(struct qbman_swp *);
72a2a55e51SPrabhakar Kushwaha /* Consume DQRR entries previously returned from qbman_swp_dqrr_next(). */
73a2a55e51SPrabhakar Kushwaha void qbman_swp_dqrr_consume(struct qbman_swp *, const struct ldpaa_dq *);
74a2a55e51SPrabhakar Kushwaha 
75a2a55e51SPrabhakar Kushwaha /* ------------------------------------------------- */
76a2a55e51SPrabhakar Kushwaha /* Polling user-provided storage for dequeue results */
77a2a55e51SPrabhakar Kushwaha /* ------------------------------------------------- */
78a2a55e51SPrabhakar Kushwaha 
79a2a55e51SPrabhakar Kushwaha /* Only used for user-provided storage of dequeue results, not DQRR. Prior to
80a2a55e51SPrabhakar Kushwaha  * being used, the storage must set "oldtoken", so that the driver notices when
81a2a55e51SPrabhakar Kushwaha  * hardware has filled it in with results using a "newtoken". NB, for efficiency
82a2a55e51SPrabhakar Kushwaha  * purposes, the driver will perform any required endianness conversion to
83a2a55e51SPrabhakar Kushwaha  * ensure that the user's dequeue result storage is in host-endian format
84a2a55e51SPrabhakar Kushwaha  * (whether or not that is the same as the little-endian format that hardware
85a2a55e51SPrabhakar Kushwaha  * DMA'd to the user's storage). As such, once the user has called
86a2a55e51SPrabhakar Kushwaha  * qbman_dq_entry_has_newtoken() and been returned a valid dequeue result, they
87a2a55e51SPrabhakar Kushwaha  * should not call it again on the same memory location (except of course if
88a2a55e51SPrabhakar Kushwaha  * another dequeue command has been executed to produce a new result to that
89a2a55e51SPrabhakar Kushwaha  * location).
90a2a55e51SPrabhakar Kushwaha  */
91a2a55e51SPrabhakar Kushwaha void qbman_dq_entry_set_oldtoken(struct ldpaa_dq *,
92a2a55e51SPrabhakar Kushwaha 				 unsigned int num_entries,
93a2a55e51SPrabhakar Kushwaha 				 uint8_t oldtoken);
94a2a55e51SPrabhakar Kushwaha int qbman_dq_entry_has_newtoken(struct qbman_swp *,
95a2a55e51SPrabhakar Kushwaha 				const struct ldpaa_dq *,
96a2a55e51SPrabhakar Kushwaha 				uint8_t newtoken);
97a2a55e51SPrabhakar Kushwaha 
98a2a55e51SPrabhakar Kushwaha /* -------------------------------------------------------- */
99a2a55e51SPrabhakar Kushwaha /* Parsing dequeue entries (DQRR and user-provided storage) */
100a2a55e51SPrabhakar Kushwaha /* -------------------------------------------------------- */
101a2a55e51SPrabhakar Kushwaha 
102a2a55e51SPrabhakar Kushwaha /* DQRR entries may contain non-dequeue results, ie. notifications */
103a2a55e51SPrabhakar Kushwaha int qbman_dq_entry_is_DQ(const struct ldpaa_dq *);
104a2a55e51SPrabhakar Kushwaha 
105a2a55e51SPrabhakar Kushwaha 	/************/
106a2a55e51SPrabhakar Kushwaha 	/* Enqueues */
107a2a55e51SPrabhakar Kushwaha 	/************/
108a2a55e51SPrabhakar Kushwaha 
109a2a55e51SPrabhakar Kushwaha struct qbman_eq_desc {
110a2a55e51SPrabhakar Kushwaha 	uint32_t dont_manipulate_directly[8];
111a2a55e51SPrabhakar Kushwaha };
112a2a55e51SPrabhakar Kushwaha 
113a2a55e51SPrabhakar Kushwaha 
114a2a55e51SPrabhakar Kushwaha /* Clear the contents of a descriptor to default/starting state. */
115a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_clear(struct qbman_eq_desc *);
116a2a55e51SPrabhakar Kushwaha /* Exactly one of the following descriptor "actions" should be set. (Calling
117a2a55e51SPrabhakar Kushwaha  * any one of these will replace the effect of any prior call to one of these.)
118a2a55e51SPrabhakar Kushwaha  * - enqueue without order-restoration
119a2a55e51SPrabhakar Kushwaha  * - enqueue with order-restoration
120a2a55e51SPrabhakar Kushwaha  * - fill a hole in the order-restoration sequence, without any enqueue
121a2a55e51SPrabhakar Kushwaha  * - advance NESN (Next Expected Sequence Number), without any enqueue
122a2a55e51SPrabhakar Kushwaha  * 'respond_success' indicates whether an enqueue response should be DMA'd
123a2a55e51SPrabhakar Kushwaha  * after success (otherwise a response is DMA'd only after failure).
124a2a55e51SPrabhakar Kushwaha  * 'incomplete' indicates that other fragments of the same 'seqnum' are yet to
125a2a55e51SPrabhakar Kushwaha  * be enqueued.
126a2a55e51SPrabhakar Kushwaha  */
127a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_set_no_orp(struct qbman_eq_desc *, int respond_success);
128a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_set_response(struct qbman_eq_desc *,
129a2a55e51SPrabhakar Kushwaha 				dma_addr_t storage_phys,
130a2a55e51SPrabhakar Kushwaha 				int stash);
131a2a55e51SPrabhakar Kushwaha /* token is the value that shows up in an enqueue response that can be used to
132a2a55e51SPrabhakar Kushwaha  * detect when the results have been published. The easiest technique is to zero
133a2a55e51SPrabhakar Kushwaha  * result "storage" before issuing an enqueue, and use any non-zero 'token'
134a2a55e51SPrabhakar Kushwaha  * value. */
135a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_set_token(struct qbman_eq_desc *, uint8_t token);
136a2a55e51SPrabhakar Kushwaha /* Exactly one of the following descriptor "targets" should be set. (Calling any
137a2a55e51SPrabhakar Kushwaha  * one of these will replace the effect of any prior call to one of these.)
138a2a55e51SPrabhakar Kushwaha  * - enqueue to a frame queue
139a2a55e51SPrabhakar Kushwaha  * - enqueue to a queuing destination
140a2a55e51SPrabhakar Kushwaha  * Note, that none of these will have any affect if the "action" type has been
141a2a55e51SPrabhakar Kushwaha  * set to "orp_hole" or "orp_nesn".
142a2a55e51SPrabhakar Kushwaha  */
143a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_set_fq(struct qbman_eq_desc *, uint32_t fqid);
144a2a55e51SPrabhakar Kushwaha void qbman_eq_desc_set_qd(struct qbman_eq_desc *, uint32_t qdid,
145a2a55e51SPrabhakar Kushwaha 			  uint32_t qd_bin, uint32_t qd_prio);
146a2a55e51SPrabhakar Kushwaha 
147a2a55e51SPrabhakar Kushwaha /* Issue an enqueue command. ('fd' should only be NULL if the "action" of the
148a2a55e51SPrabhakar Kushwaha  * descriptor is "orp_hole" or "orp_nesn".) */
149a2a55e51SPrabhakar Kushwaha int qbman_swp_enqueue(struct qbman_swp *, const struct qbman_eq_desc *,
150a2a55e51SPrabhakar Kushwaha 		      const struct qbman_fd *fd);
151a2a55e51SPrabhakar Kushwaha 
152a2a55e51SPrabhakar Kushwaha 	/*******************/
153a2a55e51SPrabhakar Kushwaha 	/* Buffer releases */
154a2a55e51SPrabhakar Kushwaha 	/*******************/
155a2a55e51SPrabhakar Kushwaha 
156a2a55e51SPrabhakar Kushwaha struct qbman_release_desc {
157a2a55e51SPrabhakar Kushwaha 	uint32_t dont_manipulate_directly[1];
158a2a55e51SPrabhakar Kushwaha };
159a2a55e51SPrabhakar Kushwaha 
160a2a55e51SPrabhakar Kushwaha /* Clear the contents of a descriptor to default/starting state. */
161a2a55e51SPrabhakar Kushwaha void qbman_release_desc_clear(struct qbman_release_desc *);
162a2a55e51SPrabhakar Kushwaha /* Set the ID of the buffer pool to release to */
163a2a55e51SPrabhakar Kushwaha void qbman_release_desc_set_bpid(struct qbman_release_desc *, uint32_t bpid);
164a2a55e51SPrabhakar Kushwaha /* Issue a release command. 'num_buffers' must be less than 8. */
165a2a55e51SPrabhakar Kushwaha int qbman_swp_release(struct qbman_swp *, const struct qbman_release_desc *,
166a2a55e51SPrabhakar Kushwaha 		      const uint64_t *buffers, unsigned int num_buffers);
167a2a55e51SPrabhakar Kushwaha 
168a2a55e51SPrabhakar Kushwaha 	/*******************/
169a2a55e51SPrabhakar Kushwaha 	/* Buffer acquires */
170a2a55e51SPrabhakar Kushwaha 	/*******************/
171a2a55e51SPrabhakar Kushwaha 
172a2a55e51SPrabhakar Kushwaha int qbman_swp_acquire(struct qbman_swp *, uint32_t bpid, uint64_t *buffers,
173a2a55e51SPrabhakar Kushwaha 		      unsigned int num_buffers);
174a2a55e51SPrabhakar Kushwaha #endif /* !_FSL_QBMAN_PORTAL_H */
175