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