1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2018 Marvell International Ltd.
4 *
5 * https://spdx.org/licenses
6 */
7
8 #include <dm.h>
9 #include <malloc.h>
10 #include <errno.h>
11 #include <env.h>
12 #include <init.h>
13 #include <log.h>
14 #include <netdev.h>
15 #include <pci_ids.h>
16 #include <asm/global_data.h>
17 #include <asm/io.h>
18 #include <linux/compiler.h>
19 #include <linux/libfdt.h>
20 #include <fdt_support.h>
21 #include <asm/arch/smc.h>
22 #include <asm/arch/soc.h>
23 #include <asm/arch/board.h>
24 #include <dm/util.h>
25
26 DECLARE_GLOBAL_DATA_PTR;
27
octeontx_cleanup_ethaddr(void)28 void octeontx_cleanup_ethaddr(void)
29 {
30 char ename[32];
31
32 for (int i = 0; i < 20; i++) {
33 sprintf(ename, i ? "eth%daddr" : "ethaddr", i);
34 if (env_get(ename))
35 env_set(ename, NULL);
36 }
37 }
38
octeontx_board_has_pmp(void)39 int octeontx_board_has_pmp(void)
40 {
41 return (otx_is_board("sff8104") || otx_is_board("nas8104"));
42 }
43
board_early_init_r(void)44 int board_early_init_r(void)
45 {
46 pci_init();
47 return 0;
48 }
49
board_init(void)50 int board_init(void)
51 {
52 if (IS_ENABLED(CONFIG_NET_OCTEONTX))
53 fdt_parse_phy_info();
54
55 return 0;
56 }
57
timer_init(void)58 int timer_init(void)
59 {
60 return 0;
61 }
62
dram_init(void)63 int dram_init(void)
64 {
65 gd->ram_size = smc_dram_size(0);
66 gd->ram_size -= CONFIG_SYS_SDRAM_BASE;
67 mem_map_fill();
68
69 return 0;
70 }
71
board_late_probe_devices(void)72 void board_late_probe_devices(void)
73 {
74 struct udevice *dev;
75 int err, bgx_cnt, i;
76
77 /* Probe MAC(BGX) and NIC PF devices before Network stack init */
78 bgx_cnt = otx_is_soc(CN81XX) ? 2 : 4;
79 for (i = 0; i < bgx_cnt; i++) {
80 err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
81 PCI_DEVICE_ID_CAVIUM_BGX, i, &dev);
82 if (err)
83 debug("%s BGX%d device not found\n", __func__, i);
84 }
85 if (otx_is_soc(CN81XX)) {
86 err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
87 PCI_DEVICE_ID_CAVIUM_RGX, 0, &dev);
88 if (err)
89 debug("%s RGX device not found\n", __func__);
90 }
91 err = dm_pci_find_device(PCI_VENDOR_ID_CAVIUM,
92 PCI_DEVICE_ID_CAVIUM_NIC, 0, &dev);
93 if (err)
94 debug("NIC PF device not found\n");
95 }
96
97 /**
98 * Board late initialization routine.
99 */
board_late_init(void)100 int board_late_init(void)
101 {
102 char boardname[32];
103 char boardserial[150], boardrev[150];
104 bool save_env = false;
105 const char *str;
106
107 /*
108 * Try to cleanup ethaddr env variables, this is needed
109 * as with each boot, configuration of network interfaces can change.
110 */
111 octeontx_cleanup_ethaddr();
112
113 snprintf(boardname, sizeof(boardname), "%s> ", fdt_get_board_model());
114 env_set("prompt", boardname);
115
116 set_working_fdt_addr(env_get_hex("fdtcontroladdr", fdt_base_addr));
117
118 str = fdt_get_board_revision();
119 if (str) {
120 snprintf(boardrev, sizeof(boardrev), "%s", str);
121 if (env_get("boardrev") &&
122 strcmp(boardrev, env_get("boardrev")))
123 save_env = true;
124 env_set("boardrev", boardrev);
125 }
126
127 str = fdt_get_board_serial();
128 if (str) {
129 snprintf(boardserial, sizeof(boardserial), "%s", str);
130 if (env_get("serial#") &&
131 strcmp(boardserial, env_get("serial#")))
132 save_env = true;
133 env_set("serial#", boardserial);
134 }
135
136 if (IS_ENABLED(CONFIG_NET_OCTEONTX))
137 board_late_probe_devices();
138
139 if (save_env)
140 env_save();
141
142 return 0;
143 }
144
145 /*
146 * Invoked before relocation, so limit to stack variables.
147 */
checkboard(void)148 int checkboard(void)
149 {
150 printf("Board: %s\n", fdt_get_board_model());
151
152 return 0;
153 }
154