This is a port of the latest patch in FreeBSD that adds support for 64bit CGEMs as used in ZynqMP. This does not include the work necessary for support on RISC-V systems. --- freebsd/sys/dev/cadence/if_cgem.c | 241 ++++++++++++++++++++++++++- freebsd/sys/dev/cadence/if_cgem_hw.h | 45 +++++ 2 files changed, 284 insertions(+), 2 deletions(-)
diff --git a/freebsd/sys/dev/cadence/if_cgem.c b/freebsd/sys/dev/cadence/if_cgem.c index 34340f22..34df7ac7 100644 --- a/freebsd/sys/dev/cadence/if_cgem.c +++ b/freebsd/sys/dev/cadence/if_cgem.c @@ -81,6 +81,10 @@ __FBSDID("$FreeBSD$"); #include <dev/mii/mii.h> #include <dev/mii/miivar.h> +#if defined(__LP64__) || defined(__ILP32__) +#define CGEM64 +#endif + #include <dev/cadence/if_cgem_hw.h> #include <rtems/bsd/local/miibus_if.h> @@ -127,8 +131,14 @@ struct cgem_softc { void *intrhand; struct callout tick_ch; uint32_t net_ctl_shadow; +#ifdef __rtems__ + uint32_t net_cfg_shadow; + int neednullqs; +#endif /* __rtems__ */ int ref_clk_num; +#ifndef __rtems__ u_char eaddr[6]; +#endif /* __rtems__ */ bus_dma_tag_t desc_dma_tag; bus_dma_tag_t mbuf_dma_tag; @@ -161,12 +171,18 @@ struct cgem_softc { int txring_hd_ptr; /* where to put next xmits */ int txring_tl_ptr; /* next xmit mbuf to free */ int txring_queued; /* num xmits segs queued */ +#ifndef __rtems__ bus_dmamap_t txring_dma_map; +#endif /* __rtems__ */ u_int txfull; /* tx ring full events */ u_int txdefrags; /* tx calls to m_defrag() */ u_int txdefragfails; /* tx m_defrag() failures */ u_int txdmamapfails; /* tx dmamap failures */ + /* null descriptor rings */ + void *null_qs; + bus_addr_t null_qs_physaddr; + /* hardware provided statistics */ struct cgem_hw_stats { uint64_t tx_bytes; @@ -337,7 +353,11 @@ cgem_rx_filter(struct cgem_softc *sc) hash_hi = 0; hash_lo = 0; +#ifdef __rtems__ + net_cfg = sc->net_cfg_shadow; +#else net_cfg = RD4(sc, CGEM_NET_CFG); +#endif net_cfg &= ~(CGEM_NET_CFG_MULTI_HASH_EN | CGEM_NET_CFG_NO_BCAST | @@ -379,6 +399,9 @@ cgem_rx_filter(struct cgem_softc *sc) WR4(sc, CGEM_HASH_TOP, hash_hi); WR4(sc, CGEM_HASH_BOT, hash_lo); +#ifdef __rtems__ + sc->net_cfg_shadow = net_cfg; +#endif /* __rtems__ */ WR4(sc, CGEM_NET_CFG, net_cfg); } @@ -392,24 +415,87 @@ cgem_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) *(bus_addr_t *)arg = segs[0].ds_addr; } +#ifdef __rtems__ +/* Set up null queues for priority queues we actually can't disable. */ +static void +cgem_null_qs(struct cgem_softc *sc) +{ + struct cgem_rx_desc *rx_desc; + struct cgem_tx_desc *tx_desc; + uint32_t queue_mask; + int n; + + /* Read design config register 6 to determine number of queues. */ + queue_mask = (RD4(sc, CGEM_DESIGN_CFG6) & + CGEM_DESIGN_CFG6_DMA_PRIO_Q_MASK) >> 1; + if (queue_mask == 0) + return; + + /* Create empty RX queue and empty TX buf queues. */ + memset(sc->null_qs, 0, sizeof(struct cgem_rx_desc) + + sizeof(struct cgem_tx_desc)); + rx_desc = sc->null_qs; + rx_desc->addr = CGEM_RXDESC_OWN | CGEM_RXDESC_WRAP; + tx_desc = (struct cgem_tx_desc *)(rx_desc + 1); + tx_desc->ctl = CGEM_TXDESC_USED | CGEM_TXDESC_WRAP; + + /* Point all valid ring base pointers to the null queues. */ + for (n = 1; (queue_mask & 1) != 0; n++, queue_mask >>= 1) { + WR4(sc, CGEM_RX_QN_BAR(n), sc->null_qs_physaddr); + WR4(sc, CGEM_TX_QN_BAR(n), sc->null_qs_physaddr + + sizeof(struct cgem_rx_desc)); + } +} +#endif /* __rtems__ */ + /* Create DMA'able descriptor rings. */ static int cgem_setup_descs(struct cgem_softc *sc) { int i, err; +#ifdef __rtems__ + int desc_rings_size = CGEM_NUM_RX_DESCS * sizeof(struct cgem_rx_desc) + + CGEM_NUM_TX_DESCS * sizeof(struct cgem_tx_desc); + if (sc->neednullqs) + desc_rings_size += sizeof(struct cgem_rx_desc) + + sizeof(struct cgem_tx_desc); +#endif /* __rtems__ */ sc->txring = NULL; sc->rxring = NULL; /* Allocate non-cached DMA space for RX and TX descriptors. */ +#ifndef __rtems__ err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, +#else /* __rtems__ */ + err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), +#if defined(__LP64__) + 8, + 1ULL << 32, /* Do not cross a 4G boundary. */ + BUS_SPACE_MAXADDR, +#elif defined(__ILP32__) + 8, + 0, + BUS_SPACE_MAXADDR, +#else /* ARMv7 */ + 1, + 0, + BUS_SPACE_MAXADDR_32BIT, +#endif /* ARMv7 */ +#endif /* __rtems__ */ BUS_SPACE_MAXADDR, NULL, NULL, +#ifndef __rtems__ MAX_DESC_RING_SIZE, 1, MAX_DESC_RING_SIZE, +#else /* __rtems__ */ + desc_rings_size, + 1, + desc_rings_size, +#endif /* __rtems__ */ 0, busdma_lock_mutex, &sc->sc_mtx, @@ -418,8 +504,19 @@ cgem_setup_descs(struct cgem_softc *sc) return (err); /* Set up a bus_dma_tag for mbufs. */ +#ifndef __rtems__ err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, +#else /* __rtems__ */ + err = bus_dma_tag_create(bus_get_dma_tag(sc->dev), +#ifdef CGEM64 + 8, +#else + 1, +#endif + 0, + BUS_SPACE_MAXADDR, +#endif /* __rtems__ */ BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, @@ -435,7 +532,11 @@ cgem_setup_descs(struct cgem_softc *sc) /* Allocate DMA memory in non-cacheable space. */ err = bus_dmamem_alloc(sc->desc_dma_tag, (void **)&sc->rxring, +#ifndef __rtems__ BUS_DMA_NOWAIT | BUS_DMA_COHERENT, +#else /* __rtems__ */ + BUS_DMA_NOWAIT | BUS_DMA_COHERENT | BUS_DMA_ZERO, +#endif /* __rtems__ */ &sc->rxring_dma_map); if (err) return (err); @@ -443,7 +544,11 @@ cgem_setup_descs(struct cgem_softc *sc) /* Load descriptor DMA memory. */ err = bus_dmamap_load(sc->desc_dma_tag, sc->rxring_dma_map, (void *)sc->rxring, +#ifndef __rtems__ CGEM_NUM_RX_DESCS*sizeof(struct cgem_rx_desc), +#else /* __rtems__ */ + desc_rings_size, +#endif /* __rtems__ */ cgem_getaddr, &sc->rxring_physaddr, BUS_DMA_NOWAIT); if (err) @@ -464,6 +569,7 @@ cgem_setup_descs(struct cgem_softc *sc) sc->rxring_tl_ptr = 0; sc->rxring_queued = 0; +#ifndef __rtems__ /* Allocate DMA memory for TX descriptors in non-cacheable space. */ err = bus_dmamem_alloc(sc->desc_dma_tag, (void **)&sc->txring, @@ -480,6 +586,11 @@ cgem_setup_descs(struct cgem_softc *sc) BUS_DMA_NOWAIT); if (err) return (err); +#else /* __rtems__ */ + sc->txring = (struct cgem_tx_desc *)(sc->rxring + CGEM_NUM_RX_DESCS); + sc->txring_physaddr = sc->rxring_physaddr + CGEM_NUM_RX_DESCS * + sizeof(struct cgem_rx_desc); +#endif /* __rtems__ */ /* Initialize TX descriptor ring. */ for (i = 0; i < CGEM_NUM_TX_DESCS; i++) { @@ -496,6 +607,16 @@ cgem_setup_descs(struct cgem_softc *sc) sc->txring_tl_ptr = 0; sc->txring_queued = 0; +#ifdef __rtems__ + if (sc->neednullqs) { + sc->null_qs = (void *)(sc->txring + CGEM_NUM_TX_DESCS); + sc->null_qs_physaddr = sc->txring_physaddr + + CGEM_NUM_TX_DESCS * sizeof(struct cgem_tx_desc); + + cgem_null_qs(sc); + } +#endif /* __rtems__ */ + return (0); } @@ -556,6 +677,13 @@ cgem_fill_rqueue(struct cgem_softc *sc) /* Write rx descriptor and increment head pointer. */ sc->rxring[sc->rxring_hd_ptr].ctl = 0; +#ifdef __rtems__ +#if defined(__LP64__) + sc->rxring[sc->rxring_hd_ptr].addrhi = segs[0].ds_addr >> 32; +#elif defined(__ILP32__) + sc->rxring[sc->rxring_hd_ptr].addrhi = 0; +#endif +#endif /* __rtems__ */ if (sc->rxring_hd_ptr == CGEM_NUM_RX_DESCS - 1) { sc->rxring[sc->rxring_hd_ptr].addr = segs[0].ds_addr | CGEM_RXDESC_WRAP; @@ -709,9 +837,16 @@ cgem_clean_tx(struct cgem_softc *sc) /* Check the status. */ if ((ctl & CGEM_TXDESC_AHB_ERR) != 0) { /* Serious bus error. log to console. */ +#if defined(__LP64__) && defined(__rtems__) + device_printf(sc->dev, + "cgem_clean_tx: AHB error, addr=0x%x%08x\n", + sc->txring[sc->txring_tl_ptr].addrhi, + sc->txring[sc->txring_tl_ptr].addr); +#else device_printf(sc->dev, "cgem_clean_tx: Whoa! " "AHB error, addr=0x%x\n", sc->txring[sc->txring_tl_ptr].addr); +#endif } else if ((ctl & (CGEM_TXDESC_RETRY_ERR | CGEM_TXDESC_LATE_COLL)) != 0) { if_inc_counter(sc->ifp, IFCOUNTER_OERRORS, 1); @@ -879,6 +1014,14 @@ cgem_start_locked(if_t ifp) /* Descriptor address. */ sc->txring[sc->txring_hd_ptr + i].addr = segs[i].ds_addr; +#ifdef __rtems__ +#ifdef defined(__LP64__) + sc->txring[sc->txring_hd_ptr + i].addrhi = + segs[i].ds_addr >> 32; +#elif defined(__ILP32__) + sc->txring[sc->txring_hd_ptr + i].addrhi = 0; +#endif +#endif /* __rtems__ */ /* Descriptor control word. */ ctl = segs[i].ds_len; @@ -1081,7 +1224,11 @@ cgem_reset(struct cgem_softc *sc) CGEM_ASSERT_LOCKED(sc); WR4(sc, CGEM_NET_CTRL, 0); +#ifndef __rtems__ WR4(sc, CGEM_NET_CFG, 0); +#else + WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); +#endif WR4(sc, CGEM_NET_CTRL, CGEM_NET_CTRL_CLR_STAT_REGS); WR4(sc, CGEM_TX_STAT, CGEM_TX_STAT_ALL); WR4(sc, CGEM_RX_STAT, CGEM_RX_STAT_ALL); @@ -1092,9 +1239,31 @@ cgem_reset(struct cgem_softc *sc) WR4(sc, CGEM_RX_QBAR, 0); /* Get management port running even if interface is down. */ +#ifndef __rtems__ WR4(sc, CGEM_NET_CFG, CGEM_NET_CFG_DBUS_WIDTH_32 | CGEM_NET_CFG_MDC_CLK_DIV_64); +#else + /* Determine data bus width from design configuration register. */ + switch (RD4(sc, CGEM_DESIGN_CFG1) & + CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_MASK) { + case CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_64: + sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_64; + break; + case CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_128: + sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_128; + break; + default: + sc->net_cfg_shadow = CGEM_NET_CFG_DBUS_WIDTH_32; + } + +#ifdef CGEM64 + sc->net_cfg_shadow |= CGEM_NET_CFG_MDC_CLK_DIV_48; +#else + sc->net_cfg_shadow |= CGEM_NET_CFG_MDC_CLK_DIV_64; +#endif + WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); +#endif /* __rtems__ */ sc->net_ctl_shadow = CGEM_NET_CTRL_MGMT_PORT_EN; WR4(sc, CGEM_NET_CTRL, sc->net_ctl_shadow); @@ -1112,8 +1281,14 @@ cgem_config(struct cgem_softc *sc) CGEM_ASSERT_LOCKED(sc); /* Program Net Config Register. */ +#ifndef __rtems__ net_cfg = CGEM_NET_CFG_DBUS_WIDTH_32 | CGEM_NET_CFG_MDC_CLK_DIV_64 | +#else /* __rtems__ */ + sc->net_cfg_shadow &= (CGEM_NET_CFG_MDC_CLK_DIV_MASK | + CGEM_NET_CFG_DBUS_WIDTH_MASK); + net_cfg = sc->net_cfg_shadow | +#endif /* __rtems__ */ CGEM_NET_CFG_FCS_REMOVE | CGEM_NET_CFG_RX_BUF_OFFSET(ETHER_ALIGN) | CGEM_NET_CFG_GIGE_EN | @@ -1125,6 +1300,9 @@ cgem_config(struct cgem_softc *sc) if ((if_getcapenable(ifp) & IFCAP_RXCSUM) != 0) net_cfg |= CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN; +#ifdef __rtems__ + sc->net_cfg_shadow = net_cfg; +#endif /* __rtems__ */ WR4(sc, CGEM_NET_CFG, net_cfg); /* Program DMA Config Register. */ @@ -1132,6 +1310,9 @@ cgem_config(struct cgem_softc *sc) CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_8K | CGEM_DMA_CFG_TX_PKTBUF_MEMSZ_SEL | CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_16 | +#if defined(CGEM64) && defined(__rtems__) + CGEM_DMA_CFG_ADDR_BUS_64 | +#endif CGEM_DMA_CFG_DISC_WHEN_NO_AHB; /* Enable transmit checksum offloading? */ @@ -1143,6 +1324,13 @@ cgem_config(struct cgem_softc *sc) /* Write the rx and tx descriptor ring addresses to the QBAR regs. */ WR4(sc, CGEM_RX_QBAR, (uint32_t) sc->rxring_physaddr); WR4(sc, CGEM_TX_QBAR, (uint32_t) sc->txring_physaddr); +#if defined(__LP64__) && defined(__rtems__) + WR4(sc, CGEM_RX_QBAR_HI, (uint32_t)(sc->rxring_physaddr >> 32)); + WR4(sc, CGEM_TX_QBAR_HI, (uint32_t)(sc->txring_physaddr >> 32)); +#elif defined(__ILP32__) && defined(__rtems__) + WR4(sc, CGEM_RX_QBAR_HI, 0); + WR4(sc, CGEM_TX_QBAR_HI, 0); +#endif /* Enable rx and tx. */ sc->net_ctl_shadow |= (CGEM_NET_CTRL_TX_EN | CGEM_NET_CTRL_RX_EN); @@ -1176,8 +1364,14 @@ cgem_init_locked(struct cgem_softc *sc) if_setdrvflagbits(sc->ifp, IFF_DRV_RUNNING, IFF_DRV_OACTIVE); +#ifdef __rtems__ + if (sc->miibus != NULL) { +#endif /* __rtems__ */ mii = device_get_softc(sc->miibus); mii_mediachg(mii); +#ifdef __rtems__ + } +#endif /* __rtems__ */ callout_reset(&sc->tick_ch, hz, cgem_tick, sc); } @@ -1297,6 +1491,10 @@ cgem_ioctl(if_t ifp, u_long cmd, caddr_t data) case SIOCSIFMEDIA: case SIOCGIFMEDIA: +#ifdef __rtems__ + if (sc->miibus == NULL) + return (ENXIO); +#endif /* __rtems__ */ mii = device_get_softc(sc->miibus); error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); break; @@ -1331,16 +1529,28 @@ cgem_ioctl(if_t ifp, u_long cmd, caddr_t data) /* Turn on RX checksumming. */ if_setcapenablebit(ifp, IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6, 0); +#ifndef __rtems__ WR4(sc, CGEM_NET_CFG, RD4(sc, CGEM_NET_CFG) | CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN); +#else /* __rtems__ */ + sc->net_cfg_shadow |= + CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN; + WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); +#endif /* __rtems__ */ } else { /* Turn off RX checksumming. */ if_setcapenablebit(ifp, 0, IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6); +#ifndef __rtems__ WR4(sc, CGEM_NET_CFG, RD4(sc, CGEM_NET_CFG) & ~CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN); +#else /* __rtems__ */ + sc->net_cfg_shadow &= + ~CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN; + WR4(sc, CGEM_NET_CFG, sc->net_cfg_shadow); +#endif /* __rtems__ */ } } if ((if_getcapenable(ifp) & (IFCAP_RXCSUM | IFCAP_TXCSUM)) == @@ -1361,6 +1571,7 @@ cgem_ioctl(if_t ifp, u_long cmd, caddr_t data) /* MII bus support routines. */ +#ifndef __rtems__ static void cgem_child_detached(device_t dev, device_t child) { @@ -1369,6 +1580,7 @@ cgem_child_detached(device_t dev, device_t child) if (child == sc->miibus) sc->miibus = NULL; } +#endif /* __rtems__ */ static int cgem_ifmedia_upd(if_t ifp) @@ -1514,7 +1726,11 @@ cgem_mediachange(struct cgem_softc *sc, struct mii_data *mii) CGEM_ASSERT_LOCKED(sc); /* Update hardware to reflect media. */ +#ifndef __rtems__ net_cfg = RD4(sc, CGEM_NET_CFG); +#else /* __rtems__ */ + net_cfg = sc->net_cfg_shadow; +#endif /* __rtems__ */ net_cfg &= ~(CGEM_NET_CFG_SPEED100 | CGEM_NET_CFG_GIGE_EN | CGEM_NET_CFG_FULL_DUPLEX); @@ -1535,6 +1751,9 @@ cgem_mediachange(struct cgem_softc *sc, struct mii_data *mii) if ((mii->mii_media_active & IFM_FDX) != 0) net_cfg |= CGEM_NET_CFG_FULL_DUPLEX; +#ifdef __rtems__ + sc->net_cfg_shadow = net_cfg; +#endif /* __rtems__ */ WR4(sc, CGEM_NET_CFG, net_cfg); /* Set the reference clock if necessary. */ @@ -1809,7 +2028,17 @@ cgem_attach(device_t dev) sc->if_old_flags = if_getflags(ifp); sc->rxbufs = DEFAULT_NUM_RX_BUFS; +#if defined(CGEM64) && defined(__rtems__) + uint32_t design_cfg6 = RD4(sc, CGEM_DESIGN_CFG6); + /* + * QEMU does not have PBUF_CUTTHRU defined and is broken when trying + * to use nullqs + */ + if ((design_cfg6 & CGEM_DESIGN_CFG6_PBUF_CUTTHRU)) + sc->neednullqs = 1; +#else sc->rxhangwar = 1; +#endif /* Reset hardware. */ CGEM_LOCK(sc); @@ -1901,10 +2130,18 @@ cgem_detach(device_t dev) bus_dmamap_unload(sc->desc_dma_tag, sc->rxring_dma_map); sc->rxring_physaddr = 0; +#ifdef __rtems__ + sc->txring_physaddr = 0; + sc->null_qs_physaddr = 0; +#endif /* __rtems__ */ } bus_dmamem_free(sc->desc_dma_tag, sc->rxring, sc->rxring_dma_map); sc->rxring = NULL; +#ifdef __rtems__ + sc->txring = NULL; + sc->null_qs = NULL; +#endif /* __rtems__ */ #ifndef __rtems__ for (i = 0; i < CGEM_NUM_RX_DESCS; i++) if (sc->rxring_m_dmamap[i] != NULL) { @@ -1912,7 +2149,6 @@ cgem_detach(device_t dev) sc->rxring_m_dmamap[i]); sc->rxring_m_dmamap[i] = NULL; } -#endif /* __rtems__ */ } if (sc->txring != NULL) { if (sc->txring_physaddr != 0) { @@ -1923,7 +2159,6 @@ cgem_detach(device_t dev) bus_dmamem_free(sc->desc_dma_tag, sc->txring, sc->txring_dma_map); sc->txring = NULL; -#ifndef __rtems__ for (i = 0; i < CGEM_NUM_TX_DESCS; i++) if (sc->txring_m_dmamap[i] != NULL) { bus_dmamap_destroy(sc->mbuf_dma_tag, @@ -1954,8 +2189,10 @@ static device_method_t cgem_methods[] = { DEVMETHOD(device_attach, cgem_attach), DEVMETHOD(device_detach, cgem_detach), +#ifndef __rtems__ /* Bus interface */ DEVMETHOD(bus_child_detached, cgem_child_detached), +#endif /* __rtems__ */ /* MII interface */ DEVMETHOD(miibus_readreg, cgem_miibus_readreg), diff --git a/freebsd/sys/dev/cadence/if_cgem_hw.h b/freebsd/sys/dev/cadence/if_cgem_hw.h index 1569857d..b9a994d6 100644 --- a/freebsd/sys/dev/cadence/if_cgem_hw.h +++ b/freebsd/sys/dev/cadence/if_cgem_hw.h @@ -77,6 +77,7 @@ #define CGEM_NET_CFG_MDC_CLK_DIV_16 (1<<18) #define CGEM_NET_CFG_MDC_CLK_DIV_32 (2<<18) #define CGEM_NET_CFG_MDC_CLK_DIV_48 (3<<18) +/* Higher MDC clock divs are reserved values on 64bit hardware */ #define CGEM_NET_CFG_MDC_CLK_DIV_64 (4<<18) #define CGEM_NET_CFG_MDC_CLK_DIV_96 (5<<18) #define CGEM_NET_CFG_MDC_CLK_DIV_128 (6<<18) @@ -113,6 +114,7 @@ #define CGEM_USER_IO 0x00C /* User I/O */ #define CGEM_DMA_CFG 0x010 /* DMA Config */ +#define CGEM_DMA_CFG_ADDR_BUS_64 (1 << 30) #define CGEM_DMA_CFG_DISC_WHEN_NO_AHB (1<<24) #define CGEM_DMA_CFG_RX_BUF_SIZE_SHIFT 16 #define CGEM_DMA_CFG_RX_BUF_SIZE_MASK (0xff<<16) @@ -290,6 +292,29 @@ #define CGEM_PTP_PEER_RX_S 0x1F8 /* PTP Peer Event rcv'd s */ #define CGEM_PTP_PEER_RX_NS 0x1FC /* PTP Peer Event rcv'd ns */ +#define CGEM_DESIGN_CFG1 0x280 /* Design Configuration 1 */ +#define CGEM_DESIGN_CFG1_AXI_CACHE_WIDTH_MASK (0xfU << 28) +#define CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_MASK (7 << 25) +#define CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_32 (1 << 25) +#define CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_64 (2 << 25) +#define CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_128 (4 << 25) +#define CGEM_DESIGN_CFG1_IRQ_READ_CLR (1 << 23) +#define CGEM_DESIGN_CFG1_NO_SNAPSHOT (1 << 22) +#define CGEM_DESIGN_CFG1_NO_STATS (1 << 21) +#define CGEM_DESIGN_CFG1_NO_SCAN_PINS (1 << 20) +#define CGEM_DESIGN_CFG1_USER_IN_WIDTH_MASK (0x1f << 15) +#define CGEM_DESIGN_CFG1_USER_OUT_WIDTH_MASK (0x1f << 10) +#define CGEM_DESIGN_CFG1_USER_IO (1 << 9) +#define CGEM_DESIGN_CFG1_APB_REV2 (1 << 8) +#define CGEM_DESIGN_CFG1_APB_REV1 (1 << 7) +#define CGEM_DESIGN_CFG1_EXT_FIFO_INTERFACE (1 << 6) +#define CGEM_DESIGN_CFG1_NO_INT_LOOPBACK (1 << 5) +#define CGEM_DESIGN_CFG1_INT_LOOPBACK (1 << 4) +#define CGEM_DESIGN_CFG1_TDC_50 (1 << 3) +#define CGEM_DESIGN_CFG1_RDC_50 (1 << 2) +#define CGEM_DESIGN_CFG1_SERDES (1 << 1) +#define CGEM_DESIGN_CFG1_NO_PCS (1 << 0) + #define CGEM_DESIGN_CFG2 0x284 /* Design Configuration 2 */ #define CGEM_DESIGN_CFG2_TX_PBUF_ADDR_SHIFT 26 #define CGEM_DESIGN_CFG2_TX_PBUF_ADDR_MASK (0xf<<26) @@ -330,6 +355,18 @@ #define CGEM_DESIGN_CFG5_TX_FIFO_CNT_WIDTH_MASK (0xf<<4) #define CGEM_DESIGN_CFG5_RX_FIFO_CNT_WIDTH_MASK 0xf +#define CGEM_DESIGN_CFG6 0x294 /* Design Configuration 6 */ +#define CGEM_DESIGN_CFG6_PBUF_CUTTHRU (1 << 25) /* 64-bit addr cap */ +#define CGEM_DESIGN_CFG6_ADDR_64B (1 << 23) /* 64-bit addr cap */ +#define CGEM_DESIGN_CFG6_DMA_PRIO_Q_MASK 0xfffe +#define CGEM_DESIGN_CFG6_DMA_PRIO_Q(n) (1 << (n)) + +#define CGEM_TX_QN_BAR(n) (0x440 + ((n) - 1) * 4) +#define CGEM_RX_QN_BAR(n) (0x480 + ((n) - 1) * 4) + +#define CGEM_TX_QBAR_HI 0x4C8 +#define CGEM_RX_QBAR_HI 0x4D4 + /* Transmit Descriptors */ struct cgem_tx_desc { uint32_t addr; @@ -350,6 +387,10 @@ struct cgem_tx_desc { #define CGEM_TXDESC_NO_CRC_APPENDED (1<<16) #define CGEM_TXDESC_LAST_BUF (1<<15) /* last buf in frame */ #define CGEM_TXDESC_LENGTH_MASK 0x3fff +#if defined(CGEM64) && defined(__rtems__) + uint32_t addrhi; + uint32_t unused; +#endif }; struct cgem_rx_desc { @@ -379,6 +420,10 @@ struct cgem_rx_desc { #define CGEM_RXDESC_SOF (1<<14) /* start of frame */ #define CGEM_RXDESC_BAD_FCS (1<<13) #define CGEM_RXDESC_LENGTH_MASK 0x1fff +#if defined(CGEM64) && defined(__rtems__) + uint32_t addrhi; + uint32_t unused; +#endif }; #endif /* _IF_CGEM_HW_H_ */ -- 2.20.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel