ocelot_fdma.c (22844B)
1// SPDX-License-Identifier: (GPL-2.0 OR MIT) 2/* 3 * Microsemi SoCs FDMA driver 4 * 5 * Copyright (c) 2021 Microchip 6 * 7 * Page recycling code is mostly taken from gianfar driver. 8 */ 9 10#include <linux/align.h> 11#include <linux/bitops.h> 12#include <linux/dmapool.h> 13#include <linux/dsa/ocelot.h> 14#include <linux/netdevice.h> 15#include <linux/of_platform.h> 16#include <linux/skbuff.h> 17 18#include "ocelot_fdma.h" 19#include "ocelot_qs.h" 20 21DEFINE_STATIC_KEY_FALSE(ocelot_fdma_enabled); 22 23static void ocelot_fdma_writel(struct ocelot *ocelot, u32 reg, u32 data) 24{ 25 regmap_write(ocelot->targets[FDMA], reg, data); 26} 27 28static u32 ocelot_fdma_readl(struct ocelot *ocelot, u32 reg) 29{ 30 u32 retval; 31 32 regmap_read(ocelot->targets[FDMA], reg, &retval); 33 34 return retval; 35} 36 37static dma_addr_t ocelot_fdma_idx_dma(dma_addr_t base, u16 idx) 38{ 39 return base + idx * sizeof(struct ocelot_fdma_dcb); 40} 41 42static u16 ocelot_fdma_dma_idx(dma_addr_t base, dma_addr_t dma) 43{ 44 return (dma - base) / sizeof(struct ocelot_fdma_dcb); 45} 46 47static u16 ocelot_fdma_idx_next(u16 idx, u16 ring_sz) 48{ 49 return unlikely(idx == ring_sz - 1) ? 0 : idx + 1; 50} 51 52static u16 ocelot_fdma_idx_prev(u16 idx, u16 ring_sz) 53{ 54 return unlikely(idx == 0) ? ring_sz - 1 : idx - 1; 55} 56 57static int ocelot_fdma_rx_ring_free(struct ocelot_fdma *fdma) 58{ 59 struct ocelot_fdma_rx_ring *rx_ring = &fdma->rx_ring; 60 61 if (rx_ring->next_to_use >= rx_ring->next_to_clean) 62 return OCELOT_FDMA_RX_RING_SIZE - 63 (rx_ring->next_to_use - rx_ring->next_to_clean) - 1; 64 else 65 return rx_ring->next_to_clean - rx_ring->next_to_use - 1; 66} 67 68static int ocelot_fdma_tx_ring_free(struct ocelot_fdma *fdma) 69{ 70 struct ocelot_fdma_tx_ring *tx_ring = &fdma->tx_ring; 71 72 if (tx_ring->next_to_use >= tx_ring->next_to_clean) 73 return OCELOT_FDMA_TX_RING_SIZE - 74 (tx_ring->next_to_use - tx_ring->next_to_clean) - 1; 75 else 76 return tx_ring->next_to_clean - tx_ring->next_to_use - 1; 77} 78 79static bool ocelot_fdma_tx_ring_empty(struct ocelot_fdma *fdma) 80{ 81 struct ocelot_fdma_tx_ring *tx_ring = &fdma->tx_ring; 82 83 return tx_ring->next_to_clean == tx_ring->next_to_use; 84} 85 86static void ocelot_fdma_activate_chan(struct ocelot *ocelot, dma_addr_t dma, 87 int chan) 88{ 89 ocelot_fdma_writel(ocelot, MSCC_FDMA_DCB_LLP(chan), dma); 90 /* Barrier to force memory writes to DCB to be completed before starting 91 * the channel. 92 */ 93 wmb(); 94 ocelot_fdma_writel(ocelot, MSCC_FDMA_CH_ACTIVATE, BIT(chan)); 95} 96 97static int ocelot_fdma_wait_chan_safe(struct ocelot *ocelot, int chan) 98{ 99 unsigned long timeout; 100 u32 safe; 101 102 timeout = jiffies + usecs_to_jiffies(OCELOT_FDMA_CH_SAFE_TIMEOUT_US); 103 do { 104 safe = ocelot_fdma_readl(ocelot, MSCC_FDMA_CH_SAFE); 105 if (safe & BIT(chan)) 106 return 0; 107 } while (time_after(jiffies, timeout)); 108 109 return -ETIMEDOUT; 110} 111 112static void ocelot_fdma_dcb_set_data(struct ocelot_fdma_dcb *dcb, 113 dma_addr_t dma_addr, 114 size_t size) 115{ 116 u32 offset = dma_addr & 0x3; 117 118 dcb->llp = 0; 119 dcb->datap = ALIGN_DOWN(dma_addr, 4); 120 dcb->datal = ALIGN_DOWN(size, 4); 121 dcb->stat = MSCC_FDMA_DCB_STAT_BLOCKO(offset); 122} 123 124static bool ocelot_fdma_rx_alloc_page(struct ocelot *ocelot, 125 struct ocelot_fdma_rx_buf *rxb) 126{ 127 dma_addr_t mapping; 128 struct page *page; 129 130 page = dev_alloc_page(); 131 if (unlikely(!page)) 132 return false; 133 134 mapping = dma_map_page(ocelot->dev, page, 0, PAGE_SIZE, 135 DMA_FROM_DEVICE); 136 if (unlikely(dma_mapping_error(ocelot->dev, mapping))) { 137 __free_page(page); 138 return false; 139 } 140 141 rxb->page = page; 142 rxb->page_offset = 0; 143 rxb->dma_addr = mapping; 144 145 return true; 146} 147 148static int ocelot_fdma_alloc_rx_buffs(struct ocelot *ocelot, u16 alloc_cnt) 149{ 150 struct ocelot_fdma *fdma = ocelot->fdma; 151 struct ocelot_fdma_rx_ring *rx_ring; 152 struct ocelot_fdma_rx_buf *rxb; 153 struct ocelot_fdma_dcb *dcb; 154 dma_addr_t dma_addr; 155 int ret = 0; 156 u16 idx; 157 158 rx_ring = &fdma->rx_ring; 159 idx = rx_ring->next_to_use; 160 161 while (alloc_cnt--) { 162 rxb = &rx_ring->bufs[idx]; 163 /* try reuse page */ 164 if (unlikely(!rxb->page)) { 165 if (unlikely(!ocelot_fdma_rx_alloc_page(ocelot, rxb))) { 166 dev_err_ratelimited(ocelot->dev, 167 "Failed to allocate rx\n"); 168 ret = -ENOMEM; 169 break; 170 } 171 } 172 173 dcb = &rx_ring->dcbs[idx]; 174 dma_addr = rxb->dma_addr + rxb->page_offset; 175 ocelot_fdma_dcb_set_data(dcb, dma_addr, OCELOT_FDMA_RXB_SIZE); 176 177 idx = ocelot_fdma_idx_next(idx, OCELOT_FDMA_RX_RING_SIZE); 178 /* Chain the DCB to the next one */ 179 dcb->llp = ocelot_fdma_idx_dma(rx_ring->dcbs_dma, idx); 180 } 181 182 rx_ring->next_to_use = idx; 183 rx_ring->next_to_alloc = idx; 184 185 return ret; 186} 187 188static bool ocelot_fdma_tx_dcb_set_skb(struct ocelot *ocelot, 189 struct ocelot_fdma_tx_buf *tx_buf, 190 struct ocelot_fdma_dcb *dcb, 191 struct sk_buff *skb) 192{ 193 dma_addr_t mapping; 194 195 mapping = dma_map_single(ocelot->dev, skb->data, skb->len, 196 DMA_TO_DEVICE); 197 if (unlikely(dma_mapping_error(ocelot->dev, mapping))) 198 return false; 199 200 dma_unmap_addr_set(tx_buf, dma_addr, mapping); 201 202 ocelot_fdma_dcb_set_data(dcb, mapping, OCELOT_FDMA_RX_SIZE); 203 tx_buf->skb = skb; 204 dcb->stat |= MSCC_FDMA_DCB_STAT_BLOCKL(skb->len); 205 dcb->stat |= MSCC_FDMA_DCB_STAT_SOF | MSCC_FDMA_DCB_STAT_EOF; 206 207 return true; 208} 209 210static bool ocelot_fdma_check_stop_rx(struct ocelot *ocelot) 211{ 212 u32 llp; 213 214 /* Check if the FDMA hits the DCB with LLP == NULL */ 215 llp = ocelot_fdma_readl(ocelot, MSCC_FDMA_DCB_LLP(MSCC_FDMA_XTR_CHAN)); 216 if (unlikely(llp)) 217 return false; 218 219 ocelot_fdma_writel(ocelot, MSCC_FDMA_CH_DISABLE, 220 BIT(MSCC_FDMA_XTR_CHAN)); 221 222 return true; 223} 224 225static void ocelot_fdma_rx_set_llp(struct ocelot_fdma_rx_ring *rx_ring) 226{ 227 struct ocelot_fdma_dcb *dcb; 228 unsigned int idx; 229 230 idx = ocelot_fdma_idx_prev(rx_ring->next_to_use, 231 OCELOT_FDMA_RX_RING_SIZE); 232 dcb = &rx_ring->dcbs[idx]; 233 dcb->llp = 0; 234} 235 236static void ocelot_fdma_rx_restart(struct ocelot *ocelot) 237{ 238 struct ocelot_fdma *fdma = ocelot->fdma; 239 struct ocelot_fdma_rx_ring *rx_ring; 240 const u8 chan = MSCC_FDMA_XTR_CHAN; 241 dma_addr_t new_llp, dma_base; 242 unsigned int idx; 243 u32 llp_prev; 244 int ret; 245 246 rx_ring = &fdma->rx_ring; 247 ret = ocelot_fdma_wait_chan_safe(ocelot, chan); 248 if (ret) { 249 dev_err_ratelimited(ocelot->dev, 250 "Unable to stop RX channel\n"); 251 return; 252 } 253 254 ocelot_fdma_rx_set_llp(rx_ring); 255 256 /* FDMA stopped on the last DCB that contained a NULL LLP, since 257 * we processed some DCBs in RX, there is free space, and we must set 258 * DCB_LLP to point to the next DCB 259 */ 260 llp_prev = ocelot_fdma_readl(ocelot, MSCC_FDMA_DCB_LLP_PREV(chan)); 261 dma_base = rx_ring->dcbs_dma; 262 263 /* Get the next DMA addr located after LLP == NULL DCB */ 264 idx = ocelot_fdma_dma_idx(dma_base, llp_prev); 265 idx = ocelot_fdma_idx_next(idx, OCELOT_FDMA_RX_RING_SIZE); 266 new_llp = ocelot_fdma_idx_dma(dma_base, idx); 267 268 /* Finally reactivate the channel */ 269 ocelot_fdma_activate_chan(ocelot, new_llp, chan); 270} 271 272static bool ocelot_fdma_add_rx_frag(struct ocelot_fdma_rx_buf *rxb, u32 stat, 273 struct sk_buff *skb, bool first) 274{ 275 int size = MSCC_FDMA_DCB_STAT_BLOCKL(stat); 276 struct page *page = rxb->page; 277 278 if (likely(first)) { 279 skb_put(skb, size); 280 } else { 281 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, 282 rxb->page_offset, size, OCELOT_FDMA_RX_SIZE); 283 } 284 285 /* Try to reuse page */ 286 if (unlikely(page_ref_count(page) != 1 || page_is_pfmemalloc(page))) 287 return false; 288 289 /* Change offset to the other half */ 290 rxb->page_offset ^= OCELOT_FDMA_RX_SIZE; 291 292 page_ref_inc(page); 293 294 return true; 295} 296 297static void ocelot_fdma_reuse_rx_page(struct ocelot *ocelot, 298 struct ocelot_fdma_rx_buf *old_rxb) 299{ 300 struct ocelot_fdma_rx_ring *rx_ring = &ocelot->fdma->rx_ring; 301 struct ocelot_fdma_rx_buf *new_rxb; 302 303 new_rxb = &rx_ring->bufs[rx_ring->next_to_alloc]; 304 rx_ring->next_to_alloc = ocelot_fdma_idx_next(rx_ring->next_to_alloc, 305 OCELOT_FDMA_RX_RING_SIZE); 306 307 /* Copy page reference */ 308 *new_rxb = *old_rxb; 309 310 /* Sync for use by the device */ 311 dma_sync_single_range_for_device(ocelot->dev, old_rxb->dma_addr, 312 old_rxb->page_offset, 313 OCELOT_FDMA_RX_SIZE, DMA_FROM_DEVICE); 314} 315 316static struct sk_buff *ocelot_fdma_get_skb(struct ocelot *ocelot, u32 stat, 317 struct ocelot_fdma_rx_buf *rxb, 318 struct sk_buff *skb) 319{ 320 bool first = false; 321 322 /* Allocate skb head and data */ 323 if (likely(!skb)) { 324 void *buff_addr = page_address(rxb->page) + 325 rxb->page_offset; 326 327 skb = build_skb(buff_addr, OCELOT_FDMA_SKBFRAG_SIZE); 328 if (unlikely(!skb)) { 329 dev_err_ratelimited(ocelot->dev, 330 "build_skb failed !\n"); 331 return NULL; 332 } 333 first = true; 334 } 335 336 dma_sync_single_range_for_cpu(ocelot->dev, rxb->dma_addr, 337 rxb->page_offset, OCELOT_FDMA_RX_SIZE, 338 DMA_FROM_DEVICE); 339 340 if (ocelot_fdma_add_rx_frag(rxb, stat, skb, first)) { 341 /* Reuse the free half of the page for the next_to_alloc DCB*/ 342 ocelot_fdma_reuse_rx_page(ocelot, rxb); 343 } else { 344 /* page cannot be reused, unmap it */ 345 dma_unmap_page(ocelot->dev, rxb->dma_addr, PAGE_SIZE, 346 DMA_FROM_DEVICE); 347 } 348 349 /* clear rx buff content */ 350 rxb->page = NULL; 351 352 return skb; 353} 354 355static bool ocelot_fdma_receive_skb(struct ocelot *ocelot, struct sk_buff *skb) 356{ 357 struct net_device *ndev; 358 void *xfh = skb->data; 359 u64 timestamp; 360 u64 src_port; 361 362 skb_pull(skb, OCELOT_TAG_LEN); 363 364 ocelot_xfh_get_src_port(xfh, &src_port); 365 if (unlikely(src_port >= ocelot->num_phys_ports)) 366 return false; 367 368 ndev = ocelot_port_to_netdev(ocelot, src_port); 369 if (unlikely(!ndev)) 370 return false; 371 372 pskb_trim(skb, skb->len - ETH_FCS_LEN); 373 374 skb->dev = ndev; 375 skb->protocol = eth_type_trans(skb, skb->dev); 376 skb->dev->stats.rx_bytes += skb->len; 377 skb->dev->stats.rx_packets++; 378 379 if (ocelot->ptp) { 380 ocelot_xfh_get_rew_val(xfh, ×tamp); 381 ocelot_ptp_rx_timestamp(ocelot, skb, timestamp); 382 } 383 384 if (likely(!skb_defer_rx_timestamp(skb))) 385 netif_receive_skb(skb); 386 387 return true; 388} 389 390static int ocelot_fdma_rx_get(struct ocelot *ocelot, int budget) 391{ 392 struct ocelot_fdma *fdma = ocelot->fdma; 393 struct ocelot_fdma_rx_ring *rx_ring; 394 struct ocelot_fdma_rx_buf *rxb; 395 struct ocelot_fdma_dcb *dcb; 396 struct sk_buff *skb; 397 int work_done = 0; 398 int cleaned_cnt; 399 u32 stat; 400 u16 idx; 401 402 cleaned_cnt = ocelot_fdma_rx_ring_free(fdma); 403 rx_ring = &fdma->rx_ring; 404 skb = rx_ring->skb; 405 406 while (budget--) { 407 idx = rx_ring->next_to_clean; 408 dcb = &rx_ring->dcbs[idx]; 409 stat = dcb->stat; 410 if (MSCC_FDMA_DCB_STAT_BLOCKL(stat) == 0) 411 break; 412 413 /* New packet is a start of frame but we already got a skb set, 414 * we probably lost an EOF packet, free skb 415 */ 416 if (unlikely(skb && (stat & MSCC_FDMA_DCB_STAT_SOF))) { 417 dev_kfree_skb(skb); 418 skb = NULL; 419 } 420 421 rxb = &rx_ring->bufs[idx]; 422 /* Fetch next to clean buffer from the rx_ring */ 423 skb = ocelot_fdma_get_skb(ocelot, stat, rxb, skb); 424 if (unlikely(!skb)) 425 break; 426 427 work_done++; 428 cleaned_cnt++; 429 430 idx = ocelot_fdma_idx_next(idx, OCELOT_FDMA_RX_RING_SIZE); 431 rx_ring->next_to_clean = idx; 432 433 if (unlikely(stat & MSCC_FDMA_DCB_STAT_ABORT || 434 stat & MSCC_FDMA_DCB_STAT_PD)) { 435 dev_err_ratelimited(ocelot->dev, 436 "DCB aborted or pruned\n"); 437 dev_kfree_skb(skb); 438 skb = NULL; 439 continue; 440 } 441 442 /* We still need to process the other fragment of the packet 443 * before delivering it to the network stack 444 */ 445 if (!(stat & MSCC_FDMA_DCB_STAT_EOF)) 446 continue; 447 448 if (unlikely(!ocelot_fdma_receive_skb(ocelot, skb))) 449 dev_kfree_skb(skb); 450 451 skb = NULL; 452 } 453 454 rx_ring->skb = skb; 455 456 if (cleaned_cnt) 457 ocelot_fdma_alloc_rx_buffs(ocelot, cleaned_cnt); 458 459 return work_done; 460} 461 462static void ocelot_fdma_wakeup_netdev(struct ocelot *ocelot) 463{ 464 struct ocelot_port_private *priv; 465 struct ocelot_port *ocelot_port; 466 struct net_device *dev; 467 int port; 468 469 for (port = 0; port < ocelot->num_phys_ports; port++) { 470 ocelot_port = ocelot->ports[port]; 471 if (!ocelot_port) 472 continue; 473 priv = container_of(ocelot_port, struct ocelot_port_private, 474 port); 475 dev = priv->dev; 476 477 if (unlikely(netif_queue_stopped(dev))) 478 netif_wake_queue(dev); 479 } 480} 481 482static void ocelot_fdma_tx_cleanup(struct ocelot *ocelot, int budget) 483{ 484 struct ocelot_fdma *fdma = ocelot->fdma; 485 struct ocelot_fdma_tx_ring *tx_ring; 486 struct ocelot_fdma_tx_buf *buf; 487 unsigned int new_null_llp_idx; 488 struct ocelot_fdma_dcb *dcb; 489 bool end_of_list = false; 490 struct sk_buff *skb; 491 dma_addr_t dma; 492 u32 dcb_llp; 493 u16 ntc; 494 int ret; 495 496 tx_ring = &fdma->tx_ring; 497 498 /* Purge the TX packets that have been sent up to the NULL llp or the 499 * end of done list. 500 */ 501 while (!ocelot_fdma_tx_ring_empty(fdma)) { 502 ntc = tx_ring->next_to_clean; 503 dcb = &tx_ring->dcbs[ntc]; 504 if (!(dcb->stat & MSCC_FDMA_DCB_STAT_PD)) 505 break; 506 507 buf = &tx_ring->bufs[ntc]; 508 skb = buf->skb; 509 dma_unmap_single(ocelot->dev, dma_unmap_addr(buf, dma_addr), 510 skb->len, DMA_TO_DEVICE); 511 napi_consume_skb(skb, budget); 512 dcb_llp = dcb->llp; 513 514 /* Only update after accessing all dcb fields */ 515 tx_ring->next_to_clean = ocelot_fdma_idx_next(ntc, 516 OCELOT_FDMA_TX_RING_SIZE); 517 518 /* If we hit the NULL LLP, stop, we might need to reload FDMA */ 519 if (dcb_llp == 0) { 520 end_of_list = true; 521 break; 522 } 523 } 524 525 /* No need to try to wake if there were no TX cleaned_cnt up. */ 526 if (ocelot_fdma_tx_ring_free(fdma)) 527 ocelot_fdma_wakeup_netdev(ocelot); 528 529 /* If there is still some DCBs to be processed by the FDMA or if the 530 * pending list is empty, there is no need to restart the FDMA. 531 */ 532 if (!end_of_list || ocelot_fdma_tx_ring_empty(fdma)) 533 return; 534 535 ret = ocelot_fdma_wait_chan_safe(ocelot, MSCC_FDMA_INJ_CHAN); 536 if (ret) { 537 dev_warn(ocelot->dev, 538 "Failed to wait for TX channel to stop\n"); 539 return; 540 } 541 542 /* Set NULL LLP to be the last DCB used */ 543 new_null_llp_idx = ocelot_fdma_idx_prev(tx_ring->next_to_use, 544 OCELOT_FDMA_TX_RING_SIZE); 545 dcb = &tx_ring->dcbs[new_null_llp_idx]; 546 dcb->llp = 0; 547 548 dma = ocelot_fdma_idx_dma(tx_ring->dcbs_dma, tx_ring->next_to_clean); 549 ocelot_fdma_activate_chan(ocelot, dma, MSCC_FDMA_INJ_CHAN); 550} 551 552static int ocelot_fdma_napi_poll(struct napi_struct *napi, int budget) 553{ 554 struct ocelot_fdma *fdma = container_of(napi, struct ocelot_fdma, napi); 555 struct ocelot *ocelot = fdma->ocelot; 556 int work_done = 0; 557 bool rx_stopped; 558 559 ocelot_fdma_tx_cleanup(ocelot, budget); 560 561 rx_stopped = ocelot_fdma_check_stop_rx(ocelot); 562 563 work_done = ocelot_fdma_rx_get(ocelot, budget); 564 565 if (rx_stopped) 566 ocelot_fdma_rx_restart(ocelot); 567 568 if (work_done < budget) { 569 napi_complete_done(&fdma->napi, work_done); 570 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_ENA, 571 BIT(MSCC_FDMA_INJ_CHAN) | 572 BIT(MSCC_FDMA_XTR_CHAN)); 573 } 574 575 return work_done; 576} 577 578static irqreturn_t ocelot_fdma_interrupt(int irq, void *dev_id) 579{ 580 u32 ident, llp, frm, err, err_code; 581 struct ocelot *ocelot = dev_id; 582 583 ident = ocelot_fdma_readl(ocelot, MSCC_FDMA_INTR_IDENT); 584 frm = ocelot_fdma_readl(ocelot, MSCC_FDMA_INTR_FRM); 585 llp = ocelot_fdma_readl(ocelot, MSCC_FDMA_INTR_LLP); 586 587 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_LLP, llp & ident); 588 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_FRM, frm & ident); 589 if (frm || llp) { 590 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_ENA, 0); 591 napi_schedule(&ocelot->fdma->napi); 592 } 593 594 err = ocelot_fdma_readl(ocelot, MSCC_FDMA_EVT_ERR); 595 if (unlikely(err)) { 596 err_code = ocelot_fdma_readl(ocelot, MSCC_FDMA_EVT_ERR_CODE); 597 dev_err_ratelimited(ocelot->dev, 598 "Error ! chans mask: %#x, code: %#x\n", 599 err, err_code); 600 601 ocelot_fdma_writel(ocelot, MSCC_FDMA_EVT_ERR, err); 602 ocelot_fdma_writel(ocelot, MSCC_FDMA_EVT_ERR_CODE, err_code); 603 } 604 605 return IRQ_HANDLED; 606} 607 608static void ocelot_fdma_send_skb(struct ocelot *ocelot, 609 struct ocelot_fdma *fdma, struct sk_buff *skb) 610{ 611 struct ocelot_fdma_tx_ring *tx_ring = &fdma->tx_ring; 612 struct ocelot_fdma_tx_buf *tx_buf; 613 struct ocelot_fdma_dcb *dcb; 614 dma_addr_t dma; 615 u16 next_idx; 616 617 dcb = &tx_ring->dcbs[tx_ring->next_to_use]; 618 tx_buf = &tx_ring->bufs[tx_ring->next_to_use]; 619 if (!ocelot_fdma_tx_dcb_set_skb(ocelot, tx_buf, dcb, skb)) { 620 dev_kfree_skb_any(skb); 621 return; 622 } 623 624 next_idx = ocelot_fdma_idx_next(tx_ring->next_to_use, 625 OCELOT_FDMA_TX_RING_SIZE); 626 skb_tx_timestamp(skb); 627 628 /* If the FDMA TX chan is empty, then enqueue the DCB directly */ 629 if (ocelot_fdma_tx_ring_empty(fdma)) { 630 dma = ocelot_fdma_idx_dma(tx_ring->dcbs_dma, 631 tx_ring->next_to_use); 632 ocelot_fdma_activate_chan(ocelot, dma, MSCC_FDMA_INJ_CHAN); 633 } else { 634 /* Chain the DCBs */ 635 dcb->llp = ocelot_fdma_idx_dma(tx_ring->dcbs_dma, next_idx); 636 } 637 638 tx_ring->next_to_use = next_idx; 639} 640 641static int ocelot_fdma_prepare_skb(struct ocelot *ocelot, int port, u32 rew_op, 642 struct sk_buff *skb, struct net_device *dev) 643{ 644 int needed_headroom = max_t(int, OCELOT_TAG_LEN - skb_headroom(skb), 0); 645 int needed_tailroom = max_t(int, ETH_FCS_LEN - skb_tailroom(skb), 0); 646 void *ifh; 647 int err; 648 649 if (unlikely(needed_headroom || needed_tailroom || 650 skb_header_cloned(skb))) { 651 err = pskb_expand_head(skb, needed_headroom, needed_tailroom, 652 GFP_ATOMIC); 653 if (unlikely(err)) { 654 dev_kfree_skb_any(skb); 655 return 1; 656 } 657 } 658 659 err = skb_linearize(skb); 660 if (err) { 661 net_err_ratelimited("%s: skb_linearize error (%d)!\n", 662 dev->name, err); 663 dev_kfree_skb_any(skb); 664 return 1; 665 } 666 667 ifh = skb_push(skb, OCELOT_TAG_LEN); 668 skb_put(skb, ETH_FCS_LEN); 669 memset(ifh, 0, OCELOT_TAG_LEN); 670 ocelot_ifh_port_set(ifh, port, rew_op, skb_vlan_tag_get(skb)); 671 672 return 0; 673} 674 675int ocelot_fdma_inject_frame(struct ocelot *ocelot, int port, u32 rew_op, 676 struct sk_buff *skb, struct net_device *dev) 677{ 678 struct ocelot_fdma *fdma = ocelot->fdma; 679 int ret = NETDEV_TX_OK; 680 681 spin_lock(&fdma->tx_ring.xmit_lock); 682 683 if (ocelot_fdma_tx_ring_free(fdma) == 0) { 684 netif_stop_queue(dev); 685 ret = NETDEV_TX_BUSY; 686 goto out; 687 } 688 689 if (ocelot_fdma_prepare_skb(ocelot, port, rew_op, skb, dev)) 690 goto out; 691 692 ocelot_fdma_send_skb(ocelot, fdma, skb); 693 694out: 695 spin_unlock(&fdma->tx_ring.xmit_lock); 696 697 return ret; 698} 699 700static void ocelot_fdma_free_rx_ring(struct ocelot *ocelot) 701{ 702 struct ocelot_fdma *fdma = ocelot->fdma; 703 struct ocelot_fdma_rx_ring *rx_ring; 704 struct ocelot_fdma_rx_buf *rxb; 705 u16 idx; 706 707 rx_ring = &fdma->rx_ring; 708 idx = rx_ring->next_to_clean; 709 710 /* Free the pages held in the RX ring */ 711 while (idx != rx_ring->next_to_use) { 712 rxb = &rx_ring->bufs[idx]; 713 dma_unmap_page(ocelot->dev, rxb->dma_addr, PAGE_SIZE, 714 DMA_FROM_DEVICE); 715 __free_page(rxb->page); 716 idx = ocelot_fdma_idx_next(idx, OCELOT_FDMA_RX_RING_SIZE); 717 } 718 719 if (fdma->rx_ring.skb) 720 dev_kfree_skb_any(fdma->rx_ring.skb); 721} 722 723static void ocelot_fdma_free_tx_ring(struct ocelot *ocelot) 724{ 725 struct ocelot_fdma *fdma = ocelot->fdma; 726 struct ocelot_fdma_tx_ring *tx_ring; 727 struct ocelot_fdma_tx_buf *txb; 728 struct sk_buff *skb; 729 u16 idx; 730 731 tx_ring = &fdma->tx_ring; 732 idx = tx_ring->next_to_clean; 733 734 while (idx != tx_ring->next_to_use) { 735 txb = &tx_ring->bufs[idx]; 736 skb = txb->skb; 737 dma_unmap_single(ocelot->dev, dma_unmap_addr(txb, dma_addr), 738 skb->len, DMA_TO_DEVICE); 739 dev_kfree_skb_any(skb); 740 idx = ocelot_fdma_idx_next(idx, OCELOT_FDMA_TX_RING_SIZE); 741 } 742} 743 744static int ocelot_fdma_rings_alloc(struct ocelot *ocelot) 745{ 746 struct ocelot_fdma *fdma = ocelot->fdma; 747 struct ocelot_fdma_dcb *dcbs; 748 unsigned int adjust; 749 dma_addr_t dcbs_dma; 750 int ret; 751 752 /* Create a pool of consistent memory blocks for hardware descriptors */ 753 fdma->dcbs_base = dmam_alloc_coherent(ocelot->dev, 754 OCELOT_DCBS_HW_ALLOC_SIZE, 755 &fdma->dcbs_dma_base, GFP_KERNEL); 756 if (!fdma->dcbs_base) 757 return -ENOMEM; 758 759 /* DCBs must be aligned on a 32bit boundary */ 760 dcbs = fdma->dcbs_base; 761 dcbs_dma = fdma->dcbs_dma_base; 762 if (!IS_ALIGNED(dcbs_dma, 4)) { 763 adjust = dcbs_dma & 0x3; 764 dcbs_dma = ALIGN(dcbs_dma, 4); 765 dcbs = (void *)dcbs + adjust; 766 } 767 768 /* TX queue */ 769 fdma->tx_ring.dcbs = dcbs; 770 fdma->tx_ring.dcbs_dma = dcbs_dma; 771 spin_lock_init(&fdma->tx_ring.xmit_lock); 772 773 /* RX queue */ 774 fdma->rx_ring.dcbs = dcbs + OCELOT_FDMA_TX_RING_SIZE; 775 fdma->rx_ring.dcbs_dma = dcbs_dma + OCELOT_FDMA_TX_DCB_SIZE; 776 ret = ocelot_fdma_alloc_rx_buffs(ocelot, 777 ocelot_fdma_tx_ring_free(fdma)); 778 if (ret) { 779 ocelot_fdma_free_rx_ring(ocelot); 780 return ret; 781 } 782 783 /* Set the last DCB LLP as NULL, this is normally done when restarting 784 * the RX chan, but this is for the first run 785 */ 786 ocelot_fdma_rx_set_llp(&fdma->rx_ring); 787 788 return 0; 789} 790 791void ocelot_fdma_netdev_init(struct ocelot *ocelot, struct net_device *dev) 792{ 793 struct ocelot_fdma *fdma = ocelot->fdma; 794 795 dev->needed_headroom = OCELOT_TAG_LEN; 796 dev->needed_tailroom = ETH_FCS_LEN; 797 798 if (fdma->ndev) 799 return; 800 801 fdma->ndev = dev; 802 netif_napi_add_weight(dev, &fdma->napi, ocelot_fdma_napi_poll, 803 OCELOT_FDMA_WEIGHT); 804} 805 806void ocelot_fdma_netdev_deinit(struct ocelot *ocelot, struct net_device *dev) 807{ 808 struct ocelot_fdma *fdma = ocelot->fdma; 809 810 if (fdma->ndev == dev) { 811 netif_napi_del(&fdma->napi); 812 fdma->ndev = NULL; 813 } 814} 815 816void ocelot_fdma_init(struct platform_device *pdev, struct ocelot *ocelot) 817{ 818 struct device *dev = ocelot->dev; 819 struct ocelot_fdma *fdma; 820 int ret; 821 822 fdma = devm_kzalloc(dev, sizeof(*fdma), GFP_KERNEL); 823 if (!fdma) 824 return; 825 826 ocelot->fdma = fdma; 827 ocelot->dev->coherent_dma_mask = DMA_BIT_MASK(32); 828 829 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_ENA, 0); 830 831 fdma->ocelot = ocelot; 832 fdma->irq = platform_get_irq_byname(pdev, "fdma"); 833 ret = devm_request_irq(dev, fdma->irq, ocelot_fdma_interrupt, 0, 834 dev_name(dev), ocelot); 835 if (ret) 836 goto err_free_fdma; 837 838 ret = ocelot_fdma_rings_alloc(ocelot); 839 if (ret) 840 goto err_free_irq; 841 842 static_branch_enable(&ocelot_fdma_enabled); 843 844 return; 845 846err_free_irq: 847 devm_free_irq(dev, fdma->irq, fdma); 848err_free_fdma: 849 devm_kfree(dev, fdma); 850 851 ocelot->fdma = NULL; 852} 853 854void ocelot_fdma_start(struct ocelot *ocelot) 855{ 856 struct ocelot_fdma *fdma = ocelot->fdma; 857 858 /* Reconfigure for extraction and injection using DMA */ 859 ocelot_write_rix(ocelot, QS_INJ_GRP_CFG_MODE(2), QS_INJ_GRP_CFG, 0); 860 ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(0), QS_INJ_CTRL, 0); 861 862 ocelot_write_rix(ocelot, QS_XTR_GRP_CFG_MODE(2), QS_XTR_GRP_CFG, 0); 863 864 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_LLP, 0xffffffff); 865 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_FRM, 0xffffffff); 866 867 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_LLP_ENA, 868 BIT(MSCC_FDMA_INJ_CHAN) | BIT(MSCC_FDMA_XTR_CHAN)); 869 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_FRM_ENA, 870 BIT(MSCC_FDMA_XTR_CHAN)); 871 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_ENA, 872 BIT(MSCC_FDMA_INJ_CHAN) | BIT(MSCC_FDMA_XTR_CHAN)); 873 874 napi_enable(&fdma->napi); 875 876 ocelot_fdma_activate_chan(ocelot, ocelot->fdma->rx_ring.dcbs_dma, 877 MSCC_FDMA_XTR_CHAN); 878} 879 880void ocelot_fdma_deinit(struct ocelot *ocelot) 881{ 882 struct ocelot_fdma *fdma = ocelot->fdma; 883 884 ocelot_fdma_writel(ocelot, MSCC_FDMA_INTR_ENA, 0); 885 ocelot_fdma_writel(ocelot, MSCC_FDMA_CH_FORCEDIS, 886 BIT(MSCC_FDMA_XTR_CHAN)); 887 ocelot_fdma_writel(ocelot, MSCC_FDMA_CH_FORCEDIS, 888 BIT(MSCC_FDMA_INJ_CHAN)); 889 napi_synchronize(&fdma->napi); 890 napi_disable(&fdma->napi); 891 892 ocelot_fdma_free_rx_ring(ocelot); 893 ocelot_fdma_free_tx_ring(ocelot); 894}