1 /* 2 * (C) Copyright 2020-2023 Rockchip Electronics Co., Ltd. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <debug_uart.h> 9 #include <malloc.h> 10 #include <mmc.h> 11 #include <stdlib.h> 12 #include <scsi.h> 13 14 DECLARE_GLOBAL_DATA_PTR; 15 16 struct bootdev_list { 17 u32 if_type; 18 u8 devnum; 19 u8 iomux_routing; 20 }; 21 22 #if CONFIG_IS_ENABLED(ROCKCHIP_RK3588) 23 static const struct bootdev_list dev_list[] = { 24 {IF_TYPE_MMC, 0, 0}, 25 {IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */ 26 {IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI M0 */ 27 {IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI M1 */ 28 {IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI M2 */ 29 {IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI M0 */ 30 {IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI M1 */ 31 {IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI M2 */ 32 }; 33 #elif CONFIG_IS_ENABLED(ROCKCHIP_RK3576) 34 static const struct bootdev_list dev_list[] = { 35 {IF_TYPE_SCSI, 0, 0}, 36 {IF_TYPE_MMC, 0, 0}, 37 {IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */ 38 {IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI0 M0 */ 39 {IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI1 M0 */ 40 {IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI1 M1 */ 41 {IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI0 M0 */ 42 {IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI1 M0 */ 43 {IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI1 M0 */ 44 }; 45 #else 46 static const struct bootdev_list dev_list[] = { 47 {IF_TYPE_MMC, 0, 0}, 48 {IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */ 49 {IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND */ 50 {IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR */ 51 {IF_TYPE_RKNAND, 0, 0}, 52 }; 53 #endif 54 55 static struct blk_desc *boot_blk_desc; 56 struct blk_desc *rockchip_get_bootdev(void) 57 { 58 return boot_blk_desc; 59 } 60 61 __weak void board_set_iomux(enum if_type if_type, int devnum, int routing) 62 { 63 } 64 65 struct blk_desc *usbplug_blk_get_devnum_by_type(enum if_type if_type, int devnum) 66 { 67 struct blk_desc *blk_desc = NULL; 68 u8 iomux_routing; 69 int i = 0; 70 71 for (i = 0; i < ARRAY_SIZE(dev_list); i++) { 72 if (if_type != dev_list[i].if_type || devnum != dev_list[i].devnum) 73 continue; 74 iomux_routing = dev_list[i].iomux_routing; 75 switch (if_type) { 76 #ifdef CONFIG_MMC 77 case IF_TYPE_MMC: 78 board_set_iomux(if_type, devnum, iomux_routing); 79 mmc_initialize(gd->bd); 80 break; 81 #endif 82 case IF_TYPE_MTD: 83 board_set_iomux(if_type, devnum, iomux_routing); 84 break; 85 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS)) 86 case IF_TYPE_SCSI: 87 scsi_scan(true); 88 break; 89 #endif 90 default: 91 printf("Bootdev 0x%x is not support\n", if_type); 92 return NULL; 93 } 94 95 printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 96 blk_desc = blk_get_devnum_by_type(if_type, devnum); 97 if (blk_desc) 98 break; 99 } 100 101 boot_blk_desc = blk_desc; 102 103 return blk_desc; 104 } 105 106 static char *bootdev_rockusb_cmd(void) 107 { 108 struct blk_desc *blk_desc = NULL; 109 u32 if_type = IF_TYPE_UNKNOWN; 110 u8 devnum, iomux_routing; 111 char *cmd; 112 int i = 0; 113 114 for (i = 0; i < ARRAY_SIZE(dev_list); i++) { 115 if_type = dev_list[i].if_type; 116 devnum = dev_list[i].devnum; 117 iomux_routing = dev_list[i].iomux_routing; 118 switch (if_type) { 119 #ifdef CONFIG_MMC 120 case IF_TYPE_MMC: 121 board_set_iomux(if_type, devnum, iomux_routing); 122 mmc_initialize(gd->bd); 123 break; 124 #endif 125 case IF_TYPE_MTD: 126 board_set_iomux(if_type, devnum, iomux_routing); 127 break; 128 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS)) 129 case IF_TYPE_SCSI: 130 scsi_scan(true); 131 break; 132 #endif 133 default: 134 printf("Bootdev 0x%x is not support\n", if_type); 135 return NULL; 136 } 137 138 printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 139 blk_desc = blk_get_devnum_by_type(if_type, devnum); 140 if (blk_desc) 141 break; 142 } 143 144 boot_blk_desc = blk_desc; 145 146 if (!if_type) { 147 printf("No boot device\n"); 148 return NULL; 149 } 150 151 printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum); 152 153 cmd = malloc(32); 154 if (!cmd) 155 return NULL; 156 157 snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum); 158 159 return cmd; 160 } 161 162 int board_init(void) 163 { 164 return run_command(bootdev_rockusb_cmd(), 0); 165 } 166 167