blob: 059ebf8f17273599de7e600cf3ecc9b67129bc0b [file] [log] [blame]
Suneel Garapati03c22882019-10-19 18:37:55 -07001// 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>
Simon Glass401d1c42020-10-30 21:38:53 -060016#include <asm/global_data.h>
Suneel Garapati03c22882019-10-19 18:37:55 -070017#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
26DECLARE_GLOBAL_DATA_PTR;
27
28void 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
39int octeontx_board_has_pmp(void)
40{
41 return (otx_is_board("sff8104") || otx_is_board("nas8104"));
42}
43
44int board_early_init_r(void)
45{
46 pci_init();
47 return 0;
48}
49
50int board_init(void)
51{
52 if (IS_ENABLED(CONFIG_NET_OCTEONTX))
53 fdt_parse_phy_info();
54
55 return 0;
56}
57
58int timer_init(void)
59{
60 return 0;
61}
62
63int 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
72void 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 */
100int 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 */
148int checkboard(void)
149{
150 printf("Board: %s\n", fdt_get_board_model());
151
152 return 0;
153}