2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
12 #include <lib/utils_def.h>
16 #define UNIPHIER_PINMON0 0x5f900100
17 #define UNIPHIER_PINMON2 0x5f900108
19 static int uniphier_ld11_is_usb_boot(uint32_t pinmon
)
21 return !!(~pinmon
& 0x00000080);
24 static int uniphier_ld20_is_usb_boot(uint32_t pinmon
)
26 return !!(~pinmon
& 0x00000780);
29 static int uniphier_pxs3_is_usb_boot(uint32_t pinmon
)
31 uint32_t pinmon2
= mmio_read_32(UNIPHIER_PINMON2
);
33 return !!(pinmon2
& BIT(31));
36 static const unsigned int uniphier_ld11_boot_device_table
[] = {
37 UNIPHIER_BOOT_DEVICE_NAND
,
38 UNIPHIER_BOOT_DEVICE_NAND
,
39 UNIPHIER_BOOT_DEVICE_NAND
,
40 UNIPHIER_BOOT_DEVICE_NAND
,
41 UNIPHIER_BOOT_DEVICE_NAND
,
42 UNIPHIER_BOOT_DEVICE_NAND
,
43 UNIPHIER_BOOT_DEVICE_NAND
,
44 UNIPHIER_BOOT_DEVICE_NAND
,
45 UNIPHIER_BOOT_DEVICE_NAND
,
46 UNIPHIER_BOOT_DEVICE_NAND
,
47 UNIPHIER_BOOT_DEVICE_NAND
,
48 UNIPHIER_BOOT_DEVICE_NAND
,
49 UNIPHIER_BOOT_DEVICE_NAND
,
50 UNIPHIER_BOOT_DEVICE_NAND
,
51 UNIPHIER_BOOT_DEVICE_NAND
,
52 UNIPHIER_BOOT_DEVICE_NAND
,
53 UNIPHIER_BOOT_DEVICE_NAND
,
54 UNIPHIER_BOOT_DEVICE_NAND
,
55 UNIPHIER_BOOT_DEVICE_NAND
,
56 UNIPHIER_BOOT_DEVICE_NAND
,
57 UNIPHIER_BOOT_DEVICE_NAND
,
58 UNIPHIER_BOOT_DEVICE_NAND
,
59 UNIPHIER_BOOT_DEVICE_NAND
,
60 UNIPHIER_BOOT_DEVICE_NAND
,
61 UNIPHIER_BOOT_DEVICE_EMMC
,
62 UNIPHIER_BOOT_DEVICE_EMMC
,
63 UNIPHIER_BOOT_DEVICE_EMMC
,
64 UNIPHIER_BOOT_DEVICE_EMMC
,
65 UNIPHIER_BOOT_DEVICE_EMMC
,
66 UNIPHIER_BOOT_DEVICE_EMMC
,
67 UNIPHIER_BOOT_DEVICE_EMMC
,
68 UNIPHIER_BOOT_DEVICE_NOR
,
71 static unsigned int uniphier_ld11_get_boot_device(uint32_t pinmon
)
73 unsigned int boot_sel
= (pinmon
>> 1) & 0x1f;
75 assert(boot_sel
< ARRAY_SIZE(uniphier_ld11_boot_device_table
));
77 return uniphier_ld11_boot_device_table
[boot_sel
];
80 static const unsigned int uniphier_pxs3_boot_device_table
[] = {
81 UNIPHIER_BOOT_DEVICE_NAND
,
82 UNIPHIER_BOOT_DEVICE_NAND
,
83 UNIPHIER_BOOT_DEVICE_NAND
,
84 UNIPHIER_BOOT_DEVICE_NAND
,
85 UNIPHIER_BOOT_DEVICE_NAND
,
86 UNIPHIER_BOOT_DEVICE_NAND
,
87 UNIPHIER_BOOT_DEVICE_NAND
,
88 UNIPHIER_BOOT_DEVICE_NAND
,
89 UNIPHIER_BOOT_DEVICE_EMMC
,
90 UNIPHIER_BOOT_DEVICE_EMMC
,
91 UNIPHIER_BOOT_DEVICE_EMMC
,
92 UNIPHIER_BOOT_DEVICE_EMMC
,
93 UNIPHIER_BOOT_DEVICE_EMMC
,
94 UNIPHIER_BOOT_DEVICE_EMMC
,
95 UNIPHIER_BOOT_DEVICE_NAND
,
96 UNIPHIER_BOOT_DEVICE_NAND
,
99 static unsigned int uniphier_pxs3_get_boot_device(uint32_t pinmon
)
101 unsigned int boot_sel
= (pinmon
>> 1) & 0xf;
103 assert(boot_sel
< ARRAY_SIZE(uniphier_pxs3_boot_device_table
));
105 return uniphier_pxs3_boot_device_table
[boot_sel
];
108 struct uniphier_boot_device_info
{
109 int (*is_usb_boot
)(uint32_t pinmon
);
110 unsigned int (*get_boot_device
)(uint32_t pinmon
);
113 static const struct uniphier_boot_device_info uniphier_boot_device_info
[] = {
114 [UNIPHIER_SOC_LD11
] = {
115 .is_usb_boot
= uniphier_ld11_is_usb_boot
,
116 .get_boot_device
= uniphier_ld11_get_boot_device
,
118 [UNIPHIER_SOC_LD20
] = {
119 .is_usb_boot
= uniphier_ld20_is_usb_boot
,
120 .get_boot_device
= uniphier_ld11_get_boot_device
,
122 [UNIPHIER_SOC_PXS3
] = {
123 .is_usb_boot
= uniphier_pxs3_is_usb_boot
,
124 .get_boot_device
= uniphier_pxs3_get_boot_device
,
128 unsigned int uniphier_get_boot_device(unsigned int soc
)
130 const struct uniphier_boot_device_info
*info
;
133 assert(soc
< ARRAY_SIZE(uniphier_boot_device_info
));
134 info
= &uniphier_boot_device_info
[soc
];
136 pinmon
= mmio_read_32(UNIPHIER_PINMON0
);
138 if (!(pinmon
& BIT(29)))
139 return UNIPHIER_BOOT_DEVICE_NOR
;
141 if (info
->is_usb_boot(pinmon
))
142 return UNIPHIER_BOOT_DEVICE_USB
;
144 return info
->get_boot_device(pinmon
);
147 static const bool uniphier_have_onchip_scp
[] = {
148 [UNIPHIER_SOC_LD11
] = true,
149 [UNIPHIER_SOC_LD20
] = true,
150 [UNIPHIER_SOC_PXS3
] = false,
153 unsigned int uniphier_get_boot_master(unsigned int soc
)
155 assert(soc
< ARRAY_SIZE(uniphier_have_onchip_scp
));
157 if (uniphier_have_onchip_scp
[soc
]) {
158 if (mmio_read_32(UNIPHIER_PINMON0
) & BIT(27))
159 return UNIPHIER_BOOT_MASTER_THIS
;
161 return UNIPHIER_BOOT_MASTER_SCP
;
163 return UNIPHIER_BOOT_MASTER_EXT
;