Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0+
   2
   3#include <linux/bpf.h>
   4#include <linux/filter.h>
   5#include <net/page_pool/helpers.h>
   6
   7#include "lan966x_main.h"
   8
   9static int lan966x_fdma_channel_active(struct lan966x *lan966x)
  10{
  11	return lan_rd(lan966x, FDMA_CH_ACTIVE);
  12}
  13
  14static struct page *lan966x_fdma_rx_alloc_page(struct lan966x_rx *rx,
  15					       struct lan966x_db *db)
  16{
  17	struct page *page;
  18
  19	page = page_pool_dev_alloc_pages(rx->page_pool);
  20	if (unlikely(!page))
  21		return NULL;
  22
  23	db->dataptr = page_pool_get_dma_addr(page) + XDP_PACKET_HEADROOM;
  24
  25	return page;
  26}
  27
  28static void lan966x_fdma_rx_free_pages(struct lan966x_rx *rx)
  29{
  30	int i, j;
  31
  32	for (i = 0; i < FDMA_DCB_MAX; ++i) {
  33		for (j = 0; j < FDMA_RX_DCB_MAX_DBS; ++j)
  34			page_pool_put_full_page(rx->page_pool,
  35						rx->page[i][j], false);
  36	}
  37}
  38
  39static void lan966x_fdma_rx_free_page(struct lan966x_rx *rx)
  40{
  41	struct page *page;
  42
  43	page = rx->page[rx->dcb_index][rx->db_index];
  44	if (unlikely(!page))
  45		return;
  46
  47	page_pool_recycle_direct(rx->page_pool, page);
  48}
  49
  50static void lan966x_fdma_rx_add_dcb(struct lan966x_rx *rx,
  51				    struct lan966x_rx_dcb *dcb,
  52				    u64 nextptr)
  53{
  54	struct lan966x_db *db;
  55	int i;
  56
  57	for (i = 0; i < FDMA_RX_DCB_MAX_DBS; ++i) {
  58		db = &dcb->db[i];
  59		db->status = FDMA_DCB_STATUS_INTR;
  60	}
  61
  62	dcb->nextptr = FDMA_DCB_INVALID_DATA;
  63	dcb->info = FDMA_DCB_INFO_DATAL(PAGE_SIZE << rx->page_order);
  64
  65	rx->last_entry->nextptr = nextptr;
  66	rx->last_entry = dcb;
  67}
  68
  69static int lan966x_fdma_rx_alloc_page_pool(struct lan966x_rx *rx)
  70{
  71	struct lan966x *lan966x = rx->lan966x;
  72	struct page_pool_params pp_params = {
  73		.order = rx->page_order,
  74		.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV,
  75		.pool_size = FDMA_DCB_MAX,
  76		.nid = NUMA_NO_NODE,
  77		.dev = lan966x->dev,
  78		.dma_dir = DMA_FROM_DEVICE,
  79		.offset = XDP_PACKET_HEADROOM,
  80		.max_len = rx->max_mtu -
  81			   SKB_DATA_ALIGN(sizeof(struct skb_shared_info)),
  82	};
  83
  84	if (lan966x_xdp_present(lan966x))
  85		pp_params.dma_dir = DMA_BIDIRECTIONAL;
  86
  87	rx->page_pool = page_pool_create(&pp_params);
  88
  89	for (int i = 0; i < lan966x->num_phys_ports; ++i) {
  90		struct lan966x_port *port;
  91
  92		if (!lan966x->ports[i])
  93			continue;
  94
  95		port = lan966x->ports[i];
  96		xdp_rxq_info_unreg_mem_model(&port->xdp_rxq);
  97		xdp_rxq_info_reg_mem_model(&port->xdp_rxq, MEM_TYPE_PAGE_POOL,
  98					   rx->page_pool);
  99	}
 100
 101	return PTR_ERR_OR_ZERO(rx->page_pool);
 102}
 103
 104static int lan966x_fdma_rx_alloc(struct lan966x_rx *rx)
 105{
 106	struct lan966x *lan966x = rx->lan966x;
 107	struct lan966x_rx_dcb *dcb;
 108	struct lan966x_db *db;
 109	struct page *page;
 110	int i, j;
 111	int size;
 112
 113	if (lan966x_fdma_rx_alloc_page_pool(rx))
 114		return PTR_ERR(rx->page_pool);
 115
 116	/* calculate how many pages are needed to allocate the dcbs */
 117	size = sizeof(struct lan966x_rx_dcb) * FDMA_DCB_MAX;
 118	size = ALIGN(size, PAGE_SIZE);
 119
 120	rx->dcbs = dma_alloc_coherent(lan966x->dev, size, &rx->dma, GFP_KERNEL);
 121	if (!rx->dcbs)
 122		return -ENOMEM;
 123
 124	rx->last_entry = rx->dcbs;
 125	rx->db_index = 0;
 126	rx->dcb_index = 0;
 127
 128	/* Now for each dcb allocate the dbs */
 129	for (i = 0; i < FDMA_DCB_MAX; ++i) {
 130		dcb = &rx->dcbs[i];
 131		dcb->info = 0;
 132
 133		/* For each db allocate a page and map it to the DB dataptr. */
 134		for (j = 0; j < FDMA_RX_DCB_MAX_DBS; ++j) {
 135			db = &dcb->db[j];
 136			page = lan966x_fdma_rx_alloc_page(rx, db);
 137			if (!page)
 138				return -ENOMEM;
 139
 140			db->status = 0;
 141			rx->page[i][j] = page;
 142		}
 143
 144		lan966x_fdma_rx_add_dcb(rx, dcb, rx->dma + sizeof(*dcb) * i);
 145	}
 146
 147	return 0;
 148}
 149
 150static void lan966x_fdma_rx_advance_dcb(struct lan966x_rx *rx)
 151{
 152	rx->dcb_index++;
 153	rx->dcb_index &= FDMA_DCB_MAX - 1;
 154}
 155
 156static void lan966x_fdma_rx_free(struct lan966x_rx *rx)
 157{
 158	struct lan966x *lan966x = rx->lan966x;
 159	u32 size;
 160
 161	/* Now it is possible to do the cleanup of dcb */
 162	size = sizeof(struct lan966x_tx_dcb) * FDMA_DCB_MAX;
 163	size = ALIGN(size, PAGE_SIZE);
 164	dma_free_coherent(lan966x->dev, size, rx->dcbs, rx->dma);
 165}
 166
 167static void lan966x_fdma_rx_start(struct lan966x_rx *rx)
 168{
 169	struct lan966x *lan966x = rx->lan966x;
 170	u32 mask;
 171
 172	/* When activating a channel, first is required to write the first DCB
 173	 * address and then to activate it
 174	 */
 175	lan_wr(lower_32_bits((u64)rx->dma), lan966x,
 176	       FDMA_DCB_LLP(rx->channel_id));
 177	lan_wr(upper_32_bits((u64)rx->dma), lan966x,
 178	       FDMA_DCB_LLP1(rx->channel_id));
 179
 180	lan_wr(FDMA_CH_CFG_CH_DCB_DB_CNT_SET(FDMA_RX_DCB_MAX_DBS) |
 181	       FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY_SET(1) |
 182	       FDMA_CH_CFG_CH_INJ_PORT_SET(0) |
 183	       FDMA_CH_CFG_CH_MEM_SET(1),
 184	       lan966x, FDMA_CH_CFG(rx->channel_id));
 185
 186	/* Start fdma */
 187	lan_rmw(FDMA_PORT_CTRL_XTR_STOP_SET(0),
 188		FDMA_PORT_CTRL_XTR_STOP,
 189		lan966x, FDMA_PORT_CTRL(0));
 190
 191	/* Enable interrupts */
 192	mask = lan_rd(lan966x, FDMA_INTR_DB_ENA);
 193	mask = FDMA_INTR_DB_ENA_INTR_DB_ENA_GET(mask);
 194	mask |= BIT(rx->channel_id);
 195	lan_rmw(FDMA_INTR_DB_ENA_INTR_DB_ENA_SET(mask),
 196		FDMA_INTR_DB_ENA_INTR_DB_ENA,
 197		lan966x, FDMA_INTR_DB_ENA);
 198
 199	/* Activate the channel */
 200	lan_rmw(FDMA_CH_ACTIVATE_CH_ACTIVATE_SET(BIT(rx->channel_id)),
 201		FDMA_CH_ACTIVATE_CH_ACTIVATE,
 202		lan966x, FDMA_CH_ACTIVATE);
 203}
 204
 205static void lan966x_fdma_rx_disable(struct lan966x_rx *rx)
 206{
 207	struct lan966x *lan966x = rx->lan966x;
 208	u32 val;
 209
 210	/* Disable the channel */
 211	lan_rmw(FDMA_CH_DISABLE_CH_DISABLE_SET(BIT(rx->channel_id)),
 212		FDMA_CH_DISABLE_CH_DISABLE,
 213		lan966x, FDMA_CH_DISABLE);
 214
 215	readx_poll_timeout_atomic(lan966x_fdma_channel_active, lan966x,
 216				  val, !(val & BIT(rx->channel_id)),
 217				  READL_SLEEP_US, READL_TIMEOUT_US);
 218
 219	lan_rmw(FDMA_CH_DB_DISCARD_DB_DISCARD_SET(BIT(rx->channel_id)),
 220		FDMA_CH_DB_DISCARD_DB_DISCARD,
 221		lan966x, FDMA_CH_DB_DISCARD);
 222}
 223
 224static void lan966x_fdma_rx_reload(struct lan966x_rx *rx)
 225{
 226	struct lan966x *lan966x = rx->lan966x;
 227
 228	lan_rmw(FDMA_CH_RELOAD_CH_RELOAD_SET(BIT(rx->channel_id)),
 229		FDMA_CH_RELOAD_CH_RELOAD,
 230		lan966x, FDMA_CH_RELOAD);
 231}
 232
 233static void lan966x_fdma_tx_add_dcb(struct lan966x_tx *tx,
 234				    struct lan966x_tx_dcb *dcb)
 235{
 236	dcb->nextptr = FDMA_DCB_INVALID_DATA;
 237	dcb->info = 0;
 238}
 239
 240static int lan966x_fdma_tx_alloc(struct lan966x_tx *tx)
 241{
 242	struct lan966x *lan966x = tx->lan966x;
 243	struct lan966x_tx_dcb *dcb;
 244	struct lan966x_db *db;
 245	int size;
 246	int i, j;
 247
 248	tx->dcbs_buf = kcalloc(FDMA_DCB_MAX, sizeof(struct lan966x_tx_dcb_buf),
 249			       GFP_KERNEL);
 250	if (!tx->dcbs_buf)
 251		return -ENOMEM;
 252
 253	/* calculate how many pages are needed to allocate the dcbs */
 254	size = sizeof(struct lan966x_tx_dcb) * FDMA_DCB_MAX;
 255	size = ALIGN(size, PAGE_SIZE);
 256	tx->dcbs = dma_alloc_coherent(lan966x->dev, size, &tx->dma, GFP_KERNEL);
 257	if (!tx->dcbs)
 258		goto out;
 259
 260	/* Now for each dcb allocate the db */
 261	for (i = 0; i < FDMA_DCB_MAX; ++i) {
 262		dcb = &tx->dcbs[i];
 263
 264		for (j = 0; j < FDMA_TX_DCB_MAX_DBS; ++j) {
 265			db = &dcb->db[j];
 266			db->dataptr = 0;
 267			db->status = 0;
 268		}
 269
 270		lan966x_fdma_tx_add_dcb(tx, dcb);
 271	}
 272
 273	return 0;
 274
 275out:
 276	kfree(tx->dcbs_buf);
 277	return -ENOMEM;
 278}
 279
 280static void lan966x_fdma_tx_free(struct lan966x_tx *tx)
 281{
 282	struct lan966x *lan966x = tx->lan966x;
 283	int size;
 284
 285	kfree(tx->dcbs_buf);
 286
 287	size = sizeof(struct lan966x_tx_dcb) * FDMA_DCB_MAX;
 288	size = ALIGN(size, PAGE_SIZE);
 289	dma_free_coherent(lan966x->dev, size, tx->dcbs, tx->dma);
 290}
 291
 292static void lan966x_fdma_tx_activate(struct lan966x_tx *tx)
 293{
 294	struct lan966x *lan966x = tx->lan966x;
 295	u32 mask;
 296
 297	/* When activating a channel, first is required to write the first DCB
 298	 * address and then to activate it
 299	 */
 300	lan_wr(lower_32_bits((u64)tx->dma), lan966x,
 301	       FDMA_DCB_LLP(tx->channel_id));
 302	lan_wr(upper_32_bits((u64)tx->dma), lan966x,
 303	       FDMA_DCB_LLP1(tx->channel_id));
 304
 305	lan_wr(FDMA_CH_CFG_CH_DCB_DB_CNT_SET(FDMA_TX_DCB_MAX_DBS) |
 306	       FDMA_CH_CFG_CH_INTR_DB_EOF_ONLY_SET(1) |
 307	       FDMA_CH_CFG_CH_INJ_PORT_SET(0) |
 308	       FDMA_CH_CFG_CH_MEM_SET(1),
 309	       lan966x, FDMA_CH_CFG(tx->channel_id));
 310
 311	/* Start fdma */
 312	lan_rmw(FDMA_PORT_CTRL_INJ_STOP_SET(0),
 313		FDMA_PORT_CTRL_INJ_STOP,
 314		lan966x, FDMA_PORT_CTRL(0));
 315
 316	/* Enable interrupts */
 317	mask = lan_rd(lan966x, FDMA_INTR_DB_ENA);
 318	mask = FDMA_INTR_DB_ENA_INTR_DB_ENA_GET(mask);
 319	mask |= BIT(tx->channel_id);
 320	lan_rmw(FDMA_INTR_DB_ENA_INTR_DB_ENA_SET(mask),
 321		FDMA_INTR_DB_ENA_INTR_DB_ENA,
 322		lan966x, FDMA_INTR_DB_ENA);
 323
 324	/* Activate the channel */
 325	lan_rmw(FDMA_CH_ACTIVATE_CH_ACTIVATE_SET(BIT(tx->channel_id)),
 326		FDMA_CH_ACTIVATE_CH_ACTIVATE,
 327		lan966x, FDMA_CH_ACTIVATE);
 328}
 329
 330static void lan966x_fdma_tx_disable(struct lan966x_tx *tx)
 331{
 332	struct lan966x *lan966x = tx->lan966x;
 333	u32 val;
 334
 335	/* Disable the channel */
 336	lan_rmw(FDMA_CH_DISABLE_CH_DISABLE_SET(BIT(tx->channel_id)),
 337		FDMA_CH_DISABLE_CH_DISABLE,
 338		lan966x, FDMA_CH_DISABLE);
 339
 340	readx_poll_timeout_atomic(lan966x_fdma_channel_active, lan966x,
 341				  val, !(val & BIT(tx->channel_id)),
 342				  READL_SLEEP_US, READL_TIMEOUT_US);
 343
 344	lan_rmw(FDMA_CH_DB_DISCARD_DB_DISCARD_SET(BIT(tx->channel_id)),
 345		FDMA_CH_DB_DISCARD_DB_DISCARD,
 346		lan966x, FDMA_CH_DB_DISCARD);
 347
 348	tx->activated = false;
 349	tx->last_in_use = -1;
 350}
 351
 352static void lan966x_fdma_tx_reload(struct lan966x_tx *tx)
 353{
 354	struct lan966x *lan966x = tx->lan966x;
 355
 356	/* Write the registers to reload the channel */
 357	lan_rmw(FDMA_CH_RELOAD_CH_RELOAD_SET(BIT(tx->channel_id)),
 358		FDMA_CH_RELOAD_CH_RELOAD,
 359		lan966x, FDMA_CH_RELOAD);
 360}
 361
 362static void lan966x_fdma_wakeup_netdev(struct lan966x *lan966x)
 363{
 364	struct lan966x_port *port;
 365	int i;
 366
 367	for (i = 0; i < lan966x->num_phys_ports; ++i) {
 368		port = lan966x->ports[i];
 369		if (!port)
 370			continue;
 371
 372		if (netif_queue_stopped(port->dev))
 373			netif_wake_queue(port->dev);
 374	}
 375}
 376
 377static void lan966x_fdma_stop_netdev(struct lan966x *lan966x)
 378{
 379	struct lan966x_port *port;
 380	int i;
 381
 382	for (i = 0; i < lan966x->num_phys_ports; ++i) {
 383		port = lan966x->ports[i];
 384		if (!port)
 385			continue;
 386
 387		netif_stop_queue(port->dev);
 388	}
 389}
 390
 391static void lan966x_fdma_tx_clear_buf(struct lan966x *lan966x, int weight)
 392{
 393	struct lan966x_tx *tx = &lan966x->tx;
 394	struct lan966x_rx *rx = &lan966x->rx;
 395	struct lan966x_tx_dcb_buf *dcb_buf;
 396	struct xdp_frame_bulk bq;
 397	struct lan966x_db *db;
 398	unsigned long flags;
 399	bool clear = false;
 400	int i;
 401
 402	xdp_frame_bulk_init(&bq);
 403
 404	spin_lock_irqsave(&lan966x->tx_lock, flags);
 405	for (i = 0; i < FDMA_DCB_MAX; ++i) {
 406		dcb_buf = &tx->dcbs_buf[i];
 407
 408		if (!dcb_buf->used)
 409			continue;
 410
 411		db = &tx->dcbs[i].db[0];
 412		if (!(db->status & FDMA_DCB_STATUS_DONE))
 413			continue;
 414
 415		dcb_buf->dev->stats.tx_packets++;
 416		dcb_buf->dev->stats.tx_bytes += dcb_buf->len;
 417
 418		dcb_buf->used = false;
 419		if (dcb_buf->use_skb) {
 420			dma_unmap_single(lan966x->dev,
 421					 dcb_buf->dma_addr,
 422					 dcb_buf->len,
 423					 DMA_TO_DEVICE);
 424
 425			if (!dcb_buf->ptp)
 426				napi_consume_skb(dcb_buf->data.skb, weight);
 427		} else {
 428			if (dcb_buf->xdp_ndo)
 429				dma_unmap_single(lan966x->dev,
 430						 dcb_buf->dma_addr,
 431						 dcb_buf->len,
 432						 DMA_TO_DEVICE);
 433
 434			if (dcb_buf->xdp_ndo)
 435				xdp_return_frame_bulk(dcb_buf->data.xdpf, &bq);
 436			else
 437				page_pool_recycle_direct(rx->page_pool,
 438							 dcb_buf->data.page);
 439		}
 440
 441		clear = true;
 442	}
 443
 444	xdp_flush_frame_bulk(&bq);
 445
 446	if (clear)
 447		lan966x_fdma_wakeup_netdev(lan966x);
 448
 449	spin_unlock_irqrestore(&lan966x->tx_lock, flags);
 450}
 451
 452static bool lan966x_fdma_rx_more_frames(struct lan966x_rx *rx)
 453{
 454	struct lan966x_db *db;
 455
 456	/* Check if there is any data */
 457	db = &rx->dcbs[rx->dcb_index].db[rx->db_index];
 458	if (unlikely(!(db->status & FDMA_DCB_STATUS_DONE)))
 459		return false;
 460
 461	return true;
 462}
 463
 464static int lan966x_fdma_rx_check_frame(struct lan966x_rx *rx, u64 *src_port)
 465{
 466	struct lan966x *lan966x = rx->lan966x;
 467	struct lan966x_port *port;
 468	struct lan966x_db *db;
 469	struct page *page;
 470
 471	db = &rx->dcbs[rx->dcb_index].db[rx->db_index];
 472	page = rx->page[rx->dcb_index][rx->db_index];
 473	if (unlikely(!page))
 474		return FDMA_ERROR;
 475
 476	dma_sync_single_for_cpu(lan966x->dev,
 477				(dma_addr_t)db->dataptr + XDP_PACKET_HEADROOM,
 478				FDMA_DCB_STATUS_BLOCKL(db->status),
 479				DMA_FROM_DEVICE);
 480
 481	lan966x_ifh_get_src_port(page_address(page) + XDP_PACKET_HEADROOM,
 482				 src_port);
 483	if (WARN_ON(*src_port >= lan966x->num_phys_ports))
 484		return FDMA_ERROR;
 485
 486	port = lan966x->ports[*src_port];
 487	if (!lan966x_xdp_port_present(port))
 488		return FDMA_PASS;
 489
 490	return lan966x_xdp_run(port, page, FDMA_DCB_STATUS_BLOCKL(db->status));
 491}
 492
 493static struct sk_buff *lan966x_fdma_rx_get_frame(struct lan966x_rx *rx,
 494						 u64 src_port)
 495{
 496	struct lan966x *lan966x = rx->lan966x;
 497	struct lan966x_db *db;
 498	struct sk_buff *skb;
 499	struct page *page;
 500	u64 timestamp;
 501
 502	/* Get the received frame and unmap it */
 503	db = &rx->dcbs[rx->dcb_index].db[rx->db_index];
 504	page = rx->page[rx->dcb_index][rx->db_index];
 505
 506	skb = build_skb(page_address(page), PAGE_SIZE << rx->page_order);
 507	if (unlikely(!skb))
 508		goto free_page;
 509
 510	skb_mark_for_recycle(skb);
 511
 512	skb_reserve(skb, XDP_PACKET_HEADROOM);
 513	skb_put(skb, FDMA_DCB_STATUS_BLOCKL(db->status));
 514
 515	lan966x_ifh_get_timestamp(skb->data, &timestamp);
 516
 517	skb->dev = lan966x->ports[src_port]->dev;
 518	skb_pull(skb, IFH_LEN_BYTES);
 519
 520	if (likely(!(skb->dev->features & NETIF_F_RXFCS)))
 521		skb_trim(skb, skb->len - ETH_FCS_LEN);
 522
 523	lan966x_ptp_rxtstamp(lan966x, skb, src_port, timestamp);
 524	skb->protocol = eth_type_trans(skb, skb->dev);
 525
 526	if (lan966x->bridge_mask & BIT(src_port)) {
 527		skb->offload_fwd_mark = 1;
 528
 529		skb_reset_network_header(skb);
 530		if (!lan966x_hw_offload(lan966x, src_port, skb))
 531			skb->offload_fwd_mark = 0;
 532	}
 533
 534	skb->dev->stats.rx_bytes += skb->len;
 535	skb->dev->stats.rx_packets++;
 536
 537	return skb;
 538
 539free_page:
 540	page_pool_recycle_direct(rx->page_pool, page);
 541
 542	return NULL;
 543}
 544
 545static int lan966x_fdma_napi_poll(struct napi_struct *napi, int weight)
 546{
 547	struct lan966x *lan966x = container_of(napi, struct lan966x, napi);
 548	struct lan966x_rx *rx = &lan966x->rx;
 549	int dcb_reload = rx->dcb_index;
 550	struct lan966x_rx_dcb *old_dcb;
 551	struct lan966x_db *db;
 552	bool redirect = false;
 553	struct sk_buff *skb;
 554	struct page *page;
 555	int counter = 0;
 556	u64 src_port;
 557	u64 nextptr;
 558
 559	lan966x_fdma_tx_clear_buf(lan966x, weight);
 560
 561	/* Get all received skb */
 562	while (counter < weight) {
 563		if (!lan966x_fdma_rx_more_frames(rx))
 564			break;
 565
 566		counter++;
 567
 568		switch (lan966x_fdma_rx_check_frame(rx, &src_port)) {
 569		case FDMA_PASS:
 570			break;
 571		case FDMA_ERROR:
 572			lan966x_fdma_rx_free_page(rx);
 573			lan966x_fdma_rx_advance_dcb(rx);
 574			goto allocate_new;
 575		case FDMA_REDIRECT:
 576			redirect = true;
 577			fallthrough;
 578		case FDMA_TX:
 579			lan966x_fdma_rx_advance_dcb(rx);
 580			continue;
 581		case FDMA_DROP:
 582			lan966x_fdma_rx_free_page(rx);
 583			lan966x_fdma_rx_advance_dcb(rx);
 584			continue;
 585		}
 586
 587		skb = lan966x_fdma_rx_get_frame(rx, src_port);
 588		lan966x_fdma_rx_advance_dcb(rx);
 589		if (!skb)
 590			goto allocate_new;
 591
 592		napi_gro_receive(&lan966x->napi, skb);
 593	}
 594
 595allocate_new:
 596	/* Allocate new pages and map them */
 597	while (dcb_reload != rx->dcb_index) {
 598		db = &rx->dcbs[dcb_reload].db[rx->db_index];
 599		page = lan966x_fdma_rx_alloc_page(rx, db);
 600		if (unlikely(!page))
 601			break;
 602		rx->page[dcb_reload][rx->db_index] = page;
 603
 604		old_dcb = &rx->dcbs[dcb_reload];
 605		dcb_reload++;
 606		dcb_reload &= FDMA_DCB_MAX - 1;
 607
 608		nextptr = rx->dma + ((unsigned long)old_dcb -
 609				     (unsigned long)rx->dcbs);
 610		lan966x_fdma_rx_add_dcb(rx, old_dcb, nextptr);
 611		lan966x_fdma_rx_reload(rx);
 612	}
 613
 614	if (redirect)
 615		xdp_do_flush();
 616
 617	if (counter < weight && napi_complete_done(napi, counter))
 618		lan_wr(0xff, lan966x, FDMA_INTR_DB_ENA);
 619
 620	return counter;
 621}
 622
 623irqreturn_t lan966x_fdma_irq_handler(int irq, void *args)
 624{
 625	struct lan966x *lan966x = args;
 626	u32 db, err, err_type;
 627
 628	db = lan_rd(lan966x, FDMA_INTR_DB);
 629	err = lan_rd(lan966x, FDMA_INTR_ERR);
 630
 631	if (db) {
 632		lan_wr(0, lan966x, FDMA_INTR_DB_ENA);
 633		lan_wr(db, lan966x, FDMA_INTR_DB);
 634
 635		napi_schedule(&lan966x->napi);
 636	}
 637
 638	if (err) {
 639		err_type = lan_rd(lan966x, FDMA_ERRORS);
 640
 641		WARN(1, "Unexpected error: %d, error_type: %d\n", err, err_type);
 642
 643		lan_wr(err, lan966x, FDMA_INTR_ERR);
 644		lan_wr(err_type, lan966x, FDMA_ERRORS);
 645	}
 646
 647	return IRQ_HANDLED;
 648}
 649
 650static int lan966x_fdma_get_next_dcb(struct lan966x_tx *tx)
 651{
 652	struct lan966x_tx_dcb_buf *dcb_buf;
 653	int i;
 654
 655	for (i = 0; i < FDMA_DCB_MAX; ++i) {
 656		dcb_buf = &tx->dcbs_buf[i];
 657		if (!dcb_buf->used && i != tx->last_in_use)
 658			return i;
 659	}
 660
 661	return -1;
 662}
 663
 664static void lan966x_fdma_tx_setup_dcb(struct lan966x_tx *tx,
 665				      int next_to_use, int len,
 666				      dma_addr_t dma_addr)
 667{
 668	struct lan966x_tx_dcb *next_dcb;
 669	struct lan966x_db *next_db;
 670
 671	next_dcb = &tx->dcbs[next_to_use];
 672	next_dcb->nextptr = FDMA_DCB_INVALID_DATA;
 673
 674	next_db = &next_dcb->db[0];
 675	next_db->dataptr = dma_addr;
 676	next_db->status = FDMA_DCB_STATUS_SOF |
 677			  FDMA_DCB_STATUS_EOF |
 678			  FDMA_DCB_STATUS_INTR |
 679			  FDMA_DCB_STATUS_BLOCKO(0) |
 680			  FDMA_DCB_STATUS_BLOCKL(len);
 681}
 682
 683static void lan966x_fdma_tx_start(struct lan966x_tx *tx, int next_to_use)
 684{
 685	struct lan966x *lan966x = tx->lan966x;
 686	struct lan966x_tx_dcb *dcb;
 687
 688	if (likely(lan966x->tx.activated)) {
 689		/* Connect current dcb to the next db */
 690		dcb = &tx->dcbs[tx->last_in_use];
 691		dcb->nextptr = tx->dma + (next_to_use *
 692					  sizeof(struct lan966x_tx_dcb));
 693
 694		lan966x_fdma_tx_reload(tx);
 695	} else {
 696		/* Because it is first time, then just activate */
 697		lan966x->tx.activated = true;
 698		lan966x_fdma_tx_activate(tx);
 699	}
 700
 701	/* Move to next dcb because this last in use */
 702	tx->last_in_use = next_to_use;
 703}
 704
 705int lan966x_fdma_xmit_xdpf(struct lan966x_port *port, void *ptr, u32 len)
 706{
 707	struct lan966x *lan966x = port->lan966x;
 708	struct lan966x_tx_dcb_buf *next_dcb_buf;
 709	struct lan966x_tx *tx = &lan966x->tx;
 710	struct xdp_frame *xdpf;
 711	dma_addr_t dma_addr;
 712	struct page *page;
 713	int next_to_use;
 714	__be32 *ifh;
 715	int ret = 0;
 716
 717	spin_lock(&lan966x->tx_lock);
 718
 719	/* Get next index */
 720	next_to_use = lan966x_fdma_get_next_dcb(tx);
 721	if (next_to_use < 0) {
 722		netif_stop_queue(port->dev);
 723		ret = NETDEV_TX_BUSY;
 724		goto out;
 725	}
 726
 727	/* Get the next buffer */
 728	next_dcb_buf = &tx->dcbs_buf[next_to_use];
 729
 730	/* Generate new IFH */
 731	if (!len) {
 732		xdpf = ptr;
 733
 734		if (xdpf->headroom < IFH_LEN_BYTES) {
 735			ret = NETDEV_TX_OK;
 736			goto out;
 737		}
 738
 739		ifh = xdpf->data - IFH_LEN_BYTES;
 740		memset(ifh, 0x0, sizeof(__be32) * IFH_LEN);
 741		lan966x_ifh_set_bypass(ifh, 1);
 742		lan966x_ifh_set_port(ifh, BIT_ULL(port->chip_port));
 743
 744		dma_addr = dma_map_single(lan966x->dev,
 745					  xdpf->data - IFH_LEN_BYTES,
 746					  xdpf->len + IFH_LEN_BYTES,
 747					  DMA_TO_DEVICE);
 748		if (dma_mapping_error(lan966x->dev, dma_addr)) {
 749			ret = NETDEV_TX_OK;
 750			goto out;
 751		}
 752
 753		next_dcb_buf->data.xdpf = xdpf;
 754		next_dcb_buf->len = xdpf->len + IFH_LEN_BYTES;
 755
 756		/* Setup next dcb */
 757		lan966x_fdma_tx_setup_dcb(tx, next_to_use,
 758					  xdpf->len + IFH_LEN_BYTES,
 759					  dma_addr);
 760	} else {
 761		page = ptr;
 762
 763		ifh = page_address(page) + XDP_PACKET_HEADROOM;
 764		memset(ifh, 0x0, sizeof(__be32) * IFH_LEN);
 765		lan966x_ifh_set_bypass(ifh, 1);
 766		lan966x_ifh_set_port(ifh, BIT_ULL(port->chip_port));
 767
 768		dma_addr = page_pool_get_dma_addr(page);
 769		dma_sync_single_for_device(lan966x->dev,
 770					   dma_addr + XDP_PACKET_HEADROOM,
 771					   len + IFH_LEN_BYTES,
 772					   DMA_TO_DEVICE);
 773
 774		next_dcb_buf->data.page = page;
 775		next_dcb_buf->len = len + IFH_LEN_BYTES;
 776
 777		/* Setup next dcb */
 778		lan966x_fdma_tx_setup_dcb(tx, next_to_use,
 779					  len + IFH_LEN_BYTES,
 780					  dma_addr + XDP_PACKET_HEADROOM);
 781	}
 782
 783	/* Fill up the buffer */
 784	next_dcb_buf->use_skb = false;
 785	next_dcb_buf->xdp_ndo = !len;
 786	next_dcb_buf->dma_addr = dma_addr;
 787	next_dcb_buf->used = true;
 788	next_dcb_buf->ptp = false;
 789	next_dcb_buf->dev = port->dev;
 790
 791	/* Start the transmission */
 792	lan966x_fdma_tx_start(tx, next_to_use);
 793
 794out:
 795	spin_unlock(&lan966x->tx_lock);
 796
 797	return ret;
 798}
 799
 800int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev)
 801{
 802	struct lan966x_port *port = netdev_priv(dev);
 803	struct lan966x *lan966x = port->lan966x;
 804	struct lan966x_tx_dcb_buf *next_dcb_buf;
 805	struct lan966x_tx *tx = &lan966x->tx;
 806	int needed_headroom;
 807	int needed_tailroom;
 808	dma_addr_t dma_addr;
 809	int next_to_use;
 810	int err;
 811
 812	/* Get next index */
 813	next_to_use = lan966x_fdma_get_next_dcb(tx);
 814	if (next_to_use < 0) {
 815		netif_stop_queue(dev);
 816		return NETDEV_TX_BUSY;
 817	}
 818
 819	if (skb_put_padto(skb, ETH_ZLEN)) {
 820		dev->stats.tx_dropped++;
 821		return NETDEV_TX_OK;
 822	}
 823
 824	/* skb processing */
 825	needed_headroom = max_t(int, IFH_LEN_BYTES - skb_headroom(skb), 0);
 826	needed_tailroom = max_t(int, ETH_FCS_LEN - skb_tailroom(skb), 0);
 827	if (needed_headroom || needed_tailroom || skb_header_cloned(skb)) {
 828		err = pskb_expand_head(skb, needed_headroom, needed_tailroom,
 829				       GFP_ATOMIC);
 830		if (unlikely(err)) {
 831			dev->stats.tx_dropped++;
 832			err = NETDEV_TX_OK;
 833			goto release;
 834		}
 835	}
 836
 837	skb_tx_timestamp(skb);
 838	skb_push(skb, IFH_LEN_BYTES);
 839	memcpy(skb->data, ifh, IFH_LEN_BYTES);
 840	skb_put(skb, 4);
 841
 842	dma_addr = dma_map_single(lan966x->dev, skb->data, skb->len,
 843				  DMA_TO_DEVICE);
 844	if (dma_mapping_error(lan966x->dev, dma_addr)) {
 845		dev->stats.tx_dropped++;
 846		err = NETDEV_TX_OK;
 847		goto release;
 848	}
 849
 850	/* Setup next dcb */
 851	lan966x_fdma_tx_setup_dcb(tx, next_to_use, skb->len, dma_addr);
 852
 853	/* Fill up the buffer */
 854	next_dcb_buf = &tx->dcbs_buf[next_to_use];
 855	next_dcb_buf->use_skb = true;
 856	next_dcb_buf->data.skb = skb;
 857	next_dcb_buf->xdp_ndo = false;
 858	next_dcb_buf->len = skb->len;
 859	next_dcb_buf->dma_addr = dma_addr;
 860	next_dcb_buf->used = true;
 861	next_dcb_buf->ptp = false;
 862	next_dcb_buf->dev = dev;
 863
 864	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
 865	    LAN966X_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
 866		next_dcb_buf->ptp = true;
 867
 868	/* Start the transmission */
 869	lan966x_fdma_tx_start(tx, next_to_use);
 870
 871	return NETDEV_TX_OK;
 872
 873release:
 874	if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
 875	    LAN966X_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
 876		lan966x_ptp_txtstamp_release(port, skb);
 877
 878	dev_kfree_skb_any(skb);
 879	return err;
 880}
 881
 882static int lan966x_fdma_get_max_mtu(struct lan966x *lan966x)
 883{
 884	int max_mtu = 0;
 885	int i;
 886
 887	for (i = 0; i < lan966x->num_phys_ports; ++i) {
 888		struct lan966x_port *port;
 889		int mtu;
 890
 891		port = lan966x->ports[i];
 892		if (!port)
 893			continue;
 894
 895		mtu = lan_rd(lan966x, DEV_MAC_MAXLEN_CFG(port->chip_port));
 896		if (mtu > max_mtu)
 897			max_mtu = mtu;
 898	}
 899
 900	return max_mtu;
 901}
 902
 903static int lan966x_qsys_sw_status(struct lan966x *lan966x)
 904{
 905	return lan_rd(lan966x, QSYS_SW_STATUS(CPU_PORT));
 906}
 907
 908static int lan966x_fdma_reload(struct lan966x *lan966x, int new_mtu)
 909{
 910	struct page_pool *page_pool;
 911	dma_addr_t rx_dma;
 912	void *rx_dcbs;
 913	u32 size;
 914	int err;
 915
 916	/* Store these for later to free them */
 917	rx_dma = lan966x->rx.dma;
 918	rx_dcbs = lan966x->rx.dcbs;
 919	page_pool = lan966x->rx.page_pool;
 920
 921	napi_synchronize(&lan966x->napi);
 922	napi_disable(&lan966x->napi);
 923	lan966x_fdma_stop_netdev(lan966x);
 924
 925	lan966x_fdma_rx_disable(&lan966x->rx);
 926	lan966x_fdma_rx_free_pages(&lan966x->rx);
 927	lan966x->rx.page_order = round_up(new_mtu, PAGE_SIZE) / PAGE_SIZE - 1;
 928	lan966x->rx.max_mtu = new_mtu;
 929	err = lan966x_fdma_rx_alloc(&lan966x->rx);
 930	if (err)
 931		goto restore;
 932	lan966x_fdma_rx_start(&lan966x->rx);
 933
 934	size = sizeof(struct lan966x_rx_dcb) * FDMA_DCB_MAX;
 935	size = ALIGN(size, PAGE_SIZE);
 936	dma_free_coherent(lan966x->dev, size, rx_dcbs, rx_dma);
 937
 938	page_pool_destroy(page_pool);
 939
 940	lan966x_fdma_wakeup_netdev(lan966x);
 941	napi_enable(&lan966x->napi);
 942
 943	return err;
 944restore:
 945	lan966x->rx.page_pool = page_pool;
 946	lan966x->rx.dma = rx_dma;
 947	lan966x->rx.dcbs = rx_dcbs;
 948	lan966x_fdma_rx_start(&lan966x->rx);
 949
 950	return err;
 951}
 952
 953static int lan966x_fdma_get_max_frame(struct lan966x *lan966x)
 954{
 955	return lan966x_fdma_get_max_mtu(lan966x) +
 956	       IFH_LEN_BYTES +
 957	       SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) +
 958	       VLAN_HLEN * 2 +
 959	       XDP_PACKET_HEADROOM;
 960}
 961
 962static int __lan966x_fdma_reload(struct lan966x *lan966x, int max_mtu)
 963{
 964	int err;
 965	u32 val;
 966
 967	/* Disable the CPU port */
 968	lan_rmw(QSYS_SW_PORT_MODE_PORT_ENA_SET(0),
 969		QSYS_SW_PORT_MODE_PORT_ENA,
 970		lan966x, QSYS_SW_PORT_MODE(CPU_PORT));
 971
 972	/* Flush the CPU queues */
 973	readx_poll_timeout(lan966x_qsys_sw_status, lan966x,
 974			   val, !(QSYS_SW_STATUS_EQ_AVAIL_GET(val)),
 975			   READL_SLEEP_US, READL_TIMEOUT_US);
 976
 977	/* Add a sleep in case there are frames between the queues and the CPU
 978	 * port
 979	 */
 980	usleep_range(1000, 2000);
 981
 982	err = lan966x_fdma_reload(lan966x, max_mtu);
 983
 984	/* Enable back the CPU port */
 985	lan_rmw(QSYS_SW_PORT_MODE_PORT_ENA_SET(1),
 986		QSYS_SW_PORT_MODE_PORT_ENA,
 987		lan966x,  QSYS_SW_PORT_MODE(CPU_PORT));
 988
 989	return err;
 990}
 991
 992int lan966x_fdma_change_mtu(struct lan966x *lan966x)
 993{
 994	int max_mtu;
 995
 996	max_mtu = lan966x_fdma_get_max_frame(lan966x);
 997	if (max_mtu == lan966x->rx.max_mtu)
 998		return 0;
 999
1000	return __lan966x_fdma_reload(lan966x, max_mtu);
1001}
1002
1003int lan966x_fdma_reload_page_pool(struct lan966x *lan966x)
1004{
1005	int max_mtu;
1006
1007	max_mtu = lan966x_fdma_get_max_frame(lan966x);
1008	return __lan966x_fdma_reload(lan966x, max_mtu);
1009}
1010
1011void lan966x_fdma_netdev_init(struct lan966x *lan966x, struct net_device *dev)
1012{
1013	if (lan966x->fdma_ndev)
1014		return;
1015
1016	lan966x->fdma_ndev = dev;
1017	netif_napi_add(dev, &lan966x->napi, lan966x_fdma_napi_poll);
1018	napi_enable(&lan966x->napi);
1019}
1020
1021void lan966x_fdma_netdev_deinit(struct lan966x *lan966x, struct net_device *dev)
1022{
1023	if (lan966x->fdma_ndev == dev) {
1024		netif_napi_del(&lan966x->napi);
1025		lan966x->fdma_ndev = NULL;
1026	}
1027}
1028
1029int lan966x_fdma_init(struct lan966x *lan966x)
1030{
1031	int err;
1032
1033	if (!lan966x->fdma)
1034		return 0;
1035
1036	lan966x->rx.lan966x = lan966x;
1037	lan966x->rx.channel_id = FDMA_XTR_CHANNEL;
1038	lan966x->rx.max_mtu = lan966x_fdma_get_max_frame(lan966x);
1039	lan966x->tx.lan966x = lan966x;
1040	lan966x->tx.channel_id = FDMA_INJ_CHANNEL;
1041	lan966x->tx.last_in_use = -1;
1042
1043	err = lan966x_fdma_rx_alloc(&lan966x->rx);
1044	if (err)
1045		return err;
1046
1047	err = lan966x_fdma_tx_alloc(&lan966x->tx);
1048	if (err) {
1049		lan966x_fdma_rx_free(&lan966x->rx);
1050		return err;
1051	}
1052
1053	lan966x_fdma_rx_start(&lan966x->rx);
1054
1055	return 0;
1056}
1057
1058void lan966x_fdma_deinit(struct lan966x *lan966x)
1059{
1060	if (!lan966x->fdma)
1061		return;
1062
1063	lan966x_fdma_rx_disable(&lan966x->rx);
1064	lan966x_fdma_tx_disable(&lan966x->tx);
1065
1066	napi_synchronize(&lan966x->napi);
1067	napi_disable(&lan966x->napi);
1068
1069	lan966x_fdma_rx_free_pages(&lan966x->rx);
1070	lan966x_fdma_rx_free(&lan966x->rx);
1071	page_pool_destroy(lan966x->rx.page_pool);
1072	lan966x_fdma_tx_free(&lan966x->tx);
1073}