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;
rockchip_get_bootdev(void)55 struct blk_desc *rockchip_get_bootdev(void)
56 {
57 return boot_blk_desc;
58 }
59
board_set_iomux(enum if_type if_type,int devnum,int routing)60 __weak void board_set_iomux(enum if_type if_type, int devnum, int routing)
61 {
62 }
63
board_unset_iomux(enum if_type if_type,int devnum,int routing)64 __weak void board_unset_iomux(enum if_type if_type, int devnum, int routing)
65 {
66 }
67
usbplug_blk_get_devnum_by_type(enum if_type if_type,int devnum)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
bootdev_rockusb_cmd(void)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
board_init(void)169 int board_init(void)
170 {
171 return run_command(bootdev_rockusb_cmd(), 0);
172 }
173
174