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