define prowl partition layout

includes
fixes for quantenna file storage in u-boot env:
  - u-boot env capped at 24K
  - offset to quantenna files should start at 24K, not 4K

fixes for default environment
  - wire up SRAM based default environment
  - allow saving of default environment to flash
  - environment changes before first saveenv+reset are persisted

bake default gfrg240 board configuration into code, so that a
board with no environment comes up and is able to configure the
hardware.

Change-Id: I24eaa2dc5512286a79488b41087d4d0a799786d7
diff --git a/board/ruby/cmd_qtnboard.c b/board/ruby/cmd_qtnboard.c
index 2e5381a..32a28f5 100644
--- a/board/ruby/cmd_qtnboard.c
+++ b/board/ruby/cmd_qtnboard.c
@@ -41,6 +41,25 @@
 
 static const char * const type2name[] = BOARD_CFG_FIELD_NAMES;
 
+#ifdef GFRG240
+static board_cfg_t	g_default_board_cfg = {
+	.bc_board_id	= QTN_RUBY_UNIVERSAL_BOARD_ID,
+	.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,
+	};
+#else
 static board_cfg_t	g_default_board_cfg = {
 	.bc_board_id	= QTN_RUBY_UNIVERSAL_BOARD_ID,
 	.bc_name	= "default board",
@@ -56,6 +75,7 @@
 	.bc_uart1	= UART1_NOT_IN_USE,
 	.bc_rgmii_timing = CONFIG_ARCH_RGMII_DEFAULT,
 	};
+#endif /* #ifdef GFRG240 */
 
 #ifndef TOPAZ_EP_MINI_UBOOT
 static uint32_t qtn_board_get_end(void)
@@ -388,8 +408,13 @@
 	uint16_t board_config_size = 0;
 	const uint8_t * const board_config = qtn_get_file_env_ptr(QTN_HW_BOARD_CFG_BIN, &board_config_size);
 
+#ifdef GFRG240
 	if (board_config == NULL) {
-
+		memcpy(&board_hw_config, &g_default_board_cfg, sizeof(board_cfg_t));
+		return SUCCESS;
+	}
+#endif
+	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/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/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..ea6efbb 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_RUBY_UNIVERSAL_BOARD_ID
diff --git a/quantenna/common/ruby_partitions.h b/quantenna/common/ruby_partitions.h
index 1af2bc5..0ebd4a0 100644
--- a/quantenna/common/ruby_partitions.h
+++ b/quantenna/common/ruby_partitions.h
@@ -28,6 +28,41 @@
 #ifndef __RUBY_PARTITIONS_H
 #define __RUBY_PARTITIONS_H
 
+#ifdef GFRG240
+#define UBOOT_TEXT_PARTITION_SIZE	0x0040000	/* 256K */
+#define UBOOT_ENV_PARTITION_SIZE	0x0010000	/* 64K */
+#define UBOOT_RESERVED_A_PARTITION_SIZE	0x0030000	/* 192K */
+#define UBOOT_VENDOR_PARTITION_SIZE	0x0080000	/* 512K */
+#define UBOOT_RESERVED_B_PARTITION_SIZE	0x0100000	/* 1M */
+#define UBOOT_HNVRAM_PARTITION_SIZE	0x0200000	/* 2M */
+#define UBOOT_KERNEL_PARTITION_SIZE	0x1C00000	/* 28M (x2) */
+#define UBOOT_DATA_PARTITION_SIZE	0x0400000	/* 4M */
+
+#define CONFIG_ENV_OFFSET		0x0040000	/* offset of uboot environment */
+
+#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 +132,8 @@
 
 #define IMG_SIZE_LIMIT_PLATFORM	IMG_SIZE_16M_FLASH_2_IMG
 
+#endif // #ifdef GFRG240
+
 #endif // #ifndef __RUBY_PARTITIONS_H