drivers: ethernet: intel: Add i226 Ethernet MAC device driver
The Intel i226 Ethernet Controller is a PCIe Gen 2 one-lane modular endpoint device that integrates a GbE Media Access Control (MAC) and Physical Layer (PHY) port. This driver provides support for MAC and DMA-specific initialization and runtime TX/RX operations. Key features: - MSI-X interrupts for TX/RX DMA channels. - Multiple TX/RX DMA channel support with exclusive bottom-half. - Implements a circular descriptor ring architechture with producer-consumer semantics for high performance pkt processing. - Full duplex support for 10/100/1000 Mbps. - Half duplex support for 10/100 Mbps. - Auto-negotiation for 10/100/1000 Mbps. - MTU customization for flexible packet sizes. - MAC address filtering based on: - Random MAC generation. - Local-mac-address mentioned in device tree. - EEPROM pre-programmed mac address. - Setting mac address via net shell. - Support for multiple Ethernet interface instances. Signed-off-by: Vijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com> Signed-off-by: Ling Pei Lee <pei.lee.ling@intel.com>
This commit is contained in:
parent
c62b3d9637
commit
8a32bd7cd0
@ -1,4 +1,5 @@
|
||||
# Copyright (c) 2025 Intel Corporation.
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
zephyr_library_sources_ifdef(CONFIG_ETH_INTEL_IGC eth_intel_igc.c)
|
||||
zephyr_library_sources_ifdef(CONFIG_ETH_INTEL_PLAT eth_intel_plat.c)
|
||||
|
||||
@ -8,3 +8,5 @@ config ETH_INTEL_PLAT
|
||||
Enable Platform driver to retrieve the MMIO mapping details and
|
||||
share them with all the child devices such as MDIO, PHY, MAC
|
||||
and PTP_CLOCK.
|
||||
|
||||
source "drivers/ethernet/intel/Kconfig.intel_igc"
|
||||
|
||||
29
drivers/ethernet/intel/Kconfig.intel_igc
Normal file
29
drivers/ethernet/intel/Kconfig.intel_igc
Normal file
@ -0,0 +1,29 @@
|
||||
# Copyright (c) 2025 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
menuconfig ETH_INTEL_IGC
|
||||
bool "Intel IGC MAC driver"
|
||||
default y
|
||||
depends on DT_HAS_INTEL_IGC_MAC_ENABLED
|
||||
select MDIO
|
||||
select PCIE_MSI_MULTI_VECTOR
|
||||
select PCIE_MSI_X
|
||||
help
|
||||
Ethernet device driver for Intel i226 MAC.
|
||||
|
||||
if ETH_INTEL_IGC
|
||||
|
||||
config ETH_INTEL_IGC_INT_PRIORITY
|
||||
int "Interrupt priority"
|
||||
default 6
|
||||
help
|
||||
MSI-X vectors priority for IGC interrupts.
|
||||
|
||||
config ETH_INTEL_IGC_NET_MTU
|
||||
int "MTU size"
|
||||
default 1500
|
||||
range 64 1522
|
||||
help
|
||||
Maximum Transmission Unit (MTU) size configuration.
|
||||
|
||||
endif # ETH_INTEL_IGC
|
||||
1333
drivers/ethernet/intel/eth_intel_igc.c
Normal file
1333
drivers/ethernet/intel/eth_intel_igc.c
Normal file
File diff suppressed because it is too large
Load Diff
500
drivers/ethernet/intel/eth_intel_igc_priv.h
Normal file
500
drivers/ethernet/intel/eth_intel_igc_priv.h
Normal file
@ -0,0 +1,500 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Intel Corporation.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_INTEL_IGC_PRIV_H_
|
||||
#define ZEPHYR_DRIVERS_ETHERNET_ETH_INTEL_IGC_PRIV_H_
|
||||
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/drivers/pcie/pcie.h>
|
||||
#include <zephyr/drivers/pcie/msi.h>
|
||||
#include <zephyr/sys/util.h>
|
||||
#include <zephyr/drivers/ethernet/eth_intel_plat.h>
|
||||
|
||||
#define ETH_MAX_FRAME_SZ 2048
|
||||
#define INTEL_IGC_MAX_QCNT 4
|
||||
#define ETH_IGC_NUM_MISC 1
|
||||
#define RAH_QSEL_SHIFT 18
|
||||
#define RAH_QSEL_ENABLE BIT(28)
|
||||
#define RAH_QSEL_MASK GENMASK(19, 18)
|
||||
#define RAH_ASEL_MASK GENMASK(17, 16)
|
||||
#define RAH_ASEL_SRC_ADDR BIT(16)
|
||||
#define INTEL_IGC_RAH_AV BIT(31)
|
||||
#define INTEL_IGC_DEF_MAC_ADDR 0xC9A000
|
||||
|
||||
/* Device Control Register */
|
||||
#define INTEL_IGC_CTRL 0x00000
|
||||
#define INTEL_IGC_CTRL_GIO_MASTER_DISABLE BIT(2)
|
||||
#define INTEL_IGC_CTRL_SLU BIT(6)
|
||||
#define INTEL_IGC_CTRL_FRCSPD BIT(11)
|
||||
#define INTEL_IGC_CTRL_FRCDPX BIT(12)
|
||||
#define INTEL_IGC_CTRL_RST BIT(26)
|
||||
#define INTEL_IGC_CTRL_RFCE BIT(27)
|
||||
#define INTEL_IGC_CTRL_TFCE BIT(28)
|
||||
#define INTEL_IGC_CTRL_EXT_DRV_LOAD BIT(28)
|
||||
#define INTEL_IGC_CTRL_DEV_RST BIT(29)
|
||||
#define INTEL_IGC_CTRL_VME BIT(30)
|
||||
#define INTEL_IGC_CTRL_PHY_RST BIT(31)
|
||||
|
||||
/* Device Status Register */
|
||||
#define INTEL_IGC_STATUS 0x00008
|
||||
#define INTEL_IGC_STATUS_FD BIT(0)
|
||||
#define INTEL_IGC_STATUS_LU BIT(1)
|
||||
#define INTEL_IGC_STATUS_TXOFF BIT(4)
|
||||
#define INTEL_IGC_STATUS_SPEED_100 BIT(6)
|
||||
#define INTEL_IGC_STATUS_SPEED_1000 BIT(7)
|
||||
#define INTEL_IGC_STATUS_GIO_MASTER_ENABLE BIT(19)
|
||||
#define INTEL_IGC_STATUS_SPEED_MASK GENMASK(7, 6)
|
||||
|
||||
/* Extended Device Control Register */
|
||||
#define INTEL_IGC_CTRL_EXT 0x00018
|
||||
#define INTEL_IGC_CTRL_EXT_DRV_LOAD BIT(28)
|
||||
|
||||
/* Internal Rx Packet Buffer Size */
|
||||
#define INTEL_IGC_RXPBS 0x02404
|
||||
#define INTEL_IGC_RXPBS_RXPBSIZE_MASK GENMASK(5, 0)
|
||||
#define INTEL_IGC_RXPBS_RXPBSIZE_DEFAULT 0x000000A2
|
||||
|
||||
/* Internal Tx Packet Buffer Size*/
|
||||
#define INTEL_IGC_TXPBS 0x03404
|
||||
#define INTEL_IGC_TXPBS_TXPBSIZE_DEFAULT 0x04000014
|
||||
|
||||
/* Interrupt Cause Read */
|
||||
#define INTEL_IGC_ICR 0x01500
|
||||
|
||||
/* Interrupt Cause Set */
|
||||
#define INTEL_IGC_ICS 0x01504
|
||||
|
||||
/* Interrupt Mask Set/Read */
|
||||
#define INTEL_IGC_IMS 0x01508
|
||||
|
||||
/* Interrupt Mask Clear */
|
||||
#define INTEL_IGC_IMC 0x0150C
|
||||
|
||||
#define INTEL_IGC_TXDW BIT(0)
|
||||
#define INTEL_IGC_LSC BIT(2)
|
||||
#define INTEL_IGC_RXDMT0 BIT(4)
|
||||
#define INTEL_IGC_RX_MISS BIT(6)
|
||||
#define INTEL_IGC_RXDW BIT(7)
|
||||
#define INTEL_IGC_TIME_SYNC BIT(19)
|
||||
#define INTEL_IGC_DRSTA BIT(30)
|
||||
#define INTEL_IGC_INTA BIT(31)
|
||||
|
||||
/* General Purpose Interrupt Enable */
|
||||
#define INTEL_IGC_GPIE 0x01514
|
||||
#define INTEL_IGC_GPIE_NSICR BIT(0)
|
||||
#define INTEL_IGC_GPIE_MSIX_MODE BIT(4)
|
||||
#define INTEL_IGC_GPIE_EIAME BIT(30)
|
||||
#define INTEL_IGC_GPIE_PBA BIT(31)
|
||||
|
||||
/* Extended Interrupt Cause Set */
|
||||
#define INTEL_IGC_EICS 0x01520
|
||||
|
||||
/* Extended Interrupt Mask Set/Read */
|
||||
#define INTEL_IGC_EIMS 0x01524
|
||||
|
||||
/* Extended Interrupt Mask Clear */
|
||||
#define INTEL_IGC_EIMC 0x01528
|
||||
|
||||
/* Extended Interrupt Auto Clear */
|
||||
#define INTEL_IGC_EIAC 0x0152C
|
||||
|
||||
/* Extended Interrupt Auto Mask */
|
||||
#define INTEL_IGC_EIAM 0x01530
|
||||
|
||||
/* Extended Interrupt Cause read */
|
||||
#define INTEL_IGC_EICR 0x01580
|
||||
|
||||
/* Interrupt Throttle */
|
||||
#define INTEL_IGC_EITR_BASE_ADDR 0x01680
|
||||
#define INTEL_IGC_EITR(n) (INTEL_IGC_EITR_BASE_ADDR + (n * 4))
|
||||
|
||||
/* Interrupt Vector Allocation */
|
||||
#define INTEL_IGC_IVAR_BASE_ADDR 0x01700
|
||||
#define INTEL_IGC_IVAR(n) (INTEL_IGC_IVAR_BASE_ADDR + (n * 4))
|
||||
|
||||
/* Interrupt Vector Allocation MISC */
|
||||
#define INTEL_IGC_IVAR_MISC 0x01740
|
||||
#define INTEL_IGC_IVAR_INT_VALID_BIT BIT(7)
|
||||
#define INTEL_IGC_IVAR_MSI_CLEAR_RX0_RX2 0xFFFFFF00
|
||||
#define INTEL_IGC_IVAR_MSI_CLEAR_TX0_TX2 0xFFFF00FF
|
||||
#define INTEL_IGC_IVAR_MSI_CLEAR_RX1_RX3 0xFF00FFFF
|
||||
#define INTEL_IGC_IVAR_MSI_CLEAR_TX1_TX3 0x00FFFFFF
|
||||
|
||||
/* Receive Control */
|
||||
#define INTEL_IGC_RCTL 0x00100
|
||||
#define INTEL_IGC_RCTL_EN BIT(1)
|
||||
#define INTEL_IGC_RCTL_SBP BIT(2)
|
||||
#define INTEL_IGC_RCTL_UPE BIT(3)
|
||||
#define INTEL_IGC_RCTL_MPE BIT(4)
|
||||
#define INTEL_IGC_RCTL_LPE BIT(5)
|
||||
#define INTEL_IGC_RCTL_LBM_MAC BIT(6)
|
||||
#define INTEL_IGC_RCTL_BAM BIT(15)
|
||||
#define INTEL_IGC_RCTL_VFE BIT(18)
|
||||
#define INTEL_IGC_RCTL_CFIEN BIT(19)
|
||||
#define INTEL_IGC_RCTL_PADSMALL BIT(21)
|
||||
#define INTEL_IGC_RCTL_DPF BIT(22)
|
||||
#define INTEL_IGC_RCTL_PMCF BIT(23)
|
||||
#define INTEL_IGC_RCTL_SECRC BIT(26)
|
||||
#define INTEL_IGC_RCTL_MO_SHIFT 12
|
||||
#define INTEL_IGC_RCTL_SZ_2048 0x0
|
||||
#define INTEL_IGC_RCTL_SZ_1024 GENMASK(16, 16)
|
||||
#define INTEL_IGC_RCTL_SZ_512 GENMASK(17, 17)
|
||||
#define INTEL_IGC_RCTL_SZ_256 GENMASK(17, 16)
|
||||
#define INTEL_IGC_RCTL_LBM_TCVR GENMASK(7, 6)
|
||||
|
||||
/* Split and Replication Receive Control */
|
||||
#define INTEL_IGC_SRRCTL_BASE 0x0C00C
|
||||
#define INTEL_IGC_SRRCTL_OFFSET 0x40
|
||||
#define INTEL_IGC_SRRCTL(n) (INTEL_IGC_SRRCTL_BASE + (INTEL_IGC_SRRCTL_OFFSET * (n)))
|
||||
#define INTEL_IGC_SRRCTL_BSIZEPKT_MASK GENMASK(6, 0)
|
||||
|
||||
/* Convert as 1024 Bytes resolution */
|
||||
#define INTEL_IGC_SRRCTL_BSIZEPKT(x) FIELD_PREP(INTEL_IGC_SRRCTL_BSIZEPKT_MASK, (x) / 1024)
|
||||
#define INTEL_IGC_SRRCTL_BSIZEHDR_MASK GENMASK(13, 8)
|
||||
|
||||
/* Covert as 64 Bytes resolution */
|
||||
#define INTEL_IGC_SRRCTL_BSIZEHDR(x) FIELD_PREP(INTEL_IGC_SRRCTL_BSIZEHDR_MASK, (x) / 64)
|
||||
#define INTEL_IGC_RXBUFFER_256 256
|
||||
#define INTEL_IGC_SRRCTL_DESCTYPE_ADV_ONEBUF BIT(25)
|
||||
#define INTEL_IGC_SRRCTL_DROP_EN BIT(31)
|
||||
|
||||
/* Receive Descriptor Base Address Low */
|
||||
#define INTEL_IGC_RDBAL_BASE_ADDR 0x0C000
|
||||
#define INTEL_IGC_RDBAL_OFFSET 0x40
|
||||
#define INTEL_IGC_RDBAL(n) (INTEL_IGC_RDBAL_BASE_ADDR + (INTEL_IGC_RDBAL_OFFSET * (n)))
|
||||
|
||||
/* Receive Descriptor Base Address High */
|
||||
#define INTEL_IGC_RDBAH_BASE_ADDR 0x0C004
|
||||
#define INTEL_IGC_RDBAH_OFFSET 0x40
|
||||
#define INTEL_IGC_RDBAH(n) (INTEL_IGC_RDBAH_BASE_ADDR + (INTEL_IGC_RDBAH_OFFSET * (n)))
|
||||
|
||||
/* Receive Descriptor Ring Length */
|
||||
#define INTEL_IGC_RDLEN_BASE_ADDR 0x0C008
|
||||
#define INTEL_IGC_RDLEN_OFFSET 0x40
|
||||
#define INTEL_IGC_RDLEN(n) (INTEL_IGC_RDLEN_BASE_ADDR + (INTEL_IGC_RDLEN_OFFSET * (n)))
|
||||
|
||||
/* Receive Descriptor Head */
|
||||
#define INTEL_IGC_RDH_BASE_ADDR 0x0C010
|
||||
#define INTEL_IGC_RDH_OFFSET 0x40
|
||||
#define INTEL_IGC_RDH(n) (INTEL_IGC_RDH_BASE_ADDR + (INTEL_IGC_RDH_OFFSET * (n)))
|
||||
|
||||
/* Receive Descriptor Tail */
|
||||
#define INTEL_IGC_RDT_BASE_ADDR 0x0C018
|
||||
#define INTEL_IGC_RDT_OFFSET 0x40
|
||||
#define INTEL_IGC_RDT(n) (INTEL_IGC_RDT_BASE_ADDR + (INTEL_IGC_RDT_OFFSET * (n)))
|
||||
|
||||
/* Receive Descriptor Control */
|
||||
#define INTEL_IGC_RXDCTL_BASE_ADDR 0x0C028
|
||||
#define INTEL_IGC_RXDCTL_OFFSET 0x40
|
||||
#define INTEL_IGC_RXDCTL(n) (INTEL_IGC_RXDCTL_BASE_ADDR + (INTEL_IGC_RXDCTL_OFFSET * (n)))
|
||||
#define INTEL_IGC_RXDCTL_QUEUE_ENABLE BIT(25)
|
||||
#define INTEL_IGC_RXDCTL_SWFLUSH BIT(26)
|
||||
|
||||
#define INTEL_IGC_RX_THRESH_RESET GENMASK(31, 21)
|
||||
#define INTEL_IGC_RX_PTHRESH_VAL 8
|
||||
#define INTEL_IGC_RX_HTHRESH_VAL 8
|
||||
#define INTEL_IGC_RX_WTHRESH_VAL 8
|
||||
#define INTEL_IGC_RX_PTHRESH_SHIFT 0
|
||||
#define INTEL_IGC_RX_HTHRESH_SHIFT 8
|
||||
#define INTEL_IGC_RX_WTHRESH_SHIFT 16
|
||||
|
||||
/* Receive Queue Drop Packet Count */
|
||||
#define INTEL_IGC_RQDPC_BASE_ADDR 0x0C030
|
||||
#define INTEL_IGC_RQDPC_OFFSET 0x40
|
||||
#define INTEL_IGC_RQDPC(n) (INTEL_IGC_RQDPC_BASE_ADDR + (INTEL_IGC_RQDPC_OFFSET * (n)))
|
||||
|
||||
/* Receive Checksum Control */
|
||||
#define INTEL_IGC_RXCSUM 0x05000
|
||||
#define INTEL_IGC_RXCSUM_CRCOFL BIT(11)
|
||||
#define INTEL_IGC_RXCSUM_PCSD BIT(13)
|
||||
|
||||
/* Receive Long Packet Maximum Length */
|
||||
#define INTEL_IGC_RLPML 0x05004
|
||||
|
||||
/* Receive Filter Control */
|
||||
#define INTEL_IGC_RFCTL 0x05008
|
||||
#define INTEL_IGC_RFCTL_IPV6_EX_DIS BIT(16)
|
||||
#define INTEL_IGC_RFCTL_LEF BIT(18)
|
||||
|
||||
/* Collision related config parameters */
|
||||
#define INTEL_IGC_TCTL_CT_SHIFT 4
|
||||
#define INTEL_IGC_COLLISION_THRESHOLD 15
|
||||
|
||||
/* Transmit Control Register */
|
||||
#define INTEL_IGC_TCTL 0x00400
|
||||
#define INTEL_IGC_TCTL_EN BIT(1)
|
||||
#define INTEL_IGC_TCTL_PSP BIT(3)
|
||||
#define INTEL_IGC_TCTL_RTLC BIT(24)
|
||||
#define INTEL_IGC_TCTL_CT GENMASK(11, 4)
|
||||
#define INTEL_IGC_TCTL_COLD GENMASK(21, 12)
|
||||
|
||||
/* Transmit Descriptor Base Address Low */
|
||||
#define INTEL_TDBAL_BASE_ADDR 0x0E000
|
||||
#define INTEL_TDBAL_OFFSET 0x40
|
||||
#define INTEL_IGC_TDBAL(n) (INTEL_TDBAL_BASE_ADDR + (INTEL_TDBAL_OFFSET * (n)))
|
||||
|
||||
/* Transmit Descriptor Base Address High */
|
||||
#define INTEL_TDBAH_BASE_ADDR 0x0E004
|
||||
#define INTEL_TDBAH_OFFSET 0x40
|
||||
#define INTEL_IGC_TDBAH(n) (INTEL_TDBAH_BASE_ADDR + (INTEL_TDBAH_OFFSET * (n)))
|
||||
|
||||
/* Transmit Descriptor Ring Length */
|
||||
#define INTEL_TDLEN_BASE_ADDR 0x0E008
|
||||
#define INTEL_TDLEN_OFFSET 0x40
|
||||
#define INTEL_IGC_TDLEN(n) (INTEL_TDLEN_BASE_ADDR + (INTEL_TDLEN_OFFSET * (n)))
|
||||
|
||||
/* Transmit Descriptor Head */
|
||||
#define INTEL_TDH_BASE_ADDR 0x0E010
|
||||
#define INTEL_TDH_OFFSET 0x40
|
||||
#define INTEL_IGC_TDH(n) (INTEL_TDH_BASE_ADDR + (INTEL_TDH_OFFSET * (n)))
|
||||
|
||||
/* Transmit Descriptor Tail */
|
||||
#define INTEL_TDT_BASE_ADDR 0x0E018
|
||||
#define INTEL_TDT_OFFSET 0x40
|
||||
#define INTEL_IGC_TDT(n) (INTEL_TDT_BASE_ADDR + (INTEL_TDT_OFFSET * (n)))
|
||||
|
||||
/* Transmit Descriptor Control */
|
||||
#define INTEL_TXDCTL_BASE_ADDR 0x0E028
|
||||
#define INTEL_TXDCTL_OFFSET 0x40
|
||||
#define INTEL_IGC_TXDCTL(n) (INTEL_TXDCTL_BASE_ADDR + (INTEL_TXDCTL_OFFSET * (n)))
|
||||
#define INTEL_IGC_TXDCTL_QUEUE_ENABLE BIT(25)
|
||||
|
||||
#define INTEL_IGC_TX_PTHRESH_VAL 8
|
||||
#define INTEL_IGC_TX_HTHRESH_VAL 8
|
||||
#define INTEL_IGC_TX_WTHRESH_VAL 8
|
||||
#define INTEL_IGC_TX_PTHRESH_SHIFT 0
|
||||
#define INTEL_IGC_TX_HTHRESH_SHIFT 8
|
||||
#define INTEL_IGC_TX_WTHRESH_SHIFT 16
|
||||
#define INTEL_IGC_TX_DESC_TYPE 0x3
|
||||
|
||||
/* Statistics Register Descriptions */
|
||||
#define INTEL_IGC_CRCERRS 0x04000
|
||||
#define INTEL_IGC_ALGNERRC 0x04004
|
||||
#define INTEL_IGC_RXERRC 0x0400C
|
||||
#define INTEL_IGC_MPC 0x04010
|
||||
#define INTEL_IGC_SCC 0x04014
|
||||
#define INTEL_IGC_ECOL 0x04018
|
||||
#define INTEL_IGC_MCC 0x0401C
|
||||
#define INTEL_IGC_LATECOL 0x04020
|
||||
#define INTEL_IGC_COLC 0x04028
|
||||
#define INTEL_IGC_RERC 0x0402C
|
||||
#define INTEL_IGC_DC 0x04030
|
||||
#define INTEL_IGC_TNCRS 0x04034
|
||||
#define INTEL_IGC_HTDPMC 0x0403C
|
||||
#define INTEL_IGC_RLEC 0x04040
|
||||
#define INTEL_IGC_XONRXC 0x04048
|
||||
#define INTEL_IGC_XONTXC 0x0404C
|
||||
#define INTEL_IGC_XOFFRXC 0x04050
|
||||
#define INTEL_IGC_XOFFTXC 0x04054
|
||||
#define INTEL_IGC_FCRUC 0x04058
|
||||
#define INTEL_IGC_PRC64 0x0405C
|
||||
#define INTEL_IGC_PRC127 0x04060
|
||||
#define INTEL_IGC_PRC255 0x04064
|
||||
#define INTEL_IGC_PRC511 0x04068
|
||||
#define INTEL_IGC_PRC1023 0x0406C
|
||||
#define INTEL_IGC_PRC1522 0x04070
|
||||
#define INTEL_IGC_GPRC 0x04074
|
||||
#define INTEL_IGC_BPRC 0x04078
|
||||
#define INTEL_IGC_MPRC 0x0407C
|
||||
#define INTEL_IGC_GPTC 0x04080
|
||||
#define INTEL_IGC_GORCL 0x04088
|
||||
#define INTEL_IGC_GORCH 0x0408C
|
||||
#define INTEL_IGC_GOTCL 0x04090
|
||||
#define INTEL_IGC_GOTCH 0x04094
|
||||
#define INTEL_IGC_RNBC 0x040A0
|
||||
#define INTEL_IGC_RUC 0x040A4
|
||||
#define INTEL_IGC_RFC 0x040A8
|
||||
#define INTEL_IGC_ROC 0x040AC
|
||||
#define INTEL_IGC_RJC 0x040B0
|
||||
#define INTEL_IGC_MGTPRC 0x040B4
|
||||
#define INTEL_IGC_MGTPDC 0x040B8
|
||||
#define INTEL_IGC_MGTPTC 0x040BC
|
||||
#define INTEL_IGC_TORL 0x040C0
|
||||
#define INTEL_IGC_TORH 0x040C4
|
||||
#define INTEL_IGC_TOTL 0x040C8
|
||||
#define INTEL_IGC_TOTH 0x040CC
|
||||
#define INTEL_IGC_TPR 0x040D0
|
||||
#define INTEL_IGC_TPT 0x040D4
|
||||
#define INTEL_IGC_PTC64 0x040D8
|
||||
#define INTEL_IGC_PTC127 0x040DC
|
||||
#define INTEL_IGC_PTC255 0x040E0
|
||||
#define INTEL_IGC_PTC511 0x040E4
|
||||
#define INTEL_IGC_PTC1023 0x040E8
|
||||
#define INTEL_IGC_PTC1522 0x040EC
|
||||
#define INTEL_IGC_MPTC 0x040F0
|
||||
#define INTEL_IGC_BPTC 0x040F4
|
||||
#define INTEL_IGC_TSCTC 0x040F8
|
||||
#define INTEL_IGC_IAC 0x04100
|
||||
#define INTEL_IGC_RPTHC 0x04104
|
||||
#define INTEL_IGC_TLPIC 0x04148
|
||||
#define INTEL_IGC_RLPIC 0x0414C
|
||||
#define INTEL_IGC_HGPTC 0x04118
|
||||
#define INTEL_IGC_RXDMTC 0x04120
|
||||
#define INTEL_IGC_HGORCL 0x04128
|
||||
#define INTEL_IGC_HGORCH 0x0412C
|
||||
#define INTEL_IGC_HGOTCL 0x04130
|
||||
#define INTEL_IGC_HGOTCH 0x04134
|
||||
#define INTEL_IGC_LENERRS 0x04138
|
||||
#define INTEL_IGC_TQDPC_BASE 0x0E030
|
||||
#define INTEL_IGC_TQDPC_OFFSET 0x40
|
||||
#define INTEL_IGC_TQDPC(n) (INTEL_IGC_TQDPC_BASE + (INTEL_IGC_TQDPC_OFFSET * (n)))
|
||||
|
||||
#define INTEL_IGC_GIO_MASTER_DISABLE_TIMEOUT 800
|
||||
#define INTEL_IGC_RESET_DELAY 1
|
||||
|
||||
#define INTEL_IGC_RAL(i) (((i) <= 15) ? (0x05400 + ((i) * 8)) : (0x054E0 + ((i - 16) * 8)))
|
||||
#define INTEL_IGC_RAH(i) (((i) <= 15) ? (0x05404 + ((i) * 8)) : (0x054E4 + ((i - 16) * 8)))
|
||||
|
||||
typedef void (*eth_config_irq_t)(const struct device *);
|
||||
|
||||
struct eth_intel_igc_intr_info {
|
||||
const struct device *mac;
|
||||
msi_vector_t msi_vector;
|
||||
uint8_t id;
|
||||
};
|
||||
|
||||
enum eth_igc_mac_filter_mode {
|
||||
DEST_ADDR, /* normal mode */
|
||||
SRC_ADDR
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This Advanced transmit descriptor format is crucial for the transmit DMA.
|
||||
* Field misalignment or size change will break the DMA operation. Modify this
|
||||
* structure with caution.
|
||||
*/
|
||||
union dma_tx_desc {
|
||||
struct {
|
||||
uint64_t data_buf_addr;
|
||||
|
||||
unsigned int data_len: 16;
|
||||
unsigned int ptp1: 4;
|
||||
unsigned int desc_type: 4;
|
||||
unsigned int eop: 1;
|
||||
unsigned int ifcs: 1;
|
||||
unsigned int reserved1: 1;
|
||||
unsigned int rs: 1;
|
||||
unsigned int reserved2: 1;
|
||||
unsigned int dext: 1;
|
||||
unsigned int vle: 1;
|
||||
unsigned int tse: 1;
|
||||
unsigned int dd: 1;
|
||||
unsigned int ts_stat: 1;
|
||||
unsigned int reserved3: 2;
|
||||
unsigned int idx: 1;
|
||||
unsigned int ptp2: 3;
|
||||
unsigned int popts: 6;
|
||||
unsigned int payloadlen: 18;
|
||||
} read;
|
||||
|
||||
struct {
|
||||
uint64_t dma_time_stamp;
|
||||
|
||||
unsigned int reserved1: 32;
|
||||
unsigned int dd: 1;
|
||||
unsigned int ts_stat: 1;
|
||||
unsigned int reserved2: 2;
|
||||
unsigned int reserved3: 28;
|
||||
} writeback;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This Advanced receive descriptor format is crucial for the receive DMA.
|
||||
* Field misalignment or size change will break the DMA operation. Modify this
|
||||
* structure with caution.
|
||||
*/
|
||||
union dma_rx_desc {
|
||||
struct {
|
||||
uint64_t pkt_buf_addr;
|
||||
uint64_t hdr_buf_addr;
|
||||
} read;
|
||||
|
||||
struct {
|
||||
unsigned int rss_type: 4;
|
||||
unsigned int pkt_type: 13;
|
||||
unsigned int reserved1: 2;
|
||||
unsigned int hdr_len: 12;
|
||||
unsigned int sph: 1;
|
||||
unsigned int rss_has_val: 32;
|
||||
|
||||
/* extended status */
|
||||
unsigned int dd: 1;
|
||||
unsigned int eop: 1;
|
||||
unsigned int reserved2: 1;
|
||||
unsigned int vp: 1;
|
||||
unsigned int udpcs: 1;
|
||||
unsigned int l4cs: 1;
|
||||
unsigned int ipcs: 1;
|
||||
unsigned int pif: 1;
|
||||
unsigned int reserved3: 1;
|
||||
unsigned int vext: 1;
|
||||
unsigned int udpv: 1;
|
||||
unsigned int llint: 1;
|
||||
unsigned int crc_strip: 1;
|
||||
unsigned int smd_type: 2;
|
||||
unsigned int tsip: 1;
|
||||
unsigned int reserved4: 3;
|
||||
unsigned int mc: 1;
|
||||
|
||||
/* extended error */
|
||||
unsigned int reserved5: 3;
|
||||
unsigned int hbo: 1;
|
||||
unsigned int reserved6: 5;
|
||||
unsigned int l4e: 1;
|
||||
unsigned int ipe: 1;
|
||||
unsigned int rxe: 1;
|
||||
|
||||
unsigned int pkt_len: 16;
|
||||
unsigned int vlan_tag: 16;
|
||||
} writeback;
|
||||
};
|
||||
|
||||
struct eth_intel_igc_mac_cfg {
|
||||
const struct device *const platform;
|
||||
const struct device *const phy;
|
||||
eth_config_irq_t config_func;
|
||||
uint32_t num_tx_desc;
|
||||
uint32_t num_rx_desc;
|
||||
uint8_t num_queues;
|
||||
uint8_t num_msix;
|
||||
bool random_mac_address;
|
||||
};
|
||||
|
||||
struct eth_intel_igc_mac_tx {
|
||||
union dma_tx_desc *desc;
|
||||
struct k_sem *sem;
|
||||
uint32_t *ring_wr_ptr;
|
||||
uint32_t *ring_rd_ptr;
|
||||
struct net_buf **frag;
|
||||
struct net_pkt **pkt;
|
||||
};
|
||||
|
||||
struct eth_intel_igc_mac_rx {
|
||||
union dma_rx_desc *desc;
|
||||
struct k_sem *sem;
|
||||
uint32_t *ring_wr_ptr;
|
||||
uint32_t *ring_rd_ptr;
|
||||
uint8_t *buf;
|
||||
};
|
||||
|
||||
struct eth_intel_igc_mac_data {
|
||||
struct net_if *iface;
|
||||
const struct device *mac;
|
||||
struct eth_intel_igc_mac_tx tx;
|
||||
struct eth_intel_igc_mac_rx rx;
|
||||
struct k_work tx_work[INTEL_IGC_MAX_QCNT];
|
||||
struct k_work_delayable rx_work[INTEL_IGC_MAX_QCNT];
|
||||
struct eth_intel_igc_intr_info *intr_info;
|
||||
uint8_t mac_addr[NET_ETH_ADDR_LEN];
|
||||
msi_vector_t *msi_vec;
|
||||
#if defined(CONFIG_NET_STATISTICS_ETHERNET)
|
||||
struct net_stats_eth stats;
|
||||
#endif
|
||||
mm_reg_t base;
|
||||
};
|
||||
|
||||
#endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_INTEL_IGC_PRIV_H_*/
|
||||
26
dts/bindings/ethernet/intel,igc-mac.yaml
Normal file
26
dts/bindings/ethernet/intel,igc-mac.yaml
Normal file
@ -0,0 +1,26 @@
|
||||
# Copyright 2025 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
description: Intel IGC MAC bindings.
|
||||
|
||||
compatible: "intel,igc-mac"
|
||||
|
||||
include: [base.yaml, ethernet-controller.yaml]
|
||||
|
||||
properties:
|
||||
num-queues:
|
||||
type: int
|
||||
default: 4
|
||||
description: Number of queues supported by the IGC MAC.
|
||||
|
||||
num-tx-desc:
|
||||
type: int
|
||||
default: 512
|
||||
description: The number of transmit descriptors per queue can range from 128 to 4096,
|
||||
depending on the configuration.
|
||||
|
||||
num-rx-desc:
|
||||
type: int
|
||||
default: 512
|
||||
description: The number of receive descriptors per queue can range from 128 to 4096,
|
||||
depending on the configuration.
|
||||
Loading…
Reference in New Issue
Block a user