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