Module Name: src Committed By: matt Date: Wed Oct 3 19:18:41 UTC 2012
Modified Files: src/sys/arch/arm/broadcom: bcm53xx_board.c bcm53xx_ccb.c bcm53xx_reg.h bcm53xx_var.h Log Message: Add code to init the SRAB (the switch robot). Don't configure eth3 by default. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/broadcom/bcm53xx_board.c cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/broadcom/bcm53xx_ccb.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm53xx_reg.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/broadcom/bcm53xx_var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/broadcom/bcm53xx_board.c diff -u src/sys/arch/arm/broadcom/bcm53xx_board.c:1.3 src/sys/arch/arm/broadcom/bcm53xx_board.c:1.4 --- src/sys/arch/arm/broadcom/bcm53xx_board.c:1.3 Tue Sep 18 05:47:27 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_board.c Wed Oct 3 19:18:40 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm53xx_board.c,v 1.3 2012/09/18 05:47:27 matt Exp $ */ +/* $NetBSD: bcm53xx_board.c,v 1.4 2012/10/03 19:18:40 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.3 2012/09/18 05:47:27 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_board.c,v 1.4 2012/10/03 19:18:40 matt Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -43,10 +43,14 @@ __KERNEL_RCSID(1, "$NetBSD: bcm53xx_boar #include <prop/proplib.h> +#include <net/if.h> +#include <net/if_ether.h> + #define CRU_PRIVATE #define DDR_PRIVATE #define DMU_PRIVATE #define ARMCORE_PRIVATE +#define SRAB_PRIVATE #include <arm/cortex/a9tmr_var.h> #include <arm/cortex/pl310_var.h> @@ -519,5 +523,122 @@ bcm53xx_device_register(device_t self, v prop_dictionary_set_uint32(dict, "frequency", clk_info.clk_cpu / 2); return; - } + } + + if (device_is_a(self, "bcmeth")) { + const struct bcmccb_attach_args * const ccbaa = aux; + const uint8_t enaddr[ETHER_ADDR_LEN] = { + 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05 + 2 * ccbaa->ccbaa_loc.loc_port, + }; + prop_data_t pd = prop_data_create_data(enaddr, ETHER_ADDR_LEN); + KASSERT(pd != NULL); + if (prop_dictionary_set(device_properties(self), "mac-address", pd) == false) { + printf("WARNING: Unable to set mac-address property for %s\n", device_xname(self)); + } + prop_object_release(pd); + } +} + +static kmutex_t srab_lock __cacheline_aligned; + +void +bcm53xx_srab_init(void) +{ + mutex_init(&srab_lock, MUTEX_DEFAULT, IPL_VM); + + bcm53xx_srab_write_4(0x0079, 0x90); // reset switch + for (u_int port = 0; port < 8; port++) { + /* per port control: no stp */ + bcm53xx_srab_write_4(port, 0x00); + } + bcm53xx_srab_write_4(0x0008, 0x1c); // IMP port (enab UC/MC/BC) + bcm53xx_srab_write_4(0x000e, 0xbb); // IMP port force-link 1G + bcm53xx_srab_write_4(0x005d, 0x7b); // port5 force-link 1G + bcm53xx_srab_write_4(0x005f, 0x7b); // port7 force-link 1G + bcm53xx_srab_write_4(0x000b, 0x7); // management mode + bcm53xx_srab_write_4(0x0203, 0x0); // disable BRCM tag + bcm53xx_srab_write_4(0x0200, 0x80); // enable IMP=port8 +} + +static inline void +bcm53xx_srab_busywait(bus_space_tag_t bst, bus_space_handle_t bsh) +{ + while (bus_space_read_4(bst, bsh, SRAB_BASE + SRAB_CMDSTAT) & SRA_GORDYN) { + delay(10); + } +} + +uint32_t +bcm53xx_srab_read_4(u_int pageoffset) +{ + bus_space_tag_t bst = bcm53xx_ioreg_bst; + bus_space_handle_t bsh = bcm53xx_ioreg_bsh; + uint32_t rv; + + mutex_spin_enter(&srab_lock); + + bcm53xx_srab_busywait(bst, bsh); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_CMDSTAT, + __SHIFTIN(pageoffset, SRA_PAGEOFFSET) | SRA_GORDYN); + bcm53xx_srab_busywait(bst, bsh); + rv = bus_space_read_4(bst, bsh, SRAB_BASE + SRAB_RDL); + + mutex_spin_exit(&srab_lock); + return rv; +} + +uint64_t +bcm53xx_srab_read_8(u_int pageoffset) +{ + bus_space_tag_t bst = bcm53xx_ioreg_bst; + bus_space_handle_t bsh = bcm53xx_ioreg_bsh; + uint64_t rv; + + mutex_spin_enter(&srab_lock); + + bcm53xx_srab_busywait(bst, bsh); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_CMDSTAT, + __SHIFTIN(pageoffset, SRA_PAGEOFFSET) | SRA_GORDYN); + bcm53xx_srab_busywait(bst, bsh); + rv = bus_space_read_4(bst, bsh, SRAB_BASE + SRAB_RDH); + rv <<= 32; + rv |= bus_space_read_4(bst, bsh, SRAB_BASE + SRAB_RDL); + + mutex_spin_exit(&srab_lock); + return rv; +} + +void +bcm53xx_srab_write_4(u_int pageoffset, uint32_t val) +{ + bus_space_tag_t bst = bcm53xx_ioreg_bst; + bus_space_handle_t bsh = bcm53xx_ioreg_bsh; + + mutex_spin_enter(&srab_lock); + + bcm53xx_srab_busywait(bst, bsh); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_WDL, val); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_CMDSTAT, + __SHIFTIN(pageoffset, SRA_PAGEOFFSET) | SRA_WRITE | SRA_GORDYN); + bcm53xx_srab_busywait(bst, bsh); + + mutex_spin_exit(&srab_lock); +} + +void +bcm53xx_srab_write_8(u_int pageoffset, uint64_t val) +{ + bus_space_tag_t bst = bcm53xx_ioreg_bst; + bus_space_handle_t bsh = bcm53xx_ioreg_bsh; + + mutex_spin_enter(&srab_lock); + + bcm53xx_srab_busywait(bst, bsh); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_WDL, val); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_WDH, val >> 32); + bus_space_write_4(bst, bsh, SRAB_BASE + SRAB_CMDSTAT, + __SHIFTIN(pageoffset, SRA_PAGEOFFSET) | SRA_WRITE | SRA_GORDYN); + bcm53xx_srab_busywait(bst, bsh); + mutex_spin_exit(&srab_lock); } Index: src/sys/arch/arm/broadcom/bcm53xx_ccb.c diff -u src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.2 src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.3 --- src/sys/arch/arm/broadcom/bcm53xx_ccb.c:1.2 Sat Sep 22 01:46:57 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_ccb.c Wed Oct 3 19:18:41 2012 @@ -34,7 +34,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_ccb.c,v 1.2 2012/09/22 01:46:57 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_ccb.c,v 1.3 2012/10/03 19:18:41 matt Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -108,7 +108,7 @@ static const struct bcm_locators bcmccb_ { "bcmeth", GMAC0_BASE, 0x1000, 0, 1, { IRQ_GMAC0 }, }, { "bcmeth", GMAC1_BASE, 0x1000, 1, 1, { IRQ_GMAC1 }, }, { "bcmeth", GMAC2_BASE, 0x1000, 2, 1, { IRQ_GMAC2 }, }, - { "bcmeth", GMAC3_BASE, 0x1000, 3, 1, { IRQ_GMAC3 }, }, + // { "bcmeth", GMAC3_BASE, 0x1000, 3, 1, { IRQ_GMAC3 }, }, { "bcmpax", PCIE0_BASE, 0x1000, 0, 6, { IRQ_PCIE_INT0 }, }, { "bcmpax", PCIE1_BASE, 0x1000, 1, 6, { IRQ_PCIE_INT1 }, }, { "bcmpax", PCIE2_BASE, 0x1000, 2, 6, { IRQ_PCIE_INT2 }, }, @@ -159,6 +159,8 @@ bcmccb_mainbus_attach(device_t parent, d aprint_naive("\n"); aprint_normal("\n"); + bcm53xx_srab_init(); // need this for ethernet. + for (size_t i = 0; i < __arraycount(bcmccb_locators); i++) { struct bcmccb_attach_args ccbaa = { .ccbaa_ccb_bst = sc->sc_bst, Index: src/sys/arch/arm/broadcom/bcm53xx_reg.h diff -u src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.5 src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.6 --- src/sys/arch/arm/broadcom/bcm53xx_reg.h:1.5 Sat Sep 22 01:46:31 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_reg.h Wed Oct 3 19:18:41 2012 @@ -213,6 +213,20 @@ #define TIMER_FREQ BCM53XX_REF_CLK +#ifdef SRAB_PRIVATE +#define SRAB_CMDSTAT 0x002c +#define SRA_PAGE __BITS(31,24) +#define SRA_OFFSET __BITS(23,16) +#define SRA_PAGEOFFSET __BITS(31,16) +#define SRA_RST __BIT(2) +#define SRA_WRITE __BIT(1) +#define SRA_GORDYN __BIT(0) +#define SRAB_WDH 0x0030 +#define SRAB_WDL 0x0034 +#define SRAB_RDH 0x0038 +#define SRAB_RDL 0x003c +#endif + #ifdef MII_PRIVATE #define MII_INTERNAL 0x0038003 /* internal phy bitmask */ #define MIIMGT 0x000 @@ -313,17 +327,17 @@ #define CRU_GPIO_PULL_DOWN 0x11e0 #define CRU_STRAPS_CONTROL 0x12a0 -#define STRAP_BOOT_DEV __BITS(17,16) -#define STRAP_NAND_TYPE __BITS(15,12) -#define STRAP_NAND_PAGE __BITS(11,10) -#define STRAP_DDR3 __BIT(9) -#define STRAP_P5_VOLT_15 __BIT(8) -#define STRAP_P5_MODE __BITS(7,6) -#define STRAP_PCIE0_MODE __BIT(5) -#define STRAP_USB3_SEL __BIT(4) -#define STRAP_EX_EXTCLK __BIT(3) -#define STRAP_HW_FWDG_EN __BIT(2) -#define STRAP_LED_SERIAL_MODE __BIT(1) +#define STRAP_BOOT_DEV __BITS(17,16) +#define STRAP_NAND_TYPE __BITS(15,12) +#define STRAP_NAND_PAGE __BITS(11,10) +#define STRAP_DDR3 __BIT(9) +#define STRAP_P5_VOLT_15 __BIT(8) +#define STRAP_P5_MODE __BITS(7,6) +#define STRAP_PCIE0_MODE __BIT(5) +#define STRAP_USB3_SEL __BIT(4) +#define STRAP_EX_EXTCLK __BIT(3) +#define STRAP_HW_FWDG_EN __BIT(2) +#define STRAP_LED_SERIAL_MODE __BIT(1) #define STRAP_BISR_BYPASS_AUTOLOAD __BIT(0) #endif /* CRU_PRIVATE */ @@ -634,8 +648,7 @@ struct gmac_txdb { uint32_t txdb_flags; - uint16_t txdb_buflen; - uint16_t txdb_addrext; + uint32_t txdb_buflen; uint32_t txdb_addrlo; uint32_t txdb_addrhi; }; @@ -646,8 +659,7 @@ struct gmac_txdb { struct gmac_rxdb { uint32_t rxdb_flags; - uint16_t rxdb_buflen; - uint16_t rxdb_addrext; + uint32_t rxdb_buflen; uint32_t rxdb_addrlo; uint32_t rxdb_addrhi; }; @@ -670,10 +682,46 @@ struct gmac_rxdb { #define RXSTS_DESC_COUNT __BITS(27,24) // # of descriptors - 1 #define GMAC_DEVCONTROL 0x000 +#define ENABLE_DEL_G_TXC __BIT(21) +#define ENABLE_DEL_G_RXC __BIT(20) +#define TXC_DRNG __BITS(19,18) +#define RXC_DRNG __BITS(17,16) +#define TXQ_FLUSH __BIT(8) +#define NWAY_AUTO_POLL_EN __BIT(7) +#define FLOW_CTRL_MODE __BITS(6,5) +#define MIB_RD_RESET_EN __BIT(4) +#define RGMII_LINK_STATUS_SEL __BIT(3) +#define CPU_FLOW_CTRL_ON __BIT(2) +#define RXQ_OVERFLOW_CTRL_SEL __BIT(1) +#define TXARB_STRICT_MODE __BIT(0) #define GMAC_DEVSTATUS 0x004 #define GMAC_BISTSTATUS 0x00c #define GMAC_INTSTATUS 0x020 #define GMAC_INTMASK 0x024 +#define TXQECCUNCORRECTED __BIT(31) +#define TXQECCCORRECTED __BIT(30) +#define RXQECCUNCORRECTED __BIT(29) +#define RXQECCCORRECTED __BIT(28) +#define XMTINT_3 __BIT(27) +#define XMTINT_2 __BIT(26) +#define XMTINT_1 __BIT(25) +#define XMTINT_0 __BIT(24) +#define RCVINT __BIT(16) +#define XMTUF __BIT(15) +#define RCVFIFOOF __BIT(14) +#define RCVDESCUF __BIT(13) +#define DESCPROTOERR __BIT(12) +#define DATAERR __BIT(11) +#define DESCERR __BIT(10) +#define INT_SW_LINK_ST_CHG __BIT(8) +#define INT_TIMEOUT __BIT(7) +#define MIB_TX_INT __BIT(6) +#define MIB_RX_INT __BIT(5) +#define MDIOINT __BIT(4) +#define NWAYLINKSTATINT __BIT(3) +#define TXQ_FLUSH_DONEINT __BIT(2) +#define MIB_TX_OVERFLOW __BIT(1) +#define MIB_RX_OVERFLOW __BIT(0) #define GMAC_GPTIMER 0x028 #define GMAC_INTRCVLAZY 0x100 @@ -697,24 +745,96 @@ struct gmac_rxdb { #define GMAC_CLOCKCONTROLSTATUS 0x1e0 #define GMAC_POWERCONTROL 0x1e8 -#define GMAC_XMTCONTROL_0 0x200 -#define GMAC_XMTPTR_0 0x204 -#define GMAC_XMTADDR_LOW_0 0x208 -#define GMAC_XMTADDR_HIGH_0 0x20c -#define GMAC_XMTSTATUS0_0 0x210 -#define GMAC_XMTSTATUS1_0 0x214 -#define GMAC_RCVCONTROL 0x220 +#define GMAC_XMTCONTROL 0x200 +#define XMTCTL_PREFETCH_THRESH __BITS(25,24) +#define XMTCTL_PREFETCH_CTL __BITS(23,21) +#define XMTCTL_BURSTLEN __BITS(20,18) +#define XMTCTL_ADDREXT __BITS(17,16) +#define XMTCTL_DMA_ACT_INDEX __BIT(13) +#define XMTCTL_PARITY_DIS __BIT(11) +#define XMTCTL_OUTSTANDING_READS __BITS(7,6) +#define XMTCTL_BURST_ALIGN_EN __BIT(5) +#define XMTCTL_DMA_LOOPBACK __BIT(2) +#define XMTCTL_SUSPEND __BIT(1) +#define XMTCTL_ENABLE __BIT(0) +#define GMAC_XMTPTR 0x204 +#define XMT_LASTDSCR __BITS(11,4) +#define GMAC_XMTADDR_LOW 0x208 +#define GMAC_XMTADDR_HIGH 0x20c +#define GMAC_XMTSTATUS0 0x210 +#define XMTSTATE __BITS(31,28) +#define XMTSTATE_DIS 0 +#define XMTSTATE_ACTIVE 1 +#define XMTSTATE_IDLE_WAIT 2 +#define XMTSTATE_STOPPED 3 +#define XMTSTATE_SUSP_PENDING 4 +#define XMT_CURRDSCR __BITS(11,4) +#define GMAC_XMTSTATUS1 0x214 +#define XMTERR __BITS(31,28) +#define XMT_ACTIVEDSCR __BITS(11,4) +#define GMAC_RCVCONTROL 0x220 +#define RCVCTL_PREFETCH_THRESH __BITS(25,24) +#define RCVCTL_PREFETCH_CTL __BITS(23,21) +#define RCVCTL_BURSTLEN __BITS(20,18) +#define RCVCTL_ADDREXT __BITS(17,16) +#define RCVCTL_DMA_ACT_INDEX __BIT(13) +#define RCVCTL_PARITY_DIS __BIT(11) +#define RCVCTL_OFLOW_CONTINUE __BIT(10) +#define RCVCTL_SEPRXHDRDESC __BIT(9) +#define RCVCTL_RCVOFFSET __BITS(7,1) +#define RCVCTL_ENABLE __BIT(0) #define GMAC_RCVPTR 0x224 +#define RCVPTR __BITS(11,4) #define GMAC_RCVADDR_LOW 0x228 #define GMAC_RCVADDR_HIGH 0x22c #define GMAC_RCVSTATUS0 0x230 +#define RCVSTATE __BITS(31,28) +#define RCVSTATE_DIS 0 +#define RCVSTATE_ACTIVE 1 +#define RCVSTATE_IDLE_WAIT 2 +#define RCVSTATE_STOPPED 3 +#define RCVSTATE_SUSP_PENDING 4 +#define RCV_CURRDSCR __BITS(11,4) #define GMAC_RCVSTATUS1 0x234 +#define RCV_ACTIVEDSCR __BITS(11,4) #define GMAC_TX_GD_OCTETS_LO 0x300 #define UNIMAC_IPG_HD_BPG_CNTL 0x804 #define UNIMAC_COMMAND_CONFIG 0x808 +#define RUNT_FILTER_DIS __BIT(30) +#define OOB_EFC_EN __BIT(29) +#define IGNORE_TX_PAUSE __BIT(28) +#define PRBL_ENA __BIT(27) +#define RX_ERR_DIS __BIT(26) +#define LINE_LOOPBACK __BIT(25) +#define NO_LENGTH_CHECK __BIT(24) +#define CNTRL_FRM_ENA __BIT(23) +#define ENA_EXT_CONFIG __BIT(22) +#define EN_INTERNAL_TX_CRS __BIT(21) +#define SW_OVERRIDE_RX __BIT(18) +#define SW_OVERRIDE_TX __BIT(17) +#define MAC_LOOP_CON __BIT(16) +#define LOOP_ENA __BIT(15) +#define RCS_CORRUPT_URUN_EN __BIT(14) +#define SW_RESET __BIT(13) +#define OVERFLOW_EN __BIT(12) +#define RX_LOW_LATENCY_EN __BIT(11) +#define HD_ENA __BIT(10) +#define TX_ADDR_INS __BIT(9) +#define PAUSE_IGNORE __BIT(8) +#define PAUSE_FWD __BIT(7) +#define CRC_FWD __BIT(6) +#define PAD_EN __BIT(5) +#define PROMISC_EN __BIT(4) +#define ETH_SPEED __BITS(3,2) +#define ETH_SPEED_10 0 +#define ETH_SPEED_100 1 +#define ETH_SPEED_1000 2 +#define ETH_SPEED_2500 3 +#define RX_ENA __BIT(1) +#define TX_ENA __BIT(0) #define UNIMAC_MAC_0 0x80c // bits 16:47 of macaddr #define UNIMAC_MAC_1 0x810 // bits 0:15 of macaddr #define UNIMAC_FRAME_LEN 0x814 Index: src/sys/arch/arm/broadcom/bcm53xx_var.h diff -u src/sys/arch/arm/broadcom/bcm53xx_var.h:1.1 src/sys/arch/arm/broadcom/bcm53xx_var.h:1.2 --- src/sys/arch/arm/broadcom/bcm53xx_var.h:1.1 Sat Sep 1 00:04:44 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_var.h Wed Oct 3 19:18:41 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm53xx_var.h,v 1.1 2012/09/01 00:04:44 matt Exp $ */ +/* $NetBSD: bcm53xx_var.h,v 1.2 2012/10/03 19:18:41 matt Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -108,6 +108,11 @@ void bcm53xx_device_register(device_t, v psize_t bcm53xx_memprobe(void); void bcm53xx_print_clocks(void); void bcm53xx_rng_start(bus_space_tag_t, bus_space_handle_t); +void bcm53xx_srab_init(void); +uint32_t bcm53xx_srab_read_4(u_int); +uint64_t bcm53xx_srab_read_8(u_int); +void bcm53xx_srab_write_4(u_int, uint32_t); +void bcm53xx_srab_write_8(u_int, uint64_t); extern struct arm32_bus_dma_tag bcm53xx_dma_tag; extern struct bus_space bcmgen_bs_tag; extern bus_space_tag_t bcm53xx_ioreg_bst;