Skip to content

Commit e895f42

Browse files
ibirnbaumbillwatersiii
authored andcommitted
drivers: ethernet: xlnx_gem: obtain AMBA AHB bus width from config register
Obtain the value for the AMBA AHB bus width (32 bit/64 bit/128 bit) from the design_cfg5 register at init-time rather than specifying it in the respective SoC's DT. Signed-off-by: Immo Birnbaum <[email protected]>
1 parent b97b94f commit e895f42

File tree

2 files changed

+36
-47
lines changed

2 files changed

+36
-47
lines changed

drivers/ethernet/eth_xlnx_gem.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,6 @@ static int eth_xlnx_gem_dev_init(const struct device *dev)
142142
#endif
143143

144144
/* AMBA AHB configuration options */
145-
__ASSERT((dev_conf->amba_dbus_width == AMBA_AHB_DBUS_WIDTH_32BIT ||
146-
dev_conf->amba_dbus_width == AMBA_AHB_DBUS_WIDTH_64BIT ||
147-
dev_conf->amba_dbus_width == AMBA_AHB_DBUS_WIDTH_128BIT),
148-
"%s AMBA AHB bus width configuration is invalid",
149-
dev->name);
150145
__ASSERT((dev_conf->ahb_burst_length == AHB_BURST_SINGLE ||
151146
dev_conf->ahb_burst_length == AHB_BURST_INCR4 ||
152147
dev_conf->ahb_burst_length == AHB_BURST_INCR8 ||
@@ -946,6 +941,7 @@ static void eth_xlnx_gem_set_initial_nwcfg(const struct device *dev)
946941
{
947942
const struct eth_xlnx_gem_dev_cfg *dev_conf = dev->config;
948943
uint32_t reg_val = 0;
944+
uint32_t design_cfg5_reg_val;
949945

950946
if (dev_conf->ignore_ipg_rxer) {
951947
/* [30] ignore IPG rx_er */
@@ -979,10 +975,11 @@ static void eth_xlnx_gem_set_initial_nwcfg(const struct device *dev)
979975
/* [23] Do not copy pause Frames to memory */
980976
reg_val |= ETH_XLNX_GEM_NWCFG_PAUSECOPYDI_BIT;
981977
}
982-
/* [22..21] Data bus width */
983-
reg_val |= (((uint32_t)(dev_conf->amba_dbus_width) &
984-
ETH_XLNX_GEM_NWCFG_DBUSW_MASK) <<
985-
ETH_XLNX_GEM_NWCFG_DBUSW_SHIFT);
978+
/* [22..21] Data bus width -> obtain from design_cfg5 register */
979+
design_cfg5_reg_val = sys_read32(dev_conf->base_addr + ETH_XLNX_GEM_DESIGN_CFG5_OFFSET);
980+
design_cfg5_reg_val >>= ETH_XLNX_GEM_DESIGN_CFG5_DBUSW_SHIFT;
981+
design_cfg5_reg_val &= ETH_XLNX_GEM_NWCFG_DBUSW_MASK;
982+
reg_val |= (design_cfg5_reg_val << ETH_XLNX_GEM_NWCFG_DBUSW_SHIFT);
986983
/* [20..18] MDC clock divider */
987984
reg_val |= (((uint32_t)dev_conf->mdc_divider &
988985
ETH_XLNX_GEM_NWCFG_MDC_MASK) <<

drivers/ethernet/eth_xlnx_gem_priv.h

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -149,27 +149,28 @@
149149

150150
/*
151151
* Register offsets within the respective GEM's address space:
152-
* NWCTRL = gem.net_ctrl Network Control register
153-
* NWCFG = gem.net_cfg Network Configuration register
154-
* NWSR = gem.net_status Network Status register
155-
* DMACR = gem.dma_cfg DMA Control register
156-
* TXSR = gem.tx_status TX Status register
157-
* RXQBASE = gem.rx_qbar RXQ base address register
158-
* TXQBASE = gem.tx_qbar TXQ base address register
159-
* RXSR = gem.rx_status RX Status register
160-
* ISR = gem.intr_status Interrupt status register
161-
* IER = gem.intr_en Interrupt enable register
162-
* IDR = gem.intr_dis Interrupt disable register
163-
* IMR = gem.intr_mask Interrupt mask register
164-
* PHYMNTNC = gem.phy_maint PHY maintenance register
165-
* LADDR1L = gem.spec_addr1_bot Specific address 1 bottom register
166-
* LADDR1H = gem.spec_addr1_top Specific address 1 top register
167-
* LADDR2L = gem.spec_addr2_bot Specific address 2 bottom register
168-
* LADDR2H = gem.spec_addr2_top Specific address 2 top register
169-
* LADDR3L = gem.spec_addr3_bot Specific address 3 bottom register
170-
* LADDR3H = gem.spec_addr3_top Specific address 3 top register
171-
* LADDR4L = gem.spec_addr4_bot Specific address 4 bottom register
172-
* LADDR4H = gem.spec_addr4_top Specific address 4 top register
152+
* NWCTRL = gem.net_ctrl Network Control register
153+
* NWCFG = gem.net_cfg Network Configuration register
154+
* NWSR = gem.net_status Network Status register
155+
* DMACR = gem.dma_cfg DMA Control register
156+
* TXSR = gem.tx_status TX Status register
157+
* RXQBASE = gem.rx_qbar RXQ base address register
158+
* TXQBASE = gem.tx_qbar TXQ base address register
159+
* RXSR = gem.rx_status RX Status register
160+
* ISR = gem.intr_status Interrupt status register
161+
* IER = gem.intr_en Interrupt enable register
162+
* IDR = gem.intr_dis Interrupt disable register
163+
* IMR = gem.intr_mask Interrupt mask register
164+
* PHYMNTNC = gem.phy_maint PHY maintenance register
165+
* LADDR1L = gem.spec_addr1_bot Specific address 1 bottom register
166+
* LADDR1H = gem.spec_addr1_top Specific address 1 top register
167+
* LADDR2L = gem.spec_addr2_bot Specific address 2 bottom register
168+
* LADDR2H = gem.spec_addr2_top Specific address 2 top register
169+
* LADDR3L = gem.spec_addr3_bot Specific address 3 bottom register
170+
* LADDR3H = gem.spec_addr3_top Specific address 3 top register
171+
* LADDR4L = gem.spec_addr4_bot Specific address 4 bottom register
172+
* LADDR4H = gem.spec_addr4_top Specific address 4 top register
173+
* DESIGN_CFG5 = gem.design_cfg5 Design Configuration 5 register
173174
*/
174175
#define ETH_XLNX_GEM_NWCTRL_OFFSET 0x00000000
175176
#define ETH_XLNX_GEM_NWCFG_OFFSET 0x00000004
@@ -192,6 +193,7 @@
192193
#define ETH_XLNX_GEM_LADDR3H_OFFSET 0x0000009C
193194
#define ETH_XLNX_GEM_LADDR4L_OFFSET 0x000000A0
194195
#define ETH_XLNX_GEM_LADDR4H_OFFSET 0x000000A4
196+
#define ETH_XLNX_GEM_DESIGN_CFG5_OFFSET 0x00000290
195197

196198
/*
197199
* Masks for clearing registers during initialization:
@@ -403,6 +405,13 @@
403405
#define ETH_XLNX_GEM_PHY_MAINT_REGISTER_ID_SHIFT 18
404406
#define ETH_XLNX_GEM_PHY_MAINT_DATA_MASK 0x0000FFFF
405407

408+
/*
409+
* gem.design_cfg5:
410+
* [11 .. 10] Data bus width of the current target SoC
411+
* (mask identical with ETH_XLNX_GEM_NWCFG_DBUSW_MASK)
412+
*/
413+
#define ETH_XLNX_GEM_DESIGN_CFG5_DBUSW_SHIFT 10
414+
406415
/* Device initialization macro */
407416
#define ETH_XLNX_GEM_NET_DEV_INIT(port) \
408417
ETH_NET_DEVICE_DT_INST_DEFINE(port,\
@@ -431,8 +440,6 @@ static const struct eth_xlnx_gem_dev_cfg eth_xlnx_gem##port##_dev_cfg = {\
431440
.phy_poll_interval = DT_INST_PROP(port, phy_poll_interval),\
432441
.defer_rxp_to_queue = !DT_INST_PROP(port, handle_rx_in_isr),\
433442
.defer_txd_to_queue = DT_INST_PROP(port, handle_tx_in_workq),\
434-
.amba_dbus_width = (enum eth_xlnx_amba_dbus_width)\
435-
(DT_INST_PROP(port, amba_ahb_dbus_width)),\
436443
.ahb_burst_length = (enum eth_xlnx_ahb_burst_length)\
437444
(DT_INST_PROP(port, amba_ahb_burst_length)),\
438445
.hw_rx_buffer_size = (enum eth_xlnx_hwrx_buffer_size)\
@@ -557,20 +564,6 @@ enum eth_xlnx_link_speed {
557564
LINK_1GBIT
558565
};
559566

560-
/**
561-
* @brief AMBA AHB data bus width configuration enumeration type.
562-
*
563-
* Enumeration type containing the supported width options for the
564-
* AMBA AHB data bus. This is a configuration item in the controller's
565-
* net_cfg register.
566-
*/
567-
enum eth_xlnx_amba_dbus_width {
568-
/* The values of this enum are consecutively numbered */
569-
AMBA_AHB_DBUS_WIDTH_32BIT = 0,
570-
AMBA_AHB_DBUS_WIDTH_64BIT,
571-
AMBA_AHB_DBUS_WIDTH_128BIT
572-
};
573-
574567
/**
575568
* @brief MDC clock divider configuration enumeration type.
576569
*
@@ -696,7 +689,6 @@ struct eth_xlnx_gem_dev_cfg {
696689
uint8_t defer_rxp_to_queue;
697690
uint8_t defer_txd_to_queue;
698691

699-
enum eth_xlnx_amba_dbus_width amba_dbus_width;
700692
enum eth_xlnx_ahb_burst_length ahb_burst_length;
701693
enum eth_xlnx_hwrx_buffer_size hw_rx_buffer_size;
702694
uint8_t hw_rx_buffer_offset;

0 commit comments

Comments
 (0)