summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/cavium/cn8100_sff_evb/mainboard.c6
-rw-r--r--src/mainboard/opencellular/elgon/mainboard.c6
-rw-r--r--src/soc/cavium/cn81xx/soc.c28
3 files changed, 28 insertions, 12 deletions
diff --git a/src/mainboard/cavium/cn8100_sff_evb/mainboard.c b/src/mainboard/cavium/cn8100_sff_evb/mainboard.c
index 28a3ee31db..ce896f2f75 100644
--- a/src/mainboard/cavium/cn8100_sff_evb/mainboard.c
+++ b/src/mainboard/cavium/cn8100_sff_evb/mainboard.c
@@ -83,12 +83,6 @@ static void mainboard_init(struct device *dev)
{
size_t i;
- /* Init UARTs */
- for (i = 0; i < 4; i++) {
- if (!uart_is_enabled(i))
- uart_setup(i, 0);
- }
-
/* Init timer */
soc_timer_init();
diff --git a/src/mainboard/opencellular/elgon/mainboard.c b/src/mainboard/opencellular/elgon/mainboard.c
index dc06bdcd31..45a715505c 100644
--- a/src/mainboard/opencellular/elgon/mainboard.c
+++ b/src/mainboard/opencellular/elgon/mainboard.c
@@ -101,12 +101,6 @@ static void mainboard_init(struct device *dev)
{
size_t i;
- /* Init UARTs */
- for (i = 0; i < 4; i++) {
- if (!uart_is_enabled(i))
- uart_setup(i, 0);
- }
-
/* Init timer */
soc_timer_init();
diff --git a/src/soc/cavium/cn81xx/soc.c b/src/soc/cavium/cn81xx/soc.c
index d9eb052027..0bf76f7424 100644
--- a/src/soc/cavium/cn81xx/soc.c
+++ b/src/soc/cavium/cn81xx/soc.c
@@ -24,6 +24,7 @@
#include <soc/clock.h>
#include <soc/sdram.h>
#include <soc/timer.h>
+#include <soc/uart.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
@@ -207,6 +208,21 @@ static int dt_platform_fixup(struct device_tree_fixup *fixup,
printk(BIOS_ERR, "%s: Node not found. OS might miss-behave !\n",
__func__);
+ /* Remove unused UART entries */
+ for (i = 0; i < 4; i++) {
+ char path[32];
+ const uint64_t addr = UAAx_PF_BAR0(i);
+ /* Remove the node */
+ snprintf(path, sizeof(path), "soc@0/serial@%llx", addr);
+ dt_node = dt_find_node_by_path(tree->root, path, NULL, NULL, 0);
+ if (!dt_node || uart_is_enabled(i)) {
+ printk(BIOS_INFO, "%s: ignoring %s\n", __func__, path);
+ continue;
+ }
+ printk(BIOS_INFO, "%s: Removing node %s\n", __func__, path);
+ list_remove(&dt_node->list_node);
+ }
+
/* Remove unused PEM entries */
for (i = 0; i < 8; i++) {
char path[32];
@@ -374,6 +390,18 @@ static void soc_init(struct device *dev)
}
}
+ /* Init UARTs */
+ size_t i;
+ struct device *uart_dev;
+ for (i = 0; i <= 3; i++) {
+ uart_dev = dev_find_slot(1, PCI_DEVFN(8, i));
+ /* using device enable state from devicetree.cb */
+ if (uart_dev && uart_dev->enabled) {
+ if (!uart_is_enabled(i))
+ uart_setup(i, 0);
+ }
+ }
+
if (IS_ENABLED(CONFIG_ARM64_USE_ARM_TRUSTED_FIRMWARE))
soc_init_atf();
}