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