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, 1, 0}, /* BLK_MTD_SPI_NAND FSPI0 M0 */ 38 {IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI1 M0 */ 39 {IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI1 M1 */ 40 {IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI0 M0 */ 41 {IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI1 M0 */ 42 {IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI1 M0 */ 43 }; 44 #else 45 static const struct bootdev_list dev_list[] = { 46 {IF_TYPE_MMC, 0, 0}, 47 {IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */ 48 {IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND */ 49 {IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR */ 50 {IF_TYPE_RKNAND, 0, 0}, 51 }; 52 #endif 53 54 static struct blk_desc *boot_blk_desc; 55 struct blk_desc *rockchip_get_bootdev(void) 56 { 57 return boot_blk_desc; 58 } 59 60 __weak void board_set_iomux(enum if_type if_type, int devnum, int routing) 61 { 62 } 63 64 __weak void board_unset_iomux(enum if_type if_type, int devnum, int routing) 65 { 66 } 67 68 struct blk_desc *usbplug_blk_get_devnum_by_type(enum if_type if_type, int devnum) 69 { 70 struct blk_desc *blk_desc = NULL; 71 u8 iomux_routing; 72 int i = 0; 73 74 for (i = 0; i < ARRAY_SIZE(dev_list); i++) { 75 if (if_type != dev_list[i].if_type || devnum != dev_list[i].devnum) 76 continue; 77 iomux_routing = dev_list[i].iomux_routing; 78 switch (if_type) { 79 #ifdef CONFIG_MMC 80 case IF_TYPE_MMC: 81 board_set_iomux(if_type, devnum, iomux_routing); 82 mmc_initialize(gd->bd); 83 break; 84 #endif 85 case IF_TYPE_MTD: 86 board_set_iomux(if_type, devnum, iomux_routing); 87 break; 88 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS)) 89 case IF_TYPE_SCSI: 90 scsi_scan(true); 91 break; 92 #endif 93 default: 94 printf("Bootdev 0x%x is not support\n", if_type); 95 return NULL; 96 } 97 98 printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 99 blk_desc = blk_get_devnum_by_type(if_type, devnum); 100 if (blk_desc) 101 break; 102 103 board_unset_iomux(if_type, devnum, iomux_routing); 104 } 105 106 boot_blk_desc = blk_desc; 107 108 return blk_desc; 109 } 110 111 static char *bootdev_rockusb_cmd(void) 112 { 113 struct blk_desc *blk_desc = NULL; 114 u32 if_type = IF_TYPE_UNKNOWN; 115 u8 devnum, iomux_routing; 116 char *cmd; 117 int i = 0; 118 119 for (i = 0; i < ARRAY_SIZE(dev_list); i++) { 120 if_type = dev_list[i].if_type; 121 devnum = dev_list[i].devnum; 122 iomux_routing = dev_list[i].iomux_routing; 123 switch (if_type) { 124 #ifdef CONFIG_MMC 125 case IF_TYPE_MMC: 126 board_set_iomux(if_type, devnum, iomux_routing); 127 mmc_initialize(gd->bd); 128 break; 129 #endif 130 case IF_TYPE_MTD: 131 board_set_iomux(if_type, devnum, iomux_routing); 132 break; 133 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS)) 134 case IF_TYPE_SCSI: 135 scsi_scan(true); 136 break; 137 #endif 138 default: 139 printf("Bootdev 0x%x is not support\n", if_type); 140 return NULL; 141 } 142 143 printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 144 blk_desc = blk_get_devnum_by_type(if_type, devnum); 145 if (blk_desc) 146 break; 147 148 board_unset_iomux(if_type, devnum, iomux_routing); 149 } 150 151 boot_blk_desc = blk_desc; 152 153 if (!if_type) { 154 printf("No boot device\n"); 155 return NULL; 156 } 157 158 printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum); 159 160 cmd = malloc(32); 161 if (!cmd) 162 return NULL; 163 164 snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum); 165 166 return cmd; 167 } 168 169 int board_init(void) 170 { 171 return run_command(bootdev_rockusb_cmd(), 0); 172 } 173 174