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 scsi_scan(true); 89 break; 90 #endif 91 default: 92 printf("Bootdev 0x%x is not support\n", if_type); 93 return NULL; 94 } 95 96 printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 97 blk_desc = blk_get_devnum_by_type(if_type, devnum); 98 if (blk_desc) 99 break; 100 } 101 102 boot_blk_desc = blk_desc; 103 104 return blk_desc; 105 } 106 107 static char *bootdev_rockusb_cmd(void) 108 { 109 struct blk_desc *blk_desc = NULL; 110 u32 if_type = IF_TYPE_UNKNOWN; 111 u8 devnum, iomux_routing; 112 char *cmd; 113 int i = 0; 114 115 for (i = 0; i < ARRAY_SIZE(dev_list); i++) { 116 if_type = dev_list[i].if_type; 117 devnum = dev_list[i].devnum; 118 iomux_routing = dev_list[i].iomux_routing; 119 switch (if_type) { 120 #ifdef CONFIG_MMC 121 case IF_TYPE_MMC: 122 board_set_iomux(if_type, devnum, iomux_routing); 123 mmc_initialize(gd->bd); 124 break; 125 #endif 126 case IF_TYPE_MTD: 127 board_set_iomux(if_type, devnum, iomux_routing); 128 break; 129 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS)) 130 case IF_TYPE_SCSI: 131 scsi_scan(true); 132 scsi_scan(true); 133 break; 134 #endif 135 default: 136 printf("Bootdev 0x%x is not support\n", if_type); 137 return NULL; 138 } 139 140 printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing); 141 blk_desc = blk_get_devnum_by_type(if_type, devnum); 142 if (blk_desc) 143 break; 144 } 145 146 boot_blk_desc = blk_desc; 147 148 if (!if_type) { 149 printf("No boot device\n"); 150 return NULL; 151 } 152 153 printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum); 154 155 cmd = malloc(32); 156 if (!cmd) 157 return NULL; 158 159 snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum); 160 161 return cmd; 162 } 163 164 int board_init(void) 165 { 166 return run_command(bootdev_rockusb_cmd(), 0); 167 } 168 169