ryu: Add support to flash firmware using fastboot

BUG=chrome-os-partner:35861
BRANCH=None
TEST=Compiles successfully and fastboot flash firmware works fine.

Change-Id: I0a4742f41400118f0a087410a7cbcc0e11f7adf1
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://chromium-review.googlesource.com/250948
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Commit-Queue: Furquan Shaikh <furquan@chromium.org>
Tested-by: Furquan Shaikh <furquan@chromium.org>
Trybot-Ready: Furquan Shaikh <furquan@chromium.org>
diff --git a/src/board/rush_ryu/board.c b/src/board/rush_ryu/board.c
index ff6cdec..6ea3c8b 100644
--- a/src/board/rush_ryu/board.c
+++ b/src/board/rush_ryu/board.c
@@ -35,6 +35,7 @@
 #include "drivers/gpio/sysinfo.h"
 #include "drivers/gpio/tegra.h"
 #include "drivers/dma/tegra_apb.h"
+#include "drivers/flash/block_flash.h"
 #include "drivers/flash/spi.h"
 #include "drivers/power/sysinfo.h"
 #include "drivers/power/tps65913.h"
@@ -106,7 +107,11 @@
 	TegraSpi *spi4 = new_tegra_spi(0x7000da00, dma_controller,
 				       APBDMA_SLAVE_SL2B4);
 
-	flash_set_ops(&new_spi_flash(&spi4->ops)->ops);
+	SpiFlash *flash = new_spi_flash(&spi4->ops);
+
+	flash_set_ops(&flash->ops);
+
+	FlashBlockDev *fbdev = block_flash_register_nor(&flash->ops);
 
 	TegraI2c *cam_i2c = new_tegra_i2c((void *)0x7000c500, 3,
 					  (void *)CLK_RST_U_RST_SET,
@@ -139,9 +144,12 @@
 	list_insert_after(&emmc->mmc.ctrlr.list_node,
 			  &fixed_block_dev_controllers);
 
-#if CONFIG_FASTBOOT_MODE
-	fb_fill_bdev_list(MMC_BDEV, &emmc->mmc.ctrlr);
-#endif
+	/* Fill in fastboot related information */
+	BlockDevCtrlr *bdev_arr[BDEV_COUNT] = {
+		[FLASH_BDEV] = &fbdev->ctrlr,
+		[MMC_BDEV] = &emmc->mmc.ctrlr,
+	};
+	fill_fb_info(bdev_arr);
 
 	/* Careful: the EHCI base is at offset 0x100 from the SoC's IP base */
 	UsbHostController *usbd = new_usb_hc(EHCI, 0x7d000100);
diff --git a/src/board/rush_ryu/fastboot.c b/src/board/rush_ryu/fastboot.c
index eee475a..29e9470 100644
--- a/src/board/rush_ryu/fastboot.c
+++ b/src/board/rush_ryu/fastboot.c
@@ -30,7 +30,7 @@
 
 struct bdev_info fb_bdev_list[BDEV_COUNT] = {
 	[MMC_BDEV] = {"mmc", NULL, NULL},
-	/* [FLASH_BDEV] = {"flash", NULL, NULL}, */
+	[FLASH_BDEV] = {"flash", NULL, NULL},
 };
 
 size_t fb_bdev_count = ARRAY_SIZE(fb_bdev_list);
@@ -59,6 +59,7 @@
 	PART_GPT("persistent", "ext4", BDEV_ENTRY(MMC_BDEV), GPT_TYPE(LINUX_FS),
 		 9),
 	PART_NONGPT("gpt", "ext4", BDEV_ENTRY(MMC_BDEV), 1, 33),
+	PART_NONGPT("firmware", NULL, BDEV_ENTRY(FLASH_BDEV), 0, 0),
 };
 
 size_t fb_part_count = ARRAY_SIZE(fb_part_list);
@@ -97,3 +98,13 @@
 	dc_usb_initialize();
 	*udc = chipidea_init(dd);
 }
+
+void fill_fb_info(BlockDevCtrlr *bdev_ctrlr_arr[BDEV_COUNT])
+{
+	int i;
+
+	for (i = 0; i < BDEV_COUNT; i++)
+		fb_fill_bdev_list(i, bdev_ctrlr_arr[i]);
+	fb_fill_part_list("firmware", 0, lib_sysinfo.spi_flash.size /
+			  lib_sysinfo.spi_flash.sector_size);
+}
diff --git a/src/board/rush_ryu/fastboot.h b/src/board/rush_ryu/fastboot.h
index 24e2c6a..423eb7b 100644
--- a/src/board/rush_ryu/fastboot.h
+++ b/src/board/rush_ryu/fastboot.h
@@ -24,6 +24,13 @@
 #define __BOARD_RUSH_RYU_FASTBOOT_H__
 
 #include "config.h"
+#include "drivers/storage/blockdev.h"
+
+typedef enum {
+	MMC_BDEV,
+	FLASH_BDEV,
+	BDEV_COUNT,
+}bdev_t;
 
 #if CONFIG_FASTBOOT_MODE
 
@@ -31,12 +38,12 @@
 #include "fastboot/fastboot.h"
 #include "fastboot/udc.h"
 
-typedef enum {
-	MMC_BDEV,
-	/* FLASH_BDEV, */
-	BDEV_COUNT,
-}bdev_t;
+void fill_fb_info(BlockDevCtrlr *bdev_ctrlr_arr[BDEV_COUNT]);
 
-#endif
+#else
+
+static inline void fill_fb_info(BlockDevCtrlr *bdev_ctrlr_arr[BDEV_COUNT]) {}
+
+#endif /* CONFIG_FASTBOOT_MODE */
 
 #endif /* __BOARD_RUSH_RYU_FASTBOOT_H__ */