git: e3bd5730ca92 - main - bhyve: Extract uart-clock from fdt_add_uart as an apb-pclk

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Wed, 10 Apr 2024 15:19:27 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=e3bd5730ca925cd74dece9c52bcc10237b058546

commit e3bd5730ca925cd74dece9c52bcc10237b058546
Author:     Jessica Clarke <jrtc27@jrtc27.com>
AuthorDate: 2024-02-21 22:44:57 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-04-10 15:17:56 +0000

    bhyve: Extract uart-clock from fdt_add_uart as an apb-pclk
    
    This clock will also be used by the PL031 RTC (rather than defining
    redundant per-device clocks).
    
    Reviewed by:    jhb
    MFC after:      2 weeks
    Obtained from:  CheriBSD
---
 usr.sbin/bhyve/aarch64/fdt.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/usr.sbin/bhyve/aarch64/fdt.c b/usr.sbin/bhyve/aarch64/fdt.c
index 65876f0f90e8..e8c959a65f3b 100644
--- a/usr.sbin/bhyve/aarch64/fdt.c
+++ b/usr.sbin/bhyve/aarch64/fdt.c
@@ -57,6 +57,7 @@
 
 static void *fdtroot;
 static uint32_t gic_phandle = 0;
+static uint32_t apb_pclk_phandle;
 
 static uint32_t
 assign_phandle(void *fdt)
@@ -155,6 +156,14 @@ fdt_init(struct vmctx *ctx, int ncpu, vm_paddr_t fdtaddr, vm_size_t fdtsize)
 	fdt_property_string(fdt, "method", "hvc");
 	fdt_end_node(fdt);
 
+	fdt_begin_node(fdt, "apb-pclk");
+	fdt_property_string(fdt, "compatible", "fixed-clock");
+	fdt_property_string(fdt, "clock-output-names", "clk24mhz");
+	fdt_property_u32(fdt, "#clock-cells", 0);
+	fdt_property_u32(fdt, "clock-frequency", 24000000);
+	apb_pclk_phandle = assign_phandle(fdt);
+	fdt_end_node(fdt);
+
 	/* Finalized by fdt_finalized(). */
 	fdtroot = fdt;
 
@@ -204,21 +213,13 @@ fdt_add_uart(uint64_t uart_base, uint64_t uart_size, int intr)
 {
 	void *fdt, *interrupts, *prop;
 	char node_name[32];
-	uint32_t clk_phandle;
 
 	assert(gic_phandle != 0);
+	assert(apb_pclk_phandle != 0);
 	assert(intr >= GIC_FIRST_SPI);
 
 	fdt = fdtroot;
 
-	fdt_begin_node(fdt, "uart-clock");
-	fdt_property_string(fdt, "compatible", "fixed-clock");
-	fdt_property_string(fdt, "clock-output-names", "clk24mhz");
-	fdt_property_u32(fdt, "#clock-cells", 0);
-	fdt_property_u32(fdt, "clock-frequency", 24000000);
-	clk_phandle = assign_phandle(fdt);
-	fdt_end_node(fdt);
-
 	snprintf(node_name, sizeof(node_name), "serial@%lx", uart_base);
 	fdt_begin_node(fdt, node_name);
 #define	UART_COMPAT	"arm,pl011\0arm,primecell"
@@ -232,8 +233,8 @@ fdt_add_uart(uint64_t uart_base, uint64_t uart_size, int intr)
 	SET_PROP_U32(interrupts, 1, intr - GIC_FIRST_SPI);
 	SET_PROP_U32(interrupts, 2, IRQ_TYPE_LEVEL_HIGH);
 	fdt_property_placeholder(fdt, "clocks", 2 * sizeof(uint32_t), &prop);
-	SET_PROP_U32(prop, 0, clk_phandle);
-	SET_PROP_U32(prop, 1, clk_phandle);
+	SET_PROP_U32(prop, 0, apb_pclk_phandle);
+	SET_PROP_U32(prop, 1, apb_pclk_phandle);
 #define	UART_CLK_NAMES	"uartclk\0apb_pclk"
 	fdt_property(fdt, "clock-names", UART_CLK_NAMES,
 	    sizeof(UART_CLK_NAMES));