Merge "qsr1000: Allow uboot to handle both Image Formats"
diff --git a/board/ruby/cmd_qtnboard.c b/board/ruby/cmd_qtnboard.c
index 2e5381a..2d2bc8d 100644
--- a/board/ruby/cmd_qtnboard.c
+++ b/board/ruby/cmd_qtnboard.c
@@ -389,7 +389,6 @@
const uint8_t * const board_config = qtn_get_file_env_ptr(QTN_HW_BOARD_CFG_BIN, &board_config_size);
if (board_config == NULL) {
-
if (qtn_get_emac_set() < 0) {
return FAIL;
}
diff --git a/board/ruby/cmd_qtnboot.c b/board/ruby/cmd_qtnboot.c
index 4b63a4c..e9e802c 100644
--- a/board/ruby/cmd_qtnboot.c
+++ b/board/ruby/cmd_qtnboot.c
@@ -10,6 +10,7 @@
#define BUFSIZE 256
+#ifndef GFRG240
static int qtnboot_check(char *buf,
unsigned long flash_size, unsigned long sector_size,
unsigned long safety_addr, unsigned long safety_size,
@@ -167,20 +168,6 @@
"${" SAFETY_IMG_SIZE_ARG "} and ${" LIVE_IMG_SIZE_ARG "}\n"
);
-int _run(const char *function_name, const char *fmt, ...)
-{
- va_list args;
- char cmdbuf[BUFSIZE];
-
- va_start(args, fmt);
- vsprintf(cmdbuf, fmt, args);
- va_end(args);
-
- printf("%s: %s\n", function_name, cmdbuf);
-
- return run_command(cmdbuf, 0);
-}
-
int do_qtnboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
unsigned long safety_addr = 0;
@@ -276,7 +263,21 @@
"If env variable 'bootselect' is 1, boot from image at safety address;\n"
"Otherwise boot from image at live address\n"
);
+#endif /* ifndef GFRG240 */
+int _run(const char *function_name, const char *fmt, ...)
+{
+ va_list args;
+ char cmdbuf[BUFSIZE];
+
+ va_start(args, fmt);
+ vsprintf(cmdbuf, fmt, args);
+ va_end(args);
+
+ printf("%s: %s\n", function_name, cmdbuf);
+
+ return run_command(cmdbuf, 0);
+}
int do_setgpio(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
diff --git a/board/ruby/pcie.c b/board/ruby/pcie.c
index 861ff97..351173f 100755
--- a/board/ruby/pcie.c
+++ b/board/ruby/pcie.c
@@ -341,6 +341,42 @@
}
#ifndef TOPAZ_EP_MINI_UBOOT
+#ifdef GFRG240
+static void set_tiny_mtdparts(void)
+{
+ char mtdparts[BUFSIZE];
+
+ sprintf(mtdparts, "spi_flash:"
+ "%dk(" MTD_PARTNAME_UBOOT_BIN "),"
+ "%dk(" MTD_PARTNAME_UBOOT_ENV "),"
+ "%dk(" MTD_PARTNAME_RESERVED_A "),"
+ "%dk(" MTD_PARTNAME_VENDOR "),"
+ "%dk(" MTD_PARTNAME_RESERVED_B "),"
+ "%dk(" MTD_PARTNAME_HNVRAM "),"
+ "%dk(" MTD_PARTNAME_KERNEL0 "),"
+ "%dk(" MTD_PARTNAME_KERNEL1 "),"
+ "-(" MTD_PARTNAME_DATA ")",
+
+ UBOOT_TEXT_PARTITION_SIZE / 1024,
+ UBOOT_ENV_PARTITION_SIZE / 1024,
+ UBOOT_RESERVED_A_PARTITION_SIZE / 1024,
+ UBOOT_VENDOR_PARTITION_SIZE / 1024,
+ UBOOT_RESERVED_B_PARTITION_SIZE / 1024,
+ UBOOT_HNVRAM_PARTITION_SIZE / 1024,
+ UBOOT_KERNEL_PARTITION_SIZE / 1024,
+ UBOOT_KERNEL_PARTITION_SIZE / 1024
+ );
+
+ setenv("mtdparts", mtdparts);
+}
+
+static int prepare_tiny_bootargs(void)
+{
+ set_tiny_mtdparts();
+
+ return 0;
+}
+#else // #ifdef GFRG240
static void set_tiny_mtdparts(unsigned long linux_safety_size, unsigned long linux_live_size)
{
char mtdparts[BUFSIZE];
@@ -373,6 +409,7 @@
return 0;
}
+#endif // #ifdef GFRG240
static void set_tiny_bootargs(void)
{
diff --git a/board/ruby/ruby.c b/board/ruby/ruby.c
index c1e0c5c..3d6947b 100644
--- a/board/ruby/ruby.c
+++ b/board/ruby/ruby.c
@@ -199,7 +199,7 @@
}
}
#ifdef CONFIG_CMD_HNVRAM
- RUN("hnvram");
+ RUN("hnvram load");
#endif
return 0;
}
diff --git a/board/ruby/spi_flash.c b/board/ruby/spi_flash.c
index 3434892..66e0fbc 100644
--- a/board/ruby/spi_flash.c
+++ b/board/ruby/spi_flash.c
@@ -30,7 +30,11 @@
#include <asm/errno.h>
#define SPI_PAGE_SIZE 256
-#define ENV_BASE_SIZE (CONFIG_ENV_BASE_SIZE - ENV_HEADER_SIZE)
+/*
+ * quantenna stores data in the uboot env partition hidden from setenv.
+ * the environment space is artificially shrunk to give them this space.
+ */
+#define ENV_SHRUNK_SIZE (CONFIG_ENV_SHRUNK_SIZE - ENV_HEADER_SIZE)
#if defined(FLASH_SUPPORT_256KB)
#define SPI_FLASH_256KB_SIZE (256 * 1024)
@@ -38,7 +42,7 @@
#define SPI_FLASH_UBOOT_ADDR 0
-#define SPI_FLASH_FULL_UBOOT_SIZE (128*1024) /* Normal Ruby u-boot partition is just under 128k */
+#define SPI_FLASH_FULL_UBOOT_SIZE UBOOT_TEXT_PARTITION_SIZE
#define SPI_FLASH_MINI_UBOOT_SIZE (20*1024) /* Ruby mini u-boot is 20k */
#define SPI_FLASH_TEST 1
@@ -1038,7 +1042,7 @@
{
u32 crc, len, ret_len, new, addr;
uchar buf[64];
- u32 env_size[] = {ENV_SIZE, F64K_ENV_PARTITION_SIZE - ENV_HEADER_SIZE, ENV_BASE_SIZE};
+ u32 env_size[] = {ENV_SIZE, ENV_SHRUNK_SIZE};
u32 idx = 0;
len = sizeof(crc);
@@ -1079,11 +1083,14 @@
int env_init(void)
{
u32 env_addr;
+#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
u32 env_addr_backup, env_end;
+#endif
if (gd->env_valid == 0) {
env_addr = spi_flash_env_addr(0);
+#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
/* No ENV & CAL backup for mini-uboot */
if (spi_flash_uboot_size() == SPI_FLASH_FULL_UBOOT_SIZE) {
#if defined(FLASH_SUPPORT_256KB)
@@ -1097,17 +1104,20 @@
env_addr_backup = 0;
env_end = spi_flash_env_addr(1);
}
+#endif
if (env_verify(env_addr) == 0) {
printf("Valid CRC found in flash restoring env...\n");
// gd->env_addr = offsetof(env_t,data); - malloced later...
gd->env_valid = 1;
+#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
} else if (env_end <= IMAGES_START_ADDR
&& env_end < spi_flash_size()
&& env_verify(env_addr_backup) == 0) {
printf("Valid CRC found in flash - restoring backup...\n");
// gd->env_addr = offsetof(env_t,data); - malloced later...
gd->env_valid = 2;
+#endif
} else {
printf("Invalid CRC in flash using default env...\n");
gd->env_addr = (ulong) &default_environment[0];
diff --git a/common/cmd_hnvram.c b/common/cmd_hnvram.c
index 52f0ae1..2f4d308 100644
--- a/common/cmd_hnvram.c
+++ b/common/cmd_hnvram.c
@@ -25,6 +25,7 @@
#include <common.h>
#include <malloc.h>
#include <spi_flash.h>
+#include <asm/byteorder.h>
/* local debug macro */
#undef HNVRAM_DEBUG
@@ -221,7 +222,7 @@
}
#if defined(CONFIG_CMD_HNVRAM)
-int do_hnvram(void) {
+int do_hnvram_load(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);
@@ -248,19 +249,97 @@
return -1;
}
- free(buf);
+ return CMD_RET_SUCCESS;
+}
+
+int do_hnvram_init(char *val) {
+ // Erase entire partition
+ char command[60];
+ sprintf(command, "spi_flash erase 0x%x 0x%x", HNVRAM_MTD_OFFSET, MAX_HNVRAM_SIZE);
+ int ret = run_command(command, 0);
+
+ if (ret) {
+ printf("failed to erase hnvram partition\n");
+ return ret;
+ }
+
+ char key[] = "PLATFORM_NAME";
+ int val_len = strlen(val);
+ // size variable should fit in one byte
+ if (val_len < 1 || 255 < val_len) {
+ printf("Intial value for %s has bad size: %d", key, val_len);
+ return CMD_RET_FAILURE;
+ }
+ // +5 to count key length (1) and record length (4) bytes
+ int rec_len = sizeof(key) + val_len + 5;
+
+ // Use 2MB of (hopefully) free DRAM
+ char *buf = HNVRAM_DRAM_OFFSET;
+ memset(buf, 0x00, MAX_HNVRAM_SIZE);
+
+ // Write platform_name to RW section
+ int i = HNVRAM_B1_OFFSET;
+
+ // Record start
+ buf[i++] = 0x01;
+
+ // Record length
+ int nbyte_order = htonl(rec_len); // hnvram expects big endian
+ memcpy(buf + i, &nbyte_order, sizeof(nbyte_order));
+ i += sizeof(nbyte_order);
+
+ // Key length
+ buf[i++] = sizeof(key);
+
+ // Key
+ memcpy(buf + i, &key, sizeof(key));
+ i += sizeof(key);
+
+ // Val length
+ nbyte_order = htonl(val_len);
+ memcpy(buf + i, &nbyte_order, sizeof(nbyte_order));
+ i += sizeof(nbyte_order);
+
+ // Val
+ memcpy(buf + i, val, val_len);
+
+ sprintf(command, "spi_flash write 0x%x 0x%p 0x%x", HNVRAM_MTD_OFFSET, buf, MAX_HNVRAM_SIZE);
+ ret = run_command(command, 0);
+
+ if (ret) {
+ printf("failed to write init to hnvram partition\n");
+ return ret;
+ }
+
+ // Load platform_name into environment variables
+ do_hnvram_load();
+
return CMD_RET_SUCCESS;
}
static int do_hnvram_cmd(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[]) {
- return do_hnvram();
+ if (argc == 2 && strcmp(argv[1], "load") == 0) {
+ return do_hnvram_load();
+ } else if (argc == 2 && strcmp(argv[1], "init") == 0) {
+ return do_hnvram_init("GFRG240");
+ } else if (argc == 3 && strcmp(argv[1], "init") == 0) {
+ return do_hnvram_init(argv[2]);
+ } else {
+ printf("hnvram - incorrect usage. Please use one of:\n");
+ printf("hnvram load\n");
+ printf("hnvram init <model>\n");
+ return CMD_RET_USAGE;
+ }
}
U_BOOT_CMD(
- hnvram, 1, 0, do_hnvram_cmd,
- "load hnvram from flash",
+ hnvram, 3, 0, do_hnvram_cmd,
+ "HNVRAM key-val storage on flash",
"\n"
- "load hnvram from flash into environment vars named HNV_<name>\n"
+ "hnvram load - reads all variables from flash partition and"
+ " places into environment vars as HNV_<name>"
+ "hnvram init [model] - zeros hnvram and writes PLATFORM_NAME=<model>"
+ " Uses GFRG240 by default if no arg given"
);
#endif /* CONFIG_CMD_HNVRAM */
diff --git a/common/env_common.c b/common/env_common.c
index f0ef16a..314ff5d 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -239,10 +239,14 @@
env_ptr->flags = 0xFF;
#endif
-#ifndef CONFIG_RUBY_BOARD
+ /*
+ * Switch the u-boot environment over to the copy we just
+ * placed into SRAM. Update the CRC, and mark it as valid
+ * so that we can write it out to the flash.
+ */
+ gd->env_addr = env_ptr->data;
env_crc_update ();
gd->env_valid = 1;
-#endif
}
void env_relocate (void)
diff --git a/include/environment.h b/include/environment.h
index 5a91b79..32e70c5 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -109,7 +109,7 @@
#endif
-#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
+#define ENV_SIZE (CONFIG_ENV_SHRUNK_SIZE - ENV_HEADER_SIZE)
typedef struct environment_s {
uint32_t crc; /* CRC32 over data bytes */
diff --git a/quantenna/common/current_platform.h b/quantenna/common/current_platform.h
index e8e3e34..e54dda5 100644
--- a/quantenna/common/current_platform.h
+++ b/quantenna/common/current_platform.h
@@ -7,6 +7,8 @@
#define ARC_HW_REV_NEEDS_TLBMISS_FIX
#define TOPAZ_SUPPORT_UMM 1
#define TOPAZ_SUPPORT_256MB_DDR 1
-#define FLASH_SUPPORT_64KB
#define WPA_TKIP_SUPPORT 0
#define SIGMA_TESTBED_SUPPORT 0
+#define GFRG240 1
+
+#define PLATFORM_DEFAULT_BOARD_ID QTN_TOPAZ_PROWL
diff --git a/quantenna/common/ruby_board_db.h b/quantenna/common/ruby_board_db.h
index da7883d..b44069f 100644
--- a/quantenna/common/ruby_board_db.h
+++ b/quantenna/common/ruby_board_db.h
@@ -1163,6 +1163,21 @@
.bc_emac0 = EMAC_IN_USE | EMAC_PHY_FORCE_1000MB | EMAC_PHY_NOT_IN_USE | EMAC_PHY_RTL8363SB_P0, \
.bc_wifi_hw = QTN_TPZ_SE5003L1, \
.bc_rgmii_timing = CONFIG_ARCH_RGMII_NODELAY, \
+ } ,{ /* 1232 */ \
+ .bc_board_id = QTN_TOPAZ_PROWL, \
+ .bc_name = "gfrg240", \
+ .bc_ddr_type = DDR3_16_WINBOND, \
+ .bc_ddr_speed = DDR3_500MHz, \
+ .bc_ddr_size = DDR_256MB, \
+ .bc_emac0 = EMAC_IN_USE, \
+ .bc_emac1 = (EMAC_IN_USE | EMAC_PHY_FORCE_1000MB | EMAC_PHY_NOT_IN_USE | EMAC_PHY_AR8327), \
+ .bc_phy0_addr = 0x4, \
+ .bc_phy1_addr = EMAC_PHY_ADDR_SCAN, \
+ .bc_spi1 = SPI1_NOT_IN_USE, \
+ .bc_wifi_hw = QTN_TPZ_SKY85703, \
+ .bc_uart1 = UART1_NOT_IN_USE, \
+ .bc_pcie = PCIE_ROOTCOMPLEX, \
+ .bc_rgmii_timing = 0x84848484, \
} \
}
diff --git a/quantenna/common/ruby_partitions.h b/quantenna/common/ruby_partitions.h
index 1af2bc5..7d688fe 100644
--- a/quantenna/common/ruby_partitions.h
+++ b/quantenna/common/ruby_partitions.h
@@ -28,6 +28,50 @@
#ifndef __RUBY_PARTITIONS_H
#define __RUBY_PARTITIONS_H
+#ifdef GFRG240
+#define UBOOT_TEXT_PARTITION_SIZE 0x00040000 /* 256K */
+#define UBOOT_ENV_PARTITION_SIZE 0x00010000 /* 64K */
+#define UBOOT_RESERVED_A_PARTITION_SIZE 0x00030000 /* 192K */
+#define UBOOT_VENDOR_PARTITION_SIZE 0x00080000 /* 512K */
+#define UBOOT_RESERVED_B_PARTITION_SIZE 0x00100000 /* 1M */
+#define UBOOT_HNVRAM_PARTITION_SIZE 0x00200000 /* 2M */
+#define UBOOT_KERNEL_PARTITION_SIZE 0x01C00000 /* 28M (x2) */
+#define UBOOT_DATA_PARTITION_SIZE 0x00400000 /* 4M */
+
+#define CONFIG_ENV_OFFSET 0x00040000 /* offset of uboot environment */
+
+#define UBOOT_PARTITION_OFFSET_KERNEL0 (UBOOT_TEXT_PARTITION_SIZE + \
+ UBOOT_ENV_PARTITION_SIZE + \
+ UBOOT_RESERVED_A_PARTITION_SIZE + \
+ UBOOT_VENDOR_PARTITION_SIZE + \
+ UBOOT_RESERVED_B_PARTITION_SIZE + \
+ UBOOT_HNVRAM_PARTITION_SIZE)
+#define UBOOT_PARTITION_OFFSET_KERNEL1 (UBOOT_PARTITION_OFFSET_KERNEL0 + \
+ UBOOT_KERNEL_PARTITION_SIZE)
+
+#define MTD_PARTNAME_UBOOT_BIN "uboot"
+#define MTD_PARTNAME_UBOOT_ENV "uboot_env"
+#define MTD_PARTNAME_RESERVED_A "reserved_a"
+#define MTD_PARTNAME_VENDOR "vendor"
+#define MTD_PARTNAME_RESERVED_B "reserved_b"
+#define MTD_PARTNAME_HNVRAM "hnvram"
+#define MTD_PARTNAME_KERNEL0 "kernel0"
+#define MTD_PARTNAME_KERNEL1 "kernel1"
+#define MTD_PARTNAME_DATA "data+ubi"
+
+/*
+ * quantenna stores files in the uboot env partition.
+ * limit the size of uboot environment to 24K, and allow
+ * quantenna file storage in the remaining 40K.
+*/
+#define CONFIG_ENV_SHRUNK_SIZE (24 * 1024) /* limited uboot environment */
+#define BOOT_CFG_DEF_START CONFIG_ENV_SHRUNK_SIZE /* qtn file starts after uboot-env */
+#define BOOT_CFG_SIZE (UBOOT_ENV_PARTITION_SIZE - CONFIG_ENV_SHRUNK_SIZE)
+#define BOOT_CFG_DATA_SIZE (UBOOT_ENV_PARTITION_SIZE - sizeof(u32))
+
+
+#else // #ifdef GFRG240
+
#define F64K_UBOOT_PIGGY_PARTITION_SIZE 0x5000
#if defined(FLASH_SUPPORT_256KB)
@@ -97,6 +141,8 @@
#define IMG_SIZE_LIMIT_PLATFORM IMG_SIZE_16M_FLASH_2_IMG
+#endif // #ifdef GFRG240
+
#endif // #ifndef __RUBY_PARTITIONS_H
diff --git a/quantenna/include/qtn/shared_defs_common.h b/quantenna/include/qtn/shared_defs_common.h
index ef55d8c..e106f60 100644
--- a/quantenna/include/qtn/shared_defs_common.h
+++ b/quantenna/include/qtn/shared_defs_common.h
@@ -126,6 +126,7 @@
#define QTN_TOPAZ_BB_BOARD 1229
#define QTN_TOPAZ_RF_BOARD 1230
#define QTN_TOPAZ_QHS840_5S1 1231
+#define QTN_TOPAZ_PROWL 1232
#define QTN_RUBY_AUTOCONFIG_ID 32768
#define QTN_RUBY_UNIVERSAL_BOARD_ID 65535