blob: af7fce1e5e931198504c3b90537cd734a2b97b6d [file] [log] [blame]
Garrett Giordanof5c236d2024-10-31 09:21:03 -07001// SPDX-License-Identifier: GPL-2.0+
2#include <asm/io.h>
3#include <asm/arch/hardware.h>
4#include <asm/arch/am62a_spl.h>
5
6static u32 __get_backup_bootmedia(u32 devstat)
7{
8 u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
9 MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
10 u32 bkup_bootmode_cfg =
11 (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
12 MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
13
14 switch (bkup_bootmode) {
15 case BACKUP_BOOT_DEVICE_UART:
16 return BOOT_DEVICE_UART;
17
18 case BACKUP_BOOT_DEVICE_USB:
19 return BOOT_DEVICE_USB;
20
21 case BACKUP_BOOT_DEVICE_ETHERNET:
22 return BOOT_DEVICE_ETHERNET;
23
24 case BACKUP_BOOT_DEVICE_MMC:
25 if (bkup_bootmode_cfg)
26 return BOOT_DEVICE_MMC2;
27 return BOOT_DEVICE_MMC1;
28
29 case BACKUP_BOOT_DEVICE_SPI:
30 return BOOT_DEVICE_SPI;
31
32 case BACKUP_BOOT_DEVICE_I2C:
33 return BOOT_DEVICE_I2C;
34
35 case BACKUP_BOOT_DEVICE_DFU:
36 if (bkup_bootmode_cfg & MAIN_DEVSTAT_BACKUP_USB_MODE_MASK)
37 return BOOT_DEVICE_USB;
38 return BOOT_DEVICE_DFU;
39 };
40
41 return BOOT_DEVICE_RAM;
42}
43
44static u32 __get_primary_bootmedia(u32 devstat)
45{
46 u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
47 MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
48 u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
49 MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
50
51 switch (bootmode) {
52 case BOOT_DEVICE_OSPI:
53 fallthrough;
54 case BOOT_DEVICE_QSPI:
55 fallthrough;
56 case BOOT_DEVICE_XSPI:
57 fallthrough;
58 case BOOT_DEVICE_SPI:
59 return BOOT_DEVICE_SPI;
60
61 case BOOT_DEVICE_ETHERNET_RGMII:
62 fallthrough;
63 case BOOT_DEVICE_ETHERNET_RMII:
64 return BOOT_DEVICE_ETHERNET;
65
66 case BOOT_DEVICE_EMMC:
67 return BOOT_DEVICE_MMC1;
68
69 case BOOT_DEVICE_SPI_NAND:
70 return BOOT_DEVICE_SPINAND;
71
72 case BOOT_DEVICE_MMC:
73 if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK) >>
74 MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT)
75 return BOOT_DEVICE_MMC2;
76 return BOOT_DEVICE_MMC1;
77
78 case BOOT_DEVICE_DFU:
79 if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK) >>
80 MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT)
81 return BOOT_DEVICE_USB;
82 return BOOT_DEVICE_DFU;
83
84 case BOOT_DEVICE_NOBOOT:
85 return BOOT_DEVICE_RAM;
86 }
87
88 return bootmode;
89}
90
91u32 get_boot_device(void)
92{
93 u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
94 u32 bootmode = *(u32 *)(K3_BOOT_PARAM_TABLE_INDEX_OCRAM);
95 u32 bootmedia;
96
97 if (bootmode == K3_PRIMARY_BOOTMODE)
98 bootmedia = __get_primary_bootmedia(devstat);
99 else
100 bootmedia = __get_backup_bootmedia(devstat);
101
102 debug("%s: devstat = 0x%x bootmedia = 0x%x bootmode = %d\n",
103 __func__, devstat, bootmedia, bootmode);
104
105 return bootmedia;
106}