From fe66a0760c00bfe55b20211955f740f00efb704a Mon Sep 17 00:00:00 2001 From: Jens Drenhaus Date: Tue, 9 Oct 2018 13:02:49 +0200 Subject: soc/cavium: dynamic UART initialization for cavium cn8100 Now only those UARTs that are enabled in devicetree.cb are initialized. Tested on Opencellular Elgon. Change-Id: I145c224148f0cc078bb1c76f588f603e73121a62 Signed-off-by: Jens Drenhaus Reviewed-on: https://review.coreboot.org/28975 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Rudolph --- src/soc/cavium/cn81xx/soc.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/soc/cavium') 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 #include #include +#include #include #include #include @@ -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(); } -- cgit v1.2.3