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