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;