Lines Matching +full:restricted +full:- +full:dma +full:- +full:pool
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
82 #define RX_SEG_SZ (((MJUM9BYTES - 1) / PAGE_SIZE + 1) * PAGE_SIZE)
83 #define RX_SEG_MAXSZ (((MJUM9BYTES - 1) / PAGE_SIZE + 1) * PAGE_SIZE)
87 #define TX_SEG_N (16u) /* XXX-DSL: does DPAA2 limit exist? */
128 error = DPAA2_CMD_RC_OPEN(dev, child, &cmd, rcinfo->id, &rctk); in dpaa2_chan_setup()
131 __func__, rcinfo->id, error); in dpaa2_chan_setup()
134 error = DPAA2_CMD_CON_OPEN(dev, child, &cmd, coninfo->id, &contk); in dpaa2_chan_setup()
137 __func__, coninfo->id, error); in dpaa2_chan_setup()
144 "chan_id=%d\n", __func__, coninfo->id, consc->attr.chan_id); in dpaa2_chan_setup()
149 ch->ni_dev = dev; in dpaa2_chan_setup()
150 ch->io_dev = iodev; in dpaa2_chan_setup()
151 ch->con_dev = condev; in dpaa2_chan_setup()
152 ch->id = consc->attr.chan_id; in dpaa2_chan_setup()
153 ch->flowid = flowid; in dpaa2_chan_setup()
154 ch->tx_frames = 0; /* for debug purposes */ in dpaa2_chan_setup()
155 ch->tx_dropped = 0; /* for debug purposes */ in dpaa2_chan_setup()
156 ch->store_sz = 0; in dpaa2_chan_setup()
157 ch->store_idx = 0; in dpaa2_chan_setup()
158 ch->recycled_n = 0; in dpaa2_chan_setup()
159 ch->rxq_n = 0; in dpaa2_chan_setup()
161 NET_TASK_INIT(&ch->cleanup_task, 0, cleanup_task_fn, ch); in dpaa2_chan_setup()
162 NET_TASK_INIT(&ch->bp_task, 0, dpaa2_chan_bp_task, ch); in dpaa2_chan_setup()
164 ch->cleanup_tq = taskqueue_create("dpaa2_ch cleanup", M_WAITOK, in dpaa2_chan_setup()
165 taskqueue_thread_enqueue, &ch->cleanup_tq); in dpaa2_chan_setup()
166 taskqueue_start_threads_cpuset(&ch->cleanup_tq, 1, PI_NET, in dpaa2_chan_setup()
167 &iosc->cpu_mask, "dpaa2_ch%d cleanup", ch->id); in dpaa2_chan_setup()
169 error = dpaa2_chan_setup_dma(dev, ch, sc->buf_align); in dpaa2_chan_setup()
171 device_printf(dev, "%s: failed to setup DMA\n", __func__); in dpaa2_chan_setup()
175 mtx_init(&ch->xmit_mtx, "dpaa2_ch_xmit", NULL, MTX_DEF); in dpaa2_chan_setup()
177 ch->xmit_br = buf_ring_alloc(DPAA2_TX_BUFRING_SZ, M_DEVBUF, M_NOWAIT, in dpaa2_chan_setup()
178 &ch->xmit_mtx); in dpaa2_chan_setup()
179 if (ch->xmit_br == NULL) { in dpaa2_chan_setup()
185 DPAA2_BUF_INIT(&ch->store); in dpaa2_chan_setup()
188 ctx = &ch->ctx; in dpaa2_chan_setup()
189 ctx->qman_ctx = (uint64_t)ctx; in dpaa2_chan_setup()
190 ctx->cdan_en = true; in dpaa2_chan_setup()
191 ctx->fq_chan_id = ch->id; in dpaa2_chan_setup()
192 ctx->io_dev = ch->io_dev; in dpaa2_chan_setup()
193 ctx->channel = ch; in dpaa2_chan_setup()
194 error = DPAA2_SWP_CONF_WQ_CHANNEL(ch->io_dev, ctx); in dpaa2_chan_setup()
202 notif_cfg.dpio_id = ioinfo->id; in dpaa2_chan_setup()
204 notif_cfg.qman_ctx = ctx->qman_ctx; in dpaa2_chan_setup()
209 coninfo->id, consc->attr.chan_id); in dpaa2_chan_setup()
217 device_printf(dev, "%s: failed to seed buffer pool\n", in dpaa2_chan_setup()
222 BUS_DMA_NOWAIT, sc->buf_align); in dpaa2_chan_setup()
228 ch->store_sz = DPAA2_ETH_STORE_FRAMES; in dpaa2_chan_setup()
247 "priorities=%d\n", ioinfo->id, coninfo->id, ch->id, in dpaa2_chan_setup()
248 consc->attr.prior_num); in dpaa2_chan_setup()
259 if (ch->store.vaddr != NULL) { in dpaa2_chan_setup()
260 bus_dmamem_free(ch->store.dmat, ch->store.vaddr, ch->store.dmap); in dpaa2_chan_setup()
262 if (ch->store.dmat != NULL) { in dpaa2_chan_setup()
263 bus_dma_tag_destroy(ch->store.dmat); in dpaa2_chan_setup()
265 ch->store.dmat = NULL; in dpaa2_chan_setup()
266 ch->store.vaddr = NULL; in dpaa2_chan_setup()
267 ch->store.paddr = 0; in dpaa2_chan_setup()
268 ch->store.nseg = 0; in dpaa2_chan_setup()
270 buf_ring_free(ch->xmit_br, M_DEVBUF); in dpaa2_chan_setup()
272 mtx_destroy(&ch->xmit_mtx); in dpaa2_chan_setup()
274 /* while (taskqueue_cancel(ch->cleanup_tq, &ch->cleanup_task, NULL)) { */ in dpaa2_chan_setup()
275 /* taskqueue_drain(ch->cleanup_tq, &ch->cleanup_task); */ in dpaa2_chan_setup()
277 /* taskqueue_free(ch->cleanup_tq); */ in dpaa2_chan_setup()
300 fq = &ch->txc_queue; in dpaa2_chan_setup_fq()
301 fq->chan = ch; in dpaa2_chan_setup_fq()
302 fq->flowid = ch->flowid; in dpaa2_chan_setup_fq()
303 fq->tc = 0; /* ignored */ in dpaa2_chan_setup_fq()
304 fq->type = queue_type; in dpaa2_chan_setup_fq()
307 KASSERT(sc->attr.num.rx_tcs <= DPAA2_MAX_TCS, in dpaa2_chan_setup_fq()
309 sc->attr.num.rx_tcs)); in dpaa2_chan_setup_fq()
312 for (int i = 0; i < sc->attr.num.rx_tcs; i++) { in dpaa2_chan_setup_fq()
313 fq = &ch->rx_queues[i]; in dpaa2_chan_setup_fq()
314 fq->chan = ch; in dpaa2_chan_setup_fq()
315 fq->flowid = ch->flowid; in dpaa2_chan_setup_fq()
316 fq->tc = (uint8_t) i; in dpaa2_chan_setup_fq()
317 fq->type = queue_type; in dpaa2_chan_setup_fq()
319 ch->rxq_n++; in dpaa2_chan_setup_fq()
324 fq = &sc->rxe_queue; in dpaa2_chan_setup_fq()
325 fq->chan = ch; in dpaa2_chan_setup_fq()
326 fq->flowid = 0; /* ignored */ in dpaa2_chan_setup_fq()
327 fq->tc = 0; /* ignored */ in dpaa2_chan_setup_fq()
328 fq->type = queue_type; in dpaa2_chan_setup_fq()
345 struct dpaa2_buf *buf = &ch->store; in dpaa2_chan_next_frame()
346 struct dpaa2_dq *msgs = (struct dpaa2_dq *)buf->vaddr; in dpaa2_chan_next_frame()
347 struct dpaa2_dq *msg = &msgs[ch->store_idx]; in dpaa2_chan_next_frame()
350 ch->store_idx++; in dpaa2_chan_next_frame()
352 if (msg->fdr.desc.stat & DPAA2_DQ_STAT_EXPIRED) { in dpaa2_chan_next_frame()
354 ch->store_idx = 0; in dpaa2_chan_next_frame()
355 if (!(msg->fdr.desc.stat & DPAA2_DQ_STAT_VALIDFRAME)) { in dpaa2_chan_next_frame()
359 if (msg != NULL && (msg->fdr.desc.stat & DPAA2_DQ_STAT_FQEMPTY)) { in dpaa2_chan_next_frame()
361 ch->store_idx = 0; in dpaa2_chan_next_frame()
377 mtx_init(&ch->dma_mtx, "dpaa2_ch_dma_mtx", NULL, MTX_DEF); in dpaa2_chan_setup_dma()
382 BUS_SPACE_MAXADDR, /* low restricted addr */ in dpaa2_chan_setup_dma()
383 BUS_SPACE_MAXADDR, /* high restricted addr */ in dpaa2_chan_setup_dma()
391 &ch->rx_dmat); in dpaa2_chan_setup_dma()
400 BUS_SPACE_MAXADDR, /* low restricted addr */ in dpaa2_chan_setup_dma()
401 BUS_SPACE_MAXADDR, /* high restricted addr */ in dpaa2_chan_setup_dma()
409 &ch->tx_dmat); in dpaa2_chan_setup_dma()
418 BUS_SPACE_MAXADDR, /* low restricted addr */ in dpaa2_chan_setup_dma()
419 BUS_SPACE_MAXADDR, /* high restricted addr */ in dpaa2_chan_setup_dma()
427 &ch->sgt_dmat); in dpaa2_chan_setup_dma()
436 bus_dma_tag_destroy(ch->tx_dmat); in dpaa2_chan_setup_dma()
438 bus_dma_tag_destroy(ch->rx_dmat); in dpaa2_chan_setup_dma()
440 mtx_destroy(&ch->dma_mtx); in dpaa2_chan_setup_dma()
441 ch->rx_dmat = NULL; in dpaa2_chan_setup_dma()
442 ch->tx_dmat = NULL; in dpaa2_chan_setup_dma()
443 ch->sgt_dmat = NULL; in dpaa2_chan_setup_dma()
449 * @brief Allocate a DMA-mapped storage to keep responses from VDQ command.
455 struct dpaa2_buf *buf = &ch->store; in dpaa2_chan_alloc_storage()
456 uint32_t maxsize = ((size - 1) / PAGE_SIZE + 1) * PAGE_SIZE; in dpaa2_chan_alloc_storage()
462 BUS_SPACE_MAXADDR, /* low restricted addr */ in dpaa2_chan_alloc_storage()
463 BUS_SPACE_MAXADDR, /* high restricted addr */ in dpaa2_chan_alloc_storage()
471 &buf->dmat); in dpaa2_chan_alloc_storage()
473 device_printf(dev, "%s: failed to create DMA tag\n", __func__); in dpaa2_chan_alloc_storage()
477 error = bus_dmamem_alloc(buf->dmat, (void **)&buf->vaddr, in dpaa2_chan_alloc_storage()
478 BUS_DMA_ZERO | BUS_DMA_COHERENT, &buf->dmap); in dpaa2_chan_alloc_storage()
485 buf->paddr = 0; in dpaa2_chan_alloc_storage()
486 error = bus_dmamap_load(buf->dmat, buf->dmap, buf->vaddr, size, in dpaa2_chan_alloc_storage()
487 dpaa2_dmamap_oneseg_cb, &buf->paddr, mapflags); in dpaa2_chan_alloc_storage()
494 bus_dmamap_sync(buf->dmat, buf->dmap, in dpaa2_chan_alloc_storage()
497 buf->nseg = 1; in dpaa2_chan_alloc_storage()
502 bus_dmamem_free(buf->dmat, buf->vaddr, buf->dmap); in dpaa2_chan_alloc_storage()
504 bus_dma_tag_destroy(buf->dmat); in dpaa2_chan_alloc_storage()
506 buf->dmat = NULL; in dpaa2_chan_alloc_storage()
507 buf->vaddr = NULL; in dpaa2_chan_alloc_storage()
508 buf->paddr = 0; in dpaa2_chan_alloc_storage()
509 buf->nseg = 0; in dpaa2_chan_alloc_storage()
515 * @brief Release new buffers to the buffer pool if necessary.
521 struct dpaa2_ni_softc *sc = device_get_softc(ch->ni_dev); in dpaa2_chan_bp_task()
524 const int buf_num = DPAA2_ATOMIC_READ(&sc->buf_num); in dpaa2_chan_bp_task()
528 /* There's only one buffer pool for now */ in dpaa2_chan_bp_task()
529 bpdev = (device_t)rman_get_start(sc->res[DPAA2_NI_BP_RID(0)]); in dpaa2_chan_bp_task()
532 /* Get state of the buffer pool */ in dpaa2_chan_bp_task()
533 error = DPAA2_SWP_QUERY_BP(ch->io_dev, bpsc->attr.bpid, &bpconf); in dpaa2_chan_bp_task()
535 device_printf(sc->dev, "%s: DPAA2_SWP_QUERY_BP() failed: " in dpaa2_chan_bp_task()
542 mtx_assert(&ch->dma_mtx, MA_NOTOWNED); in dpaa2_chan_bp_task()
543 mtx_lock(&ch->dma_mtx); in dpaa2_chan_bp_task()
544 (void)dpaa2_buf_seed_pool(ch->ni_dev, bpdev, ch, buf_num, in dpaa2_chan_bp_task()
545 DPAA2_RX_BUF_SIZE, &ch->dma_mtx); in dpaa2_chan_bp_task()
546 mtx_unlock(&ch->dma_mtx); in dpaa2_chan_bp_task()
548 DPAA2_ATOMIC_XCHG(&sc->buf_free, bpconf.free_bufn); in dpaa2_chan_bp_task()