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