Merge remote-tracking branch 'gfiber-internal/vendor_drops' into local_master
Change-Id: I9c1357caab2a3f1cdc8f5c608275b73806098203
diff --git a/Makefile.gfiber b/Makefile.gfiber
new file mode 100644
index 0000000..7442d4a
--- /dev/null
+++ b/Makefile.gfiber
@@ -0,0 +1,80 @@
+#
+# Google makefile to build uboot for quantenna qsr1000 products
+#
+
+export ARCH=arm
+export TOP=$(PWD)
+export CROSS_TOOLDIR=$(TOP)/../../toolchains/quantenna/usr/bin/
+export CROSS_PREFIX=arc-buildroot-linux-uclibc-
+export CROSS_COMPILE=$(CROSS_TOOLDIR)/$(CROSS_PREFIX)
+
+version = $(shell ./version)
+
+LOADERBIN_GFRG240 = ../../loader-bin/quantenna/gfrg240
+
+GFRG240 = gfrg240-dev gfrg240-prod gfrg240-openbox
+
+all: clean $(GFRG240)
+
+# don't run parallel, the several builds would mix .o files
+.NOTPARALLEL:
+
+clean:
+ make clean
+ rm -rf output.*
+
+clobber: clean
+ -make distclean
+ rm -rf output
+
+gfiber_private.pem:
+ @echo "$@ is required to sign binaries. Get a copy and put it next to Makefile.gfiber"
+ exit 1
+
+#
+# GENERATE_DIGEST(DIR, NAME)
+#
+define GENERATE_DIGEST
+ @echo "Generating digest for $(1)/$(2)"
+ openssl dgst -sign gfiber_private.pem -sha512 -binary -keyform \
+ PEM $(1)/$(2).bin > $(1)/$(2).sig
+endef
+
+install: gfiber_private.pem
+ mkdir -p $(LOADERBIN_GFRG240)
+ cp output/gfrg240-dev/*dev.bin $(LOADERBIN_GFRG240)/u-boot-dev.bin
+ cp output/gfrg240-prod/*prod.bin $(LOADERBIN_GFRG240)/u-boot-prod.bin
+ cp output/gfrg240-openbox/*openbox.bin $(LOADERBIN_GFRG240)/u-boot-openbox.bin
+ $(call GENERATE_DIGEST,$(LOADERBIN_GFRG240),u-boot-dev)
+ $(call GENERATE_DIGEST,$(LOADERBIN_GFRG240),u-boot-prod)
+ $(call GENERATE_DIGEST,$(LOADERBIN_GFRG240),u-boot-openbox)
+
+gfrg240-dev:
+ make -f Makefile clean
+ make -f Makefile ruby_config
+ make -f Makefile all
+ make -f Makefile ruby_mini_config
+ make -f piggy.mk TARGET=u-boot
+ mkdir -p output/$@
+ cp u-boot-piggy.bin output/$@/u-boot-dev.bin
+
+gfrg240-prod:
+ make -f Makefile clean
+ make -f Makefile ruby_config
+ echo "#define CONFIG_DISABLE_INPUT" >> include/config.h
+ echo "#define CONFIG_BOOT_DELAY 0" >> include/config.h
+ make -f Makefile all
+ make -f Makefile ruby_mini_config
+ make -f piggy.mk TARGET=u-boot
+ mkdir -p output/$@
+ cp u-boot-piggy.bin output/$@/u-boot-prod.bin
+
+gfrg240-openbox:
+ make -f Makefile clean
+ make -f Makefile ruby_config
+ echo "#undef CONFIG_DISABLE_INPUT" >> include/config.h
+ make -f Makefile all
+ make -f Makefile ruby_mini_config
+ make -f piggy.mk TARGET=u-boot
+ mkdir -p output/$@
+ cp u-boot-piggy.bin output/$@/u-boot-openbox.bin
diff --git a/board/ruby/Makefile b/board/ruby/Makefile
index 67d055c..f5a4413 100644
--- a/board/ruby/Makefile
+++ b/board/ruby/Makefile
@@ -59,7 +59,7 @@
rm -f $(LIB) core *.bak .depend
$(obj)u-boot.lds: u-boot.lds.S force
- $(CPP) -I../../../ -I../../ $(CPPFLAGS) -D__ASSEMBLY__ -P $< > $@
+ $(CPP) -I../../quantenna/ -I../../ $(CPPFLAGS) -D__ASSEMBLY__ -P $< > $@
.PHONY: force
diff --git a/board/ruby/ar8236.c b/board/ruby/ar8236.c
index 1c18a93..43bd33d 100644
--- a/board/ruby/ar8236.c
+++ b/board/ruby/ar8236.c
@@ -157,12 +157,12 @@
// Functions
////////////////////////////////////////////////////////////////////
-inline u32 ar8236_emac_rdreg(int reg)
+u32 ar8236_emac_rdreg(int reg)
{
return *(volatile u32 *)(g8236Dev.base + reg);
}
-inline void ar8236_emac_wrreg(int reg, u32 val)
+void ar8236_emac_wrreg(int reg, u32 val)
{
*(volatile u32 *)(g8236Dev.base + reg) = val;
}
diff --git a/board/ruby/ar8237.c b/board/ruby/ar8237.c
index 08e39aa..e5e9f61 100755
--- a/board/ruby/ar8237.c
+++ b/board/ruby/ar8237.c
@@ -120,14 +120,30 @@
#define AR8237_MASK_CTL_RESET (0x80000000)
#define AR8237_MASK_CLEAR_DEF (0)
#define AR8237_MODE_CTRL (0x04)
-#define AR8237_MODE_RGMII_PHY (0x07600000)
+
+#define S17_MAC0_RGMII_RXCLK_SHIFT 20
+#define S17_MAC0_RGMII_TXCLK_SHIFT 22
+#define S17_MAC0_RGMII_TXCLK_DELAY_EN (1 << 25)
+#define S17_MAC0_RGMII_EN (1 << 26)
+
+#define AR8237_MODE_RGMII_PHY (S17_MAC0_RGMII_EN)
+
+//#define AR8237_MODE_RGMII_PHY (0x07600000)
//#define AR8237_MODE_RGMII_PHY (0x07402000)
#define AR8237_PWS_CTRL (0x10)
#define AR8237_PWS_CTRL_DEF (0x40000000)
#define AR8237_FWCTL_CTRL (0x0624)
#define AR8237_FWCTL_CTRL_DEF (0x007f7f7f)
+
+#define S17_P0STATUS_REG 0x007c
+#define S17_P5STATUS_REG 0x0090
+#define S17_P6STATUS_REG 0x0094
+
#define AR8237_PORT6_CTRL (0xc)
-#define AR8237_PORT6_CTRL_DEF (0x01000000)
+#define S17_PHY4_RGMII_EN (1 << 17)
+#define S17_MAC6_RGMII_EN (1 << 26)
+#define AR8237_PORT6_CTRL_DEF (S17_PHY4_RGMII_EN)
+
#define AR8237_PORT0_CTRL (0x7c)
#define AR8237_PORT0_CTRL_DEF (0x7e)
@@ -143,6 +159,27 @@
#define AR8237_MIN_PHY_NUM (0)
#define AR8237_MAX_PHY_NUM (4)
+
+#define S17_P5PAD_MODE_REG 0x0008
+#define S17_MAC_RGMII_RXCLK_DELAY_EN (1 << 24)
+
+#define S17_SPEED_10M (0 << 0)
+#define S17_SPEED_100M (1 << 0)
+#define S17_SPEED_1000M (2 << 0)
+#define S17_TXMAC_EN (1 << 2)
+#define S17_RXMAC_EN (1 << 3)
+#define S17_TX_FLOW_EN (1 << 4)
+#define S17_RX_FLOW_EN (1 << 5)
+#define S17_DUPLEX_FULL (1 << 6)
+#define S17_DUPLEX_HALF (0 << 6)
+#define S17_TX_HALF_FLOW_EN (1 << 7)
+#define S17_LINK_EN (1 << 9)
+#define S17_FLOW_LINK_EN (1 << 12)
+#define S17_PORT_STATUS_DEFAULT (S17_SPEED_1000M | S17_TXMAC_EN | \
+ S17_RXMAC_EN | \
+ S17_DUPLEX_FULL )
+
+
////////////////////////////////////////////////////////////////////
// Types
////////////////////////////////////////////////////////////////////
@@ -157,12 +194,12 @@
// Functions
////////////////////////////////////////////////////////////////////
-inline u32 ar8237_emac_rdreg(int reg)
+u32 ar8237_emac_rdreg(int reg)
{
return *(volatile u32 *)(g8237Dev.base + reg);
}
-inline void ar8237_emac_wrreg(int reg, u32 val)
+void ar8237_emac_wrreg(int reg, u32 val)
{
*(volatile u32 *)(g8237Dev.base + reg) = val;
}
@@ -190,6 +227,42 @@
return 0;
}
+int ar8237_normal_mdio_write(u16 phyAddr, u8 regAddr, u16 data)
+{
+ // check for clear MDIO status
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_DATA, data & 0xffff);
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_CTRL,
+ ((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
+ (regAddr << 5) | (phyAddr & 0x1f) |
+ AR8237_MDIO_START);
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+ // return without waiting for final completion
+ return 0;
+}
+int ar8237_normal_mdio_read(u16 phyAddr, u8 regAddr, u16 *data)
+{
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ ar8237_emac_wrreg(EMAC_MAC_MDIO_CTRL, ( (regAddr & 0x1f) << 5) | AR8237_MDIO_START |
+ ((mdc_clk_divisor & MacMdioCtrlClkMask) << MacMdioCtrlClkShift) |
+ AR8237_MDIO_READ | (phyAddr & 0x1f));
+ if (ar8237_mdio_poll() != 0) {
+ return -1;
+ }
+
+ *data = ar8237_emac_rdreg(EMAC_MAC_MDIO_DATA);
+ return 0;
+}
+int __ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data);
+
/*********************************************************************
Name: ar8237_mdio_write
Purpose: mdio write routine for AR8237 device
@@ -204,6 +277,9 @@
u32 rg = (regAddr & 0x3c) >> 1;
u32 ph = (regAddr & 0x1c0) >> 6;
+ u32 prev;
+ __ar8237_mdio_read(phyAddr, regAddr, &prev);
+
// check for clear MDIO status
if (ar8237_mdio_poll() != 0) {
return -1;
@@ -237,6 +313,8 @@
return -1;
}
+ // printf("%s reg 0x%04x data 0x%08x previously %08x\n", __func__, regAddr, data, prev);
+
// return without waiting for final completion
return 0;
}
@@ -248,7 +326,7 @@
more than one cycle to complete the write.
checks for completion first
*********************************************************************/
-int ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data)
+int __ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data)
{
u32 highAddr = regAddr >> 9;
// need to swizzle the bits into arasan's fields which are different
@@ -288,6 +366,16 @@
*data = *data | (ar8237_emac_rdreg(EMAC_MAC_MDIO_DATA) << 16);
return 0;
}
+int ar8237_mdio_read(u32 phyAddr, u32 regAddr, u32 * data) {
+ int rc;
+ rc = __ar8237_mdio_read(phyAddr, regAddr, data);
+ if (!rc) {
+ // printf("%s reg 0x%04x data 0x%08x\n", __func__, regAddr, *data);
+ } else {
+ printf("%s failed reg 0x%04x data 0x%08x\n", __func__, regAddr, *data);
+ }
+ return rc;
+}
/*********************************************************************
Name: ar8237_init
@@ -299,6 +387,7 @@
{
u32 addr;
u32 devID;
+ u16 val;
g8237Dev.base = baseAddr;
// need to scan?
@@ -315,29 +404,37 @@
while (addr < AR8237_MAX_PHY_NUM) {
uint32_t reset = AR8237_MASK_CTL_RESET;
ar8237_mdio_read(addr, AR8237_MASK_CTL, &devID);
- if ((devID & 0xff00) == 0x1200) {
- printf("Detected AR8237 Switch %d - set for RGMII, 1000FD\n",addr);
+ if ((devID & 0xff00) == 0x1300) {
+ printf("Detected AR8337 Switch %d - set for RGMII, 1000FD devID 0x%x\n",addr, devID);
// do a softreset
- ar8237_mdio_write(phy_addr, AR8237_MODE_CTRL, AR8237_MODE_RGMII_PHY);
-
// do a clean reset and wait for completion
ar8237_mdio_write(phy_addr, AR8237_MASK_CTL, AR8237_MASK_CTL_RESET);
while (reset & AR8237_MASK_CTL_RESET) {
ar8237_mdio_read(addr, AR8237_MASK_CTL, &reset);
}
+ ar8237_mdio_write(phy_addr, AR8237_MODE_CTRL, AR8237_MODE_RGMII_PHY);
+
ar8237_mdio_write(phy_addr, AR8237_MASK_CTL, AR8237_MASK_CLEAR_DEF);
-
- ar8237_mdio_write(phy_addr, AR8237_PWS_CTRL, AR8237_PWS_CTRL_DEF);
ar8237_mdio_write(phy_addr, AR8237_FWCTL_CTRL, AR8237_FWCTL_CTRL_DEF);
ar8237_mdio_write(phy_addr, AR8237_PORT6_CTRL, AR8237_PORT6_CTRL_DEF);
- ar8237_mdio_write(phy_addr, AR8237_PORT0_CTRL, AR8237_PORT0_CTRL_DEF);
- g8237Dev.phy = addr;
+
+ /* Disable MAC5 and MAC6 (due to PHY4), QCA */
+ ar8237_mdio_write(phy_addr, S17_P5STATUS_REG, 0);
+ ar8237_mdio_write(phy_addr, S17_P6STATUS_REG, 0);
- //set the register 0xe00000b4 for RGMII Dll control register
- *(volatile u32 *)(0xe00000b4) = 0x86868f8f;
+ ar8237_mdio_write(phy_addr, S17_P0STATUS_REG, S17_PORT_STATUS_DEFAULT);
+
+ ar8237_normal_mdio_write(4, 29, 0x12);
+ ar8237_normal_mdio_read(4, 30, &val);
+ val |= (1<<3);
+ ar8237_normal_mdio_write(4, 30, val);
+ ar8237_normal_mdio_write(4, 29, 0);
+
+
+ g8237Dev.phy = addr;
return addr;
}
diff --git a/board/ruby/arasan-emac-ahb.c b/board/ruby/arasan-emac-ahb.c
index 479a682..940d087 100644
--- a/board/ruby/arasan-emac-ahb.c
+++ b/board/ruby/arasan-emac-ahb.c
@@ -394,7 +394,7 @@
static int emac_reset(struct emac_private * priv)
{
unsigned int i;
- uintptr_t base, mdio_base;
+ uintptr_t base;
uint16_t macaddr16[3];
uint16_t rx_desc_size = 0;
uint16_t tx_ring_size = 0;
@@ -402,7 +402,6 @@
struct eth_device * br = priv->parent;
base = priv->io_base;
- mdio_base = priv->mdio->base;
memcpy(macaddr16, br->enetaddr, sizeof(macaddr16));
emac_reset_dma(base);
@@ -886,6 +885,11 @@
const char *dbg_bus = getenv("debug_bus");
int i;
+ printf("Resetting QCA8337\n");
+ gpio_config(7, GPIO_MODE_OUTPUT);
+ gpio_output(7, 1);
+ udelay(10);
+
if (!((emac0_cfg & EMAC_IN_USE) || (emac1_cfg & EMAC_IN_USE))) {
printf("error: no emac enabled\n");
return -1;
@@ -944,7 +948,7 @@
if (strcmp(argv[1],"read") == 0) {
uint32_t a1,a2,val;
a1 = simple_strtoul (argv[2], NULL, 10);
- a2 = simple_strtoul (argv[3], NULL, 16);
+ a2 = simple_strtoul (argv[3], NULL, 10);
mdio_postrd_raw(base, a1, a2);
val = mdio_rdval_raw(base, 1);
printf("phy:%d reg:%d=0x%x\n",a1,a2,val);
diff --git a/board/ruby/newlib_asm.h b/board/ruby/newlib_asm.h
index e1f5c23..3144159 100644
--- a/board/ruby/newlib_asm.h
+++ b/board/ruby/newlib_asm.h
@@ -8,7 +8,7 @@
#define _ENTRY(name) \
.text ` .balign 4 ` .globl name ` name:
#define FUNC(name) .type name,@function
-#define ENDFUNC0(name) .Lfe_##X##name: .size name,.Lfe_##name-name
+#define ENDFUNC0(name) .Lfe_##X##name: .size name,.Lfe_##X##name-name
#define ENDFUNC(name) ENDFUNC0(name)
#define ENTRY(name) _ENTRY(name) ` FUNC(name)
diff --git a/board/ruby/pcie.c b/board/ruby/pcie.c
index c128d38..861ff97 100755
--- a/board/ruby/pcie.c
+++ b/board/ruby/pcie.c
@@ -45,7 +45,7 @@
*/
static int32_t setup_atu_shmem(void)
{
- uint32_t val = 0x0;
+ uint32_t __attribute__((unused)) val = 0x0;
/* Select shared mem region */
writel(PCIE_SHMEM_REGION, RUBY_PCIE_ATU_VIEW);
@@ -75,7 +75,7 @@
*/
static int32_t setup_atu_sysctl(void)
{
- uint32_t val = 0x0;
+ uint32_t __attribute__((unused)) val = 0x0;
/* Select shared mem region */
writel(PCIE_SYSCTL_REGION, RUBY_PCIE_ATU_VIEW);
@@ -106,7 +106,7 @@
*/
static int32_t setup_atu_dma(void)
{
- uint32_t val = 0x0;
+ uint32_t __attribute__((unused)) val = 0x0;
/* Select dma register region */
writel(PCIE_DMAREG_REGION, RUBY_PCIE_ATU_VIEW);
@@ -138,7 +138,7 @@
static int32_t setup_atu_host(volatile qdpc_pcie_bda_t *bda)
{
uint32_t host_mem_start = PCIE_HOSTMEM_EP_START_LO - readl(&bda->bda_dma_offset);
- uint32_t val = 0x0;
+ uint32_t __attribute__((unused)) val = 0x0;
/* Select shared mem region */
writel(PCIE_HOSTMEM_REGION, RUBY_PCIE_ATU_VIEW);
@@ -202,7 +202,7 @@
uint16_t flag = 0;
uint32_t msi_addr = 0x0;
uint32_t msi_addr_up = 0x0;
- uint32_t val = 0x0;
+ uint32_t __attribute__((unused)) val = 0x0;
uint32_t msi64 = 0;
flag = readl(PCIE_MSI_CAP) >> 16;
diff --git a/board/ruby/pcie2.c b/board/ruby/pcie2.c
index 9d1aa42..0c0ffb5 100644
--- a/board/ruby/pcie2.c
+++ b/board/ruby/pcie2.c
@@ -223,7 +223,7 @@
*****************************************************************************/
void pcie_cfg_map(u32 base,u32 size, u32 ch)
{
- u32 tmp = 0;
+ u32 __attribute__((unused)) tmp = 0;
REG_WRITE(PCIE_ATU_VIEW, ch);
REG_WRITE(PCIE_ATU_LBAR, base);
@@ -302,7 +302,7 @@
void pcie_bar_map(u32 bar, u32 target, u32 size, u32 atu_chan)
{
- u32 tmp;
+ u32 __attribute__((unused)) tmp;
REG_WRITE(PCIE_ATU_VIEW, atu_chan | PCIE_ATU_VIEW_INBOUND);
REG_WRITE(PCIE_ATU_LAR, size);
REG_WRITE(PCIE_ATU_LTAR, target);
@@ -330,7 +330,7 @@
*****************************************************************************/
void pcie_mem_map(u32 base,u32 target,u32 size,u32 ch,u32 dir)
{
- u32 tmp;
+ u32 __attribute__((unused)) tmp;
REG_WRITE(PCIE_ATU_VIEW,ch|dir);
REG_WRITE(PCIE_ATU_LBAR,base);
@@ -353,7 +353,7 @@
*****************************************************************************/
void pcie_msi_map(u32 base)
{
- u32 tmp;
+ u32 __attribute__((unused)) tmp;
REG_WRITE(PCIE_MSI_ADDR,base);
REG_WRITE(PCIE_MSI_ADDR_UPPER,0);
REG_WRITE(PCIE_MSI_ENABLE,BIT(0));
@@ -677,7 +677,7 @@
void topaz_ep_mmap(u32 target)
{
volatile qdpc_pcie_bda_t *bda = (qdpc_pcie_bda_t *)(RUBY_PCIE_BDA_ADDR);
- u32 tmp;
+ u32 __attribute__((unused)) tmp;
if (atu_is_init)
return;
diff --git a/board/ruby/ruby.c b/board/ruby/ruby.c
index a4ecd69..c1e0c5c 100644
--- a/board/ruby/ruby.c
+++ b/board/ruby/ruby.c
@@ -198,6 +198,9 @@
spi_protect_mode_off();
}
}
+#ifdef CONFIG_CMD_HNVRAM
+ RUN("hnvram");
+#endif
return 0;
}
diff --git a/board/ruby/start.S b/board/ruby/start.S
index 647f5ad..6974204 100644
--- a/board/ruby/start.S
+++ b/board/ruby/start.S
@@ -128,22 +128,22 @@
/* reset bus monitors */
mov r0, 0
mov r1, 0xe0000200
- st.di r0,[r1, 0x00]
- st.di r0,[r1, 0x40]
- st.di r0,[r1, 0x80]
- st.di r0,[r1, 0xc0]
- st.di r0,[r1, 0x100]
- st.di r0,[r1, 0x140]
- st.di r0,[r1, 0x180]
- st.di r0,[r1, 0x1c0]
- ld.di r0,[r1, 0x00]
- ld.di r0,[r1, 0x40]
- ld.di r0,[r1, 0x80]
- ld.di r0,[r1, 0xc0]
- ld.di r0,[r1, 0x100]
- ld.di r0,[r1, 0x140]
- ld.di r0,[r1, 0x180]
- ld.di r0,[r1, 0x1c0]
+ st.di.as r0,[r1, 0x00]
+ st.di.as r0,[r1, 0x10]
+ st.di.as r0,[r1, 0x20]
+ st.di.as r0,[r1, 0x30]
+ st.di.as r0,[r1, 0x40]
+ st.di.as r0,[r1, 0x50]
+ st.di.as r0,[r1, 0x60]
+ st.di.as r0,[r1, 0x70]
+ ld.di.as r0,[r1, 0x00]
+ ld.di.as r0,[r1, 0x10]
+ ld.di.as r0,[r1, 0x20]
+ ld.di.as r0,[r1, 0x30]
+ ld.di.as r0,[r1, 0x40]
+ ld.di.as r0,[r1, 0x50]
+ ld.di.as r0,[r1, 0x60]
+ ld.di.as r0,[r1, 0x70]
#endif
M_REMOVE_FROM_RESET
diff --git a/board/ruby_mini/ruby_mini_common.c b/board/ruby_mini/ruby_mini_common.c
index e1df98a..bf1e3bf 100644
--- a/board/ruby_mini/ruby_mini_common.c
+++ b/board/ruby_mini/ruby_mini_common.c
@@ -71,7 +71,7 @@
void printf(const char *fmt, ...)
{
va_list args;
- uint i;
+ uint __attribute__((unused)) i;
char printbuffer[256];
va_start (args, fmt);
@@ -89,7 +89,7 @@
void vprintf(const char *fmt, va_list args)
{
- uint i;
+ uint __attribute__((unused)) i;
char printbuffer[256];
/*
diff --git a/board/ruby_mini/ruby_piggy.c b/board/ruby_mini/ruby_piggy.c
index 9a17af9..bd93c63 100644
--- a/board/ruby_mini/ruby_piggy.c
+++ b/board/ruby_mini/ruby_piggy.c
@@ -57,7 +57,7 @@
extern unsigned int early_flash_config_end;
unsigned int *pin;
unsigned int *pout;
- int rc;
+ int __attribute__((unused)) rc;
unsigned long decompression_addr = RUBY_SRAM_BEGIN + TEXT_BASE_OFFSET_CHILD;
unsigned long uncompressed_size;
diff --git a/common/Makefile b/common/Makefile
index 8a875ac..1d0cbd2 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -96,6 +96,7 @@
ifdef CONFIG_FPGA
COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o
endif
+COBJS-$(CONFIG_CMD_HNVRAM) += cmd_hnvram.o
COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o
COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o
COBJS-$(CONFIG_CMD_IMMAP) += cmd_immap.o
diff --git a/common/cmd_hnvram.c b/common/cmd_hnvram.c
new file mode 100644
index 0000000..52f0ae1
--- /dev/null
+++ b/common/cmd_hnvram.c
@@ -0,0 +1,266 @@
+/*
+ * cmd_hnvram.c -- makes hnvram contents available in u-boot.
+ * Loads contents of hnvram from spi flash and saves it
+ * to environment variables named HNV_<name>.
+ *
+ * Copyright (C) 2015 Google Inc.
+ * Author: Chris Gibson <cgibson@google.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <command.h>
+#include <common.h>
+#include <malloc.h>
+#include <spi_flash.h>
+
+/* local debug macro */
+#undef HNVRAM_DEBUG
+
+#ifdef HNVRAM_DEBUG
+#define DEBUG(fmt, args...) printf(fmt, ##args)
+#else
+#define DEBUG(fmt, args...)
+#endif /* HNVRAM_DEBUG */
+
+#define CONFIG_SF_DEFAULT_MODE SPI_MODE_3
+
+
+// Flash erase block size
+#define HNVRAM_BLOCKSIZE 0x00010000
+
+// Location in DRAM where hnvram variables are stored during boot
+// DRAM is 128 MB [0x80000000 - 0x88000000]
+// Store hnvram at 120 - 122 MB
+#define HNVRAM_DRAM_OFFSET 0x87800000
+
+// Where in flash does hnvram partition start
+#define HNVRAM_MTD_OFFSET 0x00200000
+
+// Total hnvram is 2MB with 4 partitions
+#define MAX_HNVRAM_SIZE 0x00200000
+
+#define HNVRAM_RO_SIZE 0x00100000
+#define HNVRAM_RW_SIZE 0x00040000
+#define HNVRAM_RWB_SIZE 0x00020000
+#define HNVRAM_RAW_FS_SIZE 0x00020000
+
+// B1 and B2 corresponding to RW_OFFSET and RWB_OFFSET
+#define HNVRAM_B1_OFFSET (HNVRAM_RO_SIZE)
+#define HNVRAM_B2_OFFSET (HNVRAM_RO_SIZE + HNVRAM_RW_SIZE)
+
+#define CMD_RET_SUCCESS 0
+#define CMD_RET_FAILURE 1
+#define CMD_RET_USAGE -1
+
+// These keys are stored in binary format for historical reasons
+const char *hnvram_binary_keys[] = {
+ "LOADER_VERSION",
+ "HDCP_KEY",
+ "DTCP_KEY",
+};
+
+static void *xmalloc(size_t size)
+{
+ void *p = NULL;
+ if (!(p = malloc(size))) {
+ printf("error: memory not allocated\n");
+ return 0;
+ }
+ memset(p, 0, size);
+ return p;
+}
+
+int read_u8(const char **p)
+{
+ int v = *(const unsigned char *)(*p);
+ *p += 1;
+ return v;
+}
+
+int read_s32_be(const char **p)
+{
+ const unsigned char *vp = (const unsigned char *)*p;
+ *p += 4;
+ return (vp[0]<<24) + (vp[1]<<16) + (vp[2]<<8) + vp[3];
+}
+
+int read_u16_le(const char **p)
+{
+ const unsigned char *up = (const unsigned char *)(*p);
+ *p += 2;
+ return up[0] + (up[1] << 8);
+}
+
+int is_hnvram_binary(const char *name, int namelen)
+{
+ int i;
+ for (i = 0; i < ARRAY_SIZE(hnvram_binary_keys); i++) {
+ const char *k = hnvram_binary_keys[i];
+ if ((int)strlen(k) == namelen && strncmp(k, name, namelen) == 0) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+char *encode_hex(const char *s, int len)
+{
+ char *optr, *out = xmalloc(len * 2 + 1);
+ for (optr = out; len > 0; len--) {
+ sprintf(optr, "%02x", read_u8(&s));
+ optr += 2;
+ }
+ return out;
+}
+
+char *encode_macaddr(const char *mac)
+{
+ int i;
+ char *out = xmalloc(6 * 2 + 5 + 2);
+ for (i = 0; i < 6; i++) {
+ sprintf(out + i * 3, "%02X:", read_u8(&mac));
+ }
+ out[6*2 + 5] = '\0';
+ return out;
+}
+
+static void _copy_setenv(const char *name, int namelen,
+ const char *val, int vallen)
+{
+ char *n, *v;
+ if (namelen + vallen < 128) {
+ n = xmalloc(4 + namelen + 1);
+ v = xmalloc(vallen + 1);
+ memcpy(n, "HNV_", 4);
+ memcpy(n + 4, name, namelen);
+ memcpy(v, val, vallen);
+ n[namelen+4] = 0;
+ v[vallen] = 0;
+ setenv(n, v);
+ free(n);
+ free(v);
+ } else {
+ DEBUG("ignoring oversized val: %.15s, vallen: %d\n", val, vallen);
+ }
+}
+
+static int _parse_hnvram(const char *buf, int len)
+{
+ // An hnvram structure. Format is a tag-length-value sequence of:
+ // [1 byte] type (1 for notdone, 0 for done)
+ // [4 bytes] record length
+ // [1 byte] key length
+ // [x bytes] key
+ // [4 bytes] value length
+ // [y bytes] value
+ int rectype, reclen, namelen, vallen;
+ int done = 0;
+ const char *name, *val, *p = buf;
+ while (p - buf <= len + 11) {
+ rectype = read_u8(&p);
+ if (rectype == 0x00) {
+ printf("done processing hnvram block!\n");
+ done = 1;
+ break;
+ }
+ if (rectype != 0x01) {
+ printf("error: hnvram invalid rectype %x\n", rectype);
+ return -1;
+ }
+
+ reclen = read_s32_be(&p);
+ if (reclen <= 6 || (p - buf) + reclen >= len) {
+ printf("error: hnvram invalid reclen %d\n", reclen);
+ return -1;
+ }
+ namelen = read_u8(&p);
+ if (namelen < 1 || (p - buf) + namelen >= len) {
+ printf("error: hnvram invalid namelen %d\n", namelen);
+ return -1;
+ }
+ name = p;
+ p += namelen;
+ vallen = read_s32_be(&p);
+ if (vallen < 0 || (p - buf) + vallen >= len) {
+ printf("error: hnvram invalid vallen %d\n", vallen);
+ return -1;
+ }
+ val = p;
+ p += vallen;
+ if (vallen == 6 && namelen >= 8 &&
+ strncmp("MAC_ADDR", name, 8) == 0) {
+ char *macstr = encode_macaddr(val);
+ _copy_setenv(name, namelen, macstr, strlen(macstr));
+ free(macstr);
+ } else if (is_hnvram_binary(name, namelen)) {
+ char *hexstr = encode_hex(val, vallen);
+ _copy_setenv(name, namelen, hexstr, strlen(hexstr));
+ free(hexstr);
+ } else {
+ _copy_setenv(name, namelen, val, vallen);
+ }
+ }
+ if (!done) {
+ printf("error: failed to find final hnvram record?\n");
+ return -1;
+ }
+ return 0;
+}
+
+#if defined(CONFIG_CMD_HNVRAM)
+int do_hnvram(void) {
+ char command[60];
+ sprintf(command, "spi_flash read 0x%x 0x%x 0x%x", HNVRAM_MTD_OFFSET, HNVRAM_DRAM_OFFSET, MAX_HNVRAM_SIZE);
+ int ret = run_command(command, 0);
+
+ if (ret) {
+ printf("failed reading from spi-flash at addr: %d\n", HNVRAM_MTD_OFFSET);
+ return ret;
+ }
+
+ char *buf = HNVRAM_DRAM_OFFSET;
+
+ // Next step: Seek to different parts of the buffer that contain the
+ // first, second, and third sections of hnvram.
+ if (_parse_hnvram(buf, HNVRAM_BLOCKSIZE) != 0) {
+ printf("failed parsing hnvram at offset: 0x%p\n", buf);
+ return -1;
+ }
+ if (_parse_hnvram(buf+HNVRAM_B1_OFFSET, HNVRAM_BLOCKSIZE) != 0) {
+ printf("failed parsing hnvram at offset: 0x%p\n", buf+HNVRAM_B1_OFFSET);
+ return -1;
+ }
+ if (_parse_hnvram(buf+HNVRAM_B2_OFFSET, HNVRAM_BLOCKSIZE) != 0) {
+ printf("failed parsing hnvram at offset: 0x%p\n", buf+HNVRAM_B2_OFFSET);
+ return -1;
+ }
+
+ free(buf);
+ return CMD_RET_SUCCESS;
+}
+
+static int do_hnvram_cmd(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[]) {
+ return do_hnvram();
+}
+
+U_BOOT_CMD(
+ hnvram, 1, 0, do_hnvram_cmd,
+ "load hnvram from flash",
+ "\n"
+ "load hnvram from flash into environment vars named HNV_<name>\n"
+ );
+#endif /* CONFIG_CMD_HNVRAM */
diff --git a/common/console.c b/common/console.c
index 2add047..e60bcbd 100644
--- a/common/console.c
+++ b/common/console.c
@@ -295,6 +295,10 @@
int getc(void)
{
+#ifdef CONFIG_DISABLE_INPUT
+ return 0;
+#endif
+
#ifdef CONFIG_DISABLE_CONSOLE
if (gd->flags & GD_FLG_DISABLE_CONSOLE)
return 0;
@@ -311,6 +315,10 @@
int tstc(void)
{
+#ifdef CONFIG_DISABLE_INPUT
+ return 0;
+#endif
+
#ifdef CONFIG_DISABLE_CONSOLE
if (gd->flags & GD_FLG_DISABLE_CONSOLE)
return 0;
diff --git a/common/main.c b/common/main.c
index f2f3d6e..3d4b3b5 100755
--- a/common/main.c
+++ b/common/main.c
@@ -47,7 +47,7 @@
/*
* Board-specific Platform code can reimplement show_boot_progress () if needed
*/
-void inline __show_boot_progress (int val) {}
+void __show_boot_progress (int val) {}
void show_boot_progress (int val) __attribute__((weak, alias("__show_boot_progress")));
#if defined(CONFIG_BOOT_RETRY_TIME) && defined(CONFIG_RESET_TO_RETRY)
diff --git a/config.mk b/config.mk
index 68b4906..e163ba8 100644
--- a/config.mk
+++ b/config.mk
@@ -60,10 +60,10 @@
# PLATFORM_CPPFLAGS+= -D__ARC__ -mA7 -mno-sdata -O0 -g -mno-volatile-cache -fomit-frame-pointer
# Enable optimization. Disable cache bypassing for "volatile" references.
# It is bad design to enable cache bypassing for "volatile" references - readX()/writeX() has to be used.
- PLATFORM_CPPFLAGS_PATH = -I$(OBJTREE)/../common -I$(OBJTREE)/../include/qtn
+ PLATFORM_CPPFLAGS_PATH = -I$(OBJTREE)/quantenna/common -I$(OBJTREE)/quantenna/include/qtn
PLATFORM_CPPFLAGS += -D__ARC__ -mA7 -mno-sdata -Os -g -mvolatile-cache -fomit-frame-pointer $(PLATFORM_CPPFLAGS_PATH)
endif
-HOST_CFLAGS += -I$(OBJTREE)/../common
+HOST_CFLAGS += -I$(OBJTREE)/quantenna/common
#########################################################################
#
@@ -157,6 +157,7 @@
endif
CFLAGS += $(call cc-option,-fno-stack-protector)
+CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks)
# avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9)
# this option have to be placed behind -Wall -- that's why it is here
diff --git a/helper.mk b/helper.mk
index 751519e..70648d9 100644
--- a/helper.mk
+++ b/helper.mk
@@ -3,6 +3,6 @@
define build-mini-ldmap
@mkdir -p ${@D}
- $(CPP) -D__ASSEMBLY__ -I../common -Iinclude $1 $< | grep -vE '^\#' > $@
+ $(CPP) -D__ASSEMBLY__ -Iquantenna/common -Iinclude $1 $< | grep -vE '^\#' > $@
endef
diff --git a/include/asm-arc/arch-arc/arasan_emac_ahb.h b/include/asm-arc/arch-arc/arasan_emac_ahb.h
index 8990890..e3315a7 100755
--- a/include/asm-arc/arch-arc/arasan_emac_ahb.h
+++ b/include/asm-arc/arch-arc/arasan_emac_ahb.h
@@ -36,7 +36,7 @@
/* All the common defines for the Ethernet controller */
#include <config.h>
-#include "../../../../common/ruby_arasan_emac_ahb.h"
+#include "../../../quantenna/common/ruby_arasan_emac_ahb.h"
#ifndef __ASSEMBLY__
diff --git a/include/configs/ruby.h b/include/configs/ruby.h
index 882682c..ffda11b 100644
--- a/include/configs/ruby.h
+++ b/include/configs/ruby.h
@@ -33,6 +33,7 @@
/* Commands */
#define CONFIG_CMD_CONSOLE
#define CONFIG_CMD_ECHO
+#define CONFIG_CMD_HNVRAM
#define CONFIG_CMD_MEMORY
#define CONFIG_CMD_MISC
#define CONFIG_CMD_RUN
@@ -168,7 +169,7 @@
#define CONFIG_NET_MULTI 1
#define CONFIG_ARASAN_GBE 1
#define CONFIG_IPADDR 192.168.1.100
- #define CONFIG_SERVERIP 192.168.1.150
+ #define CONFIG_SERVERIP 192.168.1.2
#define CONFIG_ETHADDR 30:46:9a:25:be:e4
#define CONFIG_BOOTFILE "topaz-linux.lzma.img"
#ifndef PLATFORM_NOSPI
diff --git a/include/configs/ruby_mini.h b/include/configs/ruby_mini.h
index d14332d..2071c40 100644
--- a/include/configs/ruby_mini.h
+++ b/include/configs/ruby_mini.h
@@ -36,6 +36,7 @@
#ifndef TOPAZ_EP_MINI_UBOOT
/* Commands */
+#define CONFIG_CMD_HNVRAM
#define CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_INTR
diff --git a/piggy.mk b/piggy.mk
index 78a6458..3c368f6 100644
--- a/piggy.mk
+++ b/piggy.mk
@@ -1,6 +1,5 @@
include helper.mk
-include ../Make.toolchain
CFLAGS =
CC = $(CROSS_COMPILE)gcc
@@ -53,7 +52,7 @@
-nostdinc \
-mno-sdata -mvolatile-cache -mno-millicode \
-pipe \
- -Iinclude/ -Iboard/ruby/ -I../common/ -I../include/qtn/ \
+ -Iinclude/ -Iboard/ruby/ -Iquantenna/common/ -Iquantenna/include/qtn/ \
-isystem $(gccincdir) \
-DTEXT_BASE_OFFSET=$(TEXT_BASE_OFFSET_PARENT) \
-DTEXT_BASE_OFFSET_CHILD=$(TEXT_BASE_OFFSET_CHILD) \
@@ -88,7 +87,7 @@
lib_generic/vsprintf.o \
lib_generic/string.o
-LDFLAGS = -L $(tools_path)../lib/gcc/arc-linux-uclibc/4.2.1/ -lgcc
+LDFLAGS = -lgcc
endif
ifeq ($(TOPAZ_EP_MINI_UBOOT),1)
@@ -104,7 +103,7 @@
lib_generic/lzma/LzmaTools.o \
$(LZMA_LIB)
-LZMA = ../host/utilities/lzma
+LZMA = quantenna/host/utilities/lzma
LDMAP = $(BUILD_DIR)/u-boot-piggy.lds
%.lzma: %
diff --git a/qtn_tiny.mk b/qtn_tiny.mk
index a415801..c1a6ee4 100644
--- a/qtn_tiny.mk
+++ b/qtn_tiny.mk
@@ -5,7 +5,6 @@
#
include helper.mk
-include ../Make.toolchain
CFLAGS =
CC = $(CROSS_COMPILE)gcc
@@ -34,7 +33,7 @@
-nostdinc \
-mno-sdata -mvolatile-cache -mno-millicode \
-pipe \
- -Iboard/ruby/ -Iinclude/ -I../common/ -I../include/qtn/ \
+ -Iboard/ruby/ -Iinclude/ -Iquantenna/common/ -Iquantenna/include/qtn/ \
-isystem $(gccincdir) \
-DTEXT_BASE_OFFSET=$(UBOOT_TINY_TEXT_BASE_OFFSET) \
@@ -70,7 +69,7 @@
board/ruby_mini/ruby_mini_common.o \
board/ruby_mini/ruby_tiny.o
-LDFLAGS = -L $(tools_path)../lib/gcc/arc-linux-uclibc/4.2.1/ -lgcc
+LDFLAGS = -lgcc
LDMAP = $(BUILD_DIR)/u-boot-$(TARGET).lds
diff --git a/quantenna/Make.toolchain b/quantenna/Make.toolchain
deleted file mode 100644
index f23b873..0000000
--- a/quantenna/Make.toolchain
+++ /dev/null
@@ -1,6 +0,0 @@
-tools_path := /usr/local/ARC/gcc/bin/
-target_prefix := arc-linux-uclibc-
-compile_prefix := ${tools_path}${target_prefix}
-CROSS_COMPILE := ${compile_prefix}
-ARCH := arc
-
diff --git a/quantenna/common/ruby_arasan_emac_ahb.h b/quantenna/common/ruby_arasan_emac_ahb.h
index 2d36410..e31bbf4 100755
--- a/quantenna/common/ruby_arasan_emac_ahb.h
+++ b/quantenna/common/ruby_arasan_emac_ahb.h
@@ -27,7 +27,7 @@
#include <include/qtn/amber.h>
#endif
-extern __inline__ void __mydelay(unsigned long loops)
+static __inline__ void __mydelay(unsigned long loops)
{
__asm__ __volatile__ ( "1: \n\t"
"sub.f %0, %1, 1\n\t"