[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haiku-commits
Subject:    [haiku-commits] Change in haiku[master]: system/boot: Begin factoring gFDT out of non-u-boot code
From:       Gerrit <review () review ! haiku-os ! org>
Date:       2020-02-29 0:00:16
Message-ID: gerrit.1582934414000.Ibe010c6c7ed71a20fc852ce6c72c6f32b98dfad2 () review ! haiku-os ! org
[Download RAW message or body]

From Alex von Gluck IV <kallisti5@unixzen.com>:

Alex von Gluck IV has uploaded this change for review. ( \
https://review.haiku-os.org/c/haiku/+/2292 )


Change subject: system/boot: Begin factoring gFDT out of non-u-boot code
......................................................................

system/boot: Begin factoring gFDT out of non-u-boot code

Change-Id: Ibe010c6c7ed71a20fc852ce6c72c6f32b98dfad2
---
M src/system/boot/arch/arm/arch_mmu.cpp
M src/system/boot/arch/arm/arch_mmu.h
M src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp
M src/system/boot/platform/u-boot/mmu.h
M src/system/boot/platform/u-boot/start.cpp
5 files changed, 33 insertions(+), 20 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/92/2292/1

diff --git a/src/system/boot/arch/arm/arch_mmu.cpp \
b/src/system/boot/arch/arm/arch_mmu.cpp index 7da9a26..9b06a61 100644
--- a/src/system/boot/arch/arm/arch_mmu.cpp
+++ b/src/system/boot/arch/arm/arch_mmu.cpp
@@ -42,9 +42,6 @@
 	// You also need to define ENABLE_SERIAL in serial.cpp
 	// for output to work.

-extern void *gFDT;
-
-
 /*
 TODO:
 	-recycle bit!
@@ -354,7 +351,7 @@

 //TODO:move this to generic/ ?
 static status_t
-fdt_map_memory_ranges(const char* path, bool physical = false)
+fdt_map_memory_ranges(void* fdt, const char* path, bool physical = false)
 {
 	int node;
 	const void *prop;
@@ -362,15 +359,15 @@
 	uint64 total;

 	dprintf("checking FDT for %s...\n", path);
-	node = fdt_path_offset(gFDT, path);
+	node = fdt_path_offset(fdt, path);

 	total = 0;

 	int32 regAddressCells = 1;
 	int32 regSizeCells = 1;
-	fdt_get_cell_count(gFDT, node, regAddressCells, regSizeCells);
+	fdt_get_cell_count(fdt, node, regAddressCells, regSizeCells);

-	prop = fdt_getprop(gFDT, node, "reg", &len);
+	prop = fdt_getprop(fdt, node, "reg", &len);
 	if (prop == NULL) {
 		dprintf("Unable to locate %s in FDT!\n", path);
 		return B_ERROR;
@@ -420,8 +417,26 @@
 }


-void
-init_page_directory()
+static void
+fdt_map_peripheral(void* fdt)
+{
+	if (fdt == NULL) {
+		dprintf("Invalid FDT provided to %s!", __func__);
+		return;
+	}
+
+	// map peripheral devices (such as uart) from fdt
+
+	#warning Map peripherals from the fdt we want to use in the bootloader!
+	// this assumes /pl011@9000000 which is the qemu virt uart
+	fdt_map_memory_ranges(fdt, "/pl011@9000000");
+	// this assumes /axi which is broadcom!
+	fdt_map_memory_ranges(fdt, "/axi");
+}
+
+
+static void
+init_page_directory(void* fdt)
 {
 	TRACE(("init_page_directory\n"));

@@ -441,10 +456,8 @@
 	// map our well known / static pages
 	map_pages_loader();

-	// map peripheral devices (such as uart) from fdt
-	// TODO: Iterate over for "simple-bus" compatible devices!
-	// this assumes /axi which is broadcom!
-	fdt_map_memory_ranges("/axi");
+	// map our fdt peripherals
+	fdt_map_peripheral(fdt);

 	mmu_flush_TLB();

@@ -693,7 +706,7 @@


 extern "C" void
-mmu_init(void)
+mmu_init(void* fdt)
 {
 	TRACE(("mmu_init\n"));

@@ -701,7 +714,7 @@
 	if (gKernelArgs.num_physical_memory_ranges == 0) {
 		// get map of physical memory (fill in kernel_args structure)

-		if (fdt_map_memory_ranges("/memory", true) != B_OK) {
+		if (fdt_map_memory_ranges(fdt, "/memory", true) != B_OK) {
 			panic("Error: could not find physical memory ranges from FDT!\n");

 #ifdef SDRAM_BASE
@@ -743,7 +756,7 @@
 		(addr_t)&_end - (addr_t)&_start);
 	insert_physical_allocated_range((addr_t)sPageDirectory, 0x200000);

-	init_page_directory();
+	init_page_directory(fdt);

 	// map in a kernel stack
 	gKernelArgs.cpu_kstack[0].size = KERNEL_STACK_SIZE
diff --git a/src/system/boot/arch/arm/arch_mmu.h \
b/src/system/boot/arch/arm/arch_mmu.h index cd30040..004a083 100644
--- a/src/system/boot/arch/arm/arch_mmu.h
+++ b/src/system/boot/arch/arm/arch_mmu.h
@@ -18,7 +18,7 @@
 extern "C" {
 #endif

-extern void mmu_init(void);
+extern void mmu_init(void* fdt);
 extern void mmu_init_for_kernel(void);
 extern addr_t mmu_map_physical_memory(addr_t physicalAddress,
 	size_t size, uint32 flags);
diff --git a/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp \
b/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp index 2abf1ce..df228ea 100644
--- a/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp
+++ b/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp
@@ -283,7 +283,7 @@


 extern "C" void
-mmu_init(void)
+mmu_init(void* fdt)
 {
 	size_t tableSize, tlbSize;
 	status_t err;
diff --git a/src/system/boot/platform/u-boot/mmu.h \
b/src/system/boot/platform/u-boot/mmu.h index cd30040..004a083 100644
--- a/src/system/boot/platform/u-boot/mmu.h
+++ b/src/system/boot/platform/u-boot/mmu.h
@@ -18,7 +18,7 @@
 extern "C" {
 #endif

-extern void mmu_init(void);
+extern void mmu_init(void* fdt);
 extern void mmu_init_for_kernel(void);
 extern addr_t mmu_map_physical_memory(addr_t physicalAddress,
 	size_t size, uint32 flags);
diff --git a/src/system/boot/platform/u-boot/start.cpp \
b/src/system/boot/platform/u-boot/start.cpp index 7542cce..d7d3804 100644
--- a/src/system/boot/platform/u-boot/start.cpp
+++ b/src/system/boot/platform/u-boot/start.cpp
@@ -305,7 +305,7 @@
 	size_t fdtSize = gFDT ? fdt_totalsize(gFDT) : 0;
 	dprintf("fdtSize: 0x%" B_PRIxSIZE "\n", fdtSize);

-	mmu_init();
+	mmu_init(gFDT);

 	// Handle our tarFS post-mmu
 	if (args.platform.boot_tgz_size > 0) {

--
To view, visit https://review.haiku-os.org/c/haiku/+/2292
To unsubscribe, or for help writing mail filters, visit \
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ibe010c6c7ed71a20fc852ce6c72c6f32b98dfad2
Gerrit-Change-Number: 2292
Gerrit-PatchSet: 1
Gerrit-Owner: Alex von Gluck IV <kallisti5@unixzen.com>
Gerrit-MessageType: newchange


[Attachment #3 (text/html)]

<p>Alex von Gluck IV has uploaded this change for <strong>review</strong>.</p><p><a \
href="https://review.haiku-os.org/c/haiku/+/2292">View Change</a></p><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;">system/boot: Begin \
factoring gFDT out of non-u-boot code<br><br>Change-Id: \
Ibe010c6c7ed71a20fc852ce6c72c6f32b98dfad2<br>---<br>M \
src/system/boot/arch/arm/arch_mmu.cpp<br>M src/system/boot/arch/arm/arch_mmu.h<br>M \
src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp<br>M \
src/system/boot/platform/u-boot/mmu.h<br>M \
src/system/boot/platform/u-boot/start.cpp<br>5 files changed, 33 insertions(+), 20 \
deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: \
pre-wrap;">git pull ssh://git.haiku-os.org:22/haiku refs/changes/92/2292/1</pre><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git \
a/src/system/boot/arch/arm/arch_mmu.cpp \
b/src/system/boot/arch/arm/arch_mmu.cpp</span><br><span>index 7da9a26..9b06a61 \
100644</span><br><span>--- \
a/src/system/boot/arch/arm/arch_mmu.cpp</span><br><span>+++ \
b/src/system/boot/arch/arm/arch_mmu.cpp</span><br><span>@@ -42,9 +42,6 \
@@</span><br><span> 	// You also need to define ENABLE_SERIAL in \
serial.cpp</span><br><span> 	// for output to work.</span><br><span> </span><br><span \
style="color: hsl(0, 100%, 40%);">-extern void *gFDT;</span><br><span style="color: \
hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, \
40%);">-</span><br><span> /*</span><br><span> TODO:</span><br><span> 	-recycle \
bit!</span><br><span>@@ -354,7 +351,7 @@</span><br><span> </span><br><span> \
//TODO:move this to generic/ ?</span><br><span> static status_t</span><br><span \
style="color: hsl(0, 100%, 40%);">-fdt_map_memory_ranges(const char* path, bool \
physical = false)</span><br><span style="color: hsl(120, 100%, \
40%);">+fdt_map_memory_ranges(void* fdt, const char* path, bool physical = \
false)</span><br><span> {</span><br><span> 	int node;</span><br><span> 	const void \
*prop;</span><br><span>@@ -362,15 +359,15 @@</span><br><span> 	uint64 \
total;</span><br><span> </span><br><span> 	dprintf(&quot;checking FDT for \
%s...\n&quot;, path);</span><br><span style="color: hsl(0, 100%, 40%);">-	node = \
fdt_path_offset(gFDT, path);</span><br><span style="color: hsl(120, 100%, \
40%);">+	node = fdt_path_offset(fdt, path);</span><br><span> </span><br><span> 	total \
= 0;</span><br><span> </span><br><span> 	int32 regAddressCells = 1;</span><br><span> \
int32 regSizeCells = 1;</span><br><span style="color: hsl(0, 100%, \
40%);">-	fdt_get_cell_count(gFDT, node, regAddressCells, \
regSizeCells);</span><br><span style="color: hsl(120, 100%, \
40%);">+	fdt_get_cell_count(fdt, node, regAddressCells, \
regSizeCells);</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-	prop = fdt_getprop(gFDT, node, &quot;reg&quot;, &amp;len);</span><br><span \
style="color: hsl(120, 100%, 40%);">+	prop = fdt_getprop(fdt, node, &quot;reg&quot;, \
&amp;len);</span><br><span> 	if (prop == NULL) {</span><br><span> \
dprintf(&quot;Unable to locate %s in FDT!\n&quot;, path);</span><br><span> 		return \
B_ERROR;</span><br><span>@@ -420,8 +417,26 @@</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-void</span><br><span style="color: hsl(0, 100%, \
40%);">-init_page_directory()</span><br><span style="color: hsl(120, 100%, \
40%);">+static void</span><br><span style="color: hsl(120, 100%, \
40%);">+fdt_map_peripheral(void* fdt)</span><br><span style="color: hsl(120, 100%, \
40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+	if (fdt == NULL) \
{</span><br><span style="color: hsl(120, 100%, 40%);">+		dprintf(&quot;Invalid FDT \
provided to %s!&quot;, __func__);</span><br><span style="color: hsl(120, 100%, \
40%);">+		return;</span><br><span style="color: hsl(120, 100%, \
40%);">+	}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+	// map peripheral devices (such as uart) from \
fdt</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+	#warning Map peripherals from the fdt we want \
to use in the bootloader!</span><br><span style="color: hsl(120, 100%, 40%);">+	// \
this assumes /pl011@9000000 which is the qemu virt uart</span><br><span style="color: \
hsl(120, 100%, 40%);">+	fdt_map_memory_ranges(fdt, \
&quot;/pl011@9000000&quot;);</span><br><span style="color: hsl(120, 100%, 40%);">+	// \
this assumes /axi which is broadcom!</span><br><span style="color: hsl(120, 100%, \
40%);">+	fdt_map_memory_ranges(fdt, &quot;/axi&quot;);</span><br><span style="color: \
hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, \
40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span \
style="color: hsl(120, 100%, 40%);">+static void</span><br><span style="color: \
hsl(120, 100%, 40%);">+init_page_directory(void* fdt)</span><br><span> \
{</span><br><span> 	TRACE((&quot;init_page_directory\n&quot;));</span><br><span> \
</span><br><span>@@ -441,10 +456,8 @@</span><br><span> 	// map our well known / \
static pages</span><br><span> 	map_pages_loader();</span><br><span> </span><br><span \
style="color: hsl(0, 100%, 40%);">-	// map peripheral devices (such as uart) from \
fdt</span><br><span style="color: hsl(0, 100%, 40%);">-	// TODO: Iterate over for \
&quot;simple-bus&quot; compatible devices!</span><br><span style="color: hsl(0, 100%, \
40%);">-	// this assumes /axi which is broadcom!</span><br><span style="color: hsl(0, \
100%, 40%);">-	fdt_map_memory_ranges(&quot;/axi&quot;);</span><br><span style="color: \
hsl(120, 100%, 40%);">+	// map our fdt peripherals</span><br><span style="color: \
hsl(120, 100%, 40%);">+	fdt_map_peripheral(fdt);</span><br><span> </span><br><span> \
mmu_flush_TLB();</span><br><span> </span><br><span>@@ -693,7 +706,7 \
@@</span><br><span> </span><br><span> </span><br><span> extern &quot;C&quot; \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-mmu_init(void)</span><br><span style="color: hsl(120, 100%, \
40%);">+mmu_init(void* fdt)</span><br><span> {</span><br><span> \
TRACE((&quot;mmu_init\n&quot;));</span><br><span> </span><br><span>@@ -701,7 +714,7 \
@@</span><br><span> 	if (gKernelArgs.num_physical_memory_ranges == 0) \
{</span><br><span> 		// get map of physical memory (fill in kernel_args \
structure)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-		if \
(fdt_map_memory_ranges(&quot;/memory&quot;, true) != B_OK) {</span><br><span \
style="color: hsl(120, 100%, 40%);">+		if (fdt_map_memory_ranges(fdt, \
&quot;/memory&quot;, true) != B_OK) {</span><br><span> 			panic(&quot;Error: could \
not find physical memory ranges from FDT!\n&quot;);</span><br><span> \
</span><br><span> #ifdef SDRAM_BASE</span><br><span>@@ -743,7 +756,7 \
@@</span><br><span> 		(addr_t)&amp;_end - (addr_t)&amp;_start);</span><br><span> \
insert_physical_allocated_range((addr_t)sPageDirectory, 0x200000);</span><br><span> \
</span><br><span style="color: hsl(0, 100%, \
40%);">-	init_page_directory();</span><br><span style="color: hsl(120, 100%, \
40%);">+	init_page_directory(fdt);</span><br><span> </span><br><span> 	// map in a \
kernel stack</span><br><span> 	gKernelArgs.cpu_kstack[0].size = \
KERNEL_STACK_SIZE</span><br><span>diff --git a/src/system/boot/arch/arm/arch_mmu.h \
b/src/system/boot/arch/arm/arch_mmu.h</span><br><span>index cd30040..004a083 \
100644</span><br><span>--- a/src/system/boot/arch/arm/arch_mmu.h</span><br><span>+++ \
b/src/system/boot/arch/arm/arch_mmu.h</span><br><span>@@ -18,7 +18,7 \
@@</span><br><span> extern &quot;C&quot; {</span><br><span> #endif</span><br><span> \
</span><br><span style="color: hsl(0, 100%, 40%);">-extern void \
mmu_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+extern void \
mmu_init(void* fdt);</span><br><span> extern void \
mmu_init_for_kernel(void);</span><br><span> extern addr_t \
mmu_map_physical_memory(addr_t physicalAddress,</span><br><span> 	size_t size, uint32 \
flags);</span><br><span>diff --git \
a/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp \
b/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp</span><br><span>index \
2abf1ce..df228ea 100644</span><br><span>--- \
a/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp</span><br><span>+++ \
b/src/system/boot/platform/u-boot/arch/ppc/arch_mmu.cpp</span><br><span>@@ -283,7 \
+283,7 @@</span><br><span> </span><br><span> </span><br><span> extern &quot;C&quot; \
void</span><br><span style="color: hsl(0, 100%, \
40%);">-mmu_init(void)</span><br><span style="color: hsl(120, 100%, \
40%);">+mmu_init(void* fdt)</span><br><span> {</span><br><span> 	size_t tableSize, \
tlbSize;</span><br><span> 	status_t err;</span><br><span>diff --git \
a/src/system/boot/platform/u-boot/mmu.h \
b/src/system/boot/platform/u-boot/mmu.h</span><br><span>index cd30040..004a083 \
100644</span><br><span>--- \
a/src/system/boot/platform/u-boot/mmu.h</span><br><span>+++ \
b/src/system/boot/platform/u-boot/mmu.h</span><br><span>@@ -18,7 +18,7 \
@@</span><br><span> extern &quot;C&quot; {</span><br><span> #endif</span><br><span> \
</span><br><span style="color: hsl(0, 100%, 40%);">-extern void \
mmu_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+extern void \
mmu_init(void* fdt);</span><br><span> extern void \
mmu_init_for_kernel(void);</span><br><span> extern addr_t \
mmu_map_physical_memory(addr_t physicalAddress,</span><br><span> 	size_t size, uint32 \
flags);</span><br><span>diff --git a/src/system/boot/platform/u-boot/start.cpp \
b/src/system/boot/platform/u-boot/start.cpp</span><br><span>index 7542cce..d7d3804 \
100644</span><br><span>--- \
a/src/system/boot/platform/u-boot/start.cpp</span><br><span>+++ \
b/src/system/boot/platform/u-boot/start.cpp</span><br><span>@@ -305,7 +305,7 \
@@</span><br><span> 	size_t fdtSize = gFDT ? fdt_totalsize(gFDT) : \
0;</span><br><span> 	dprintf(&quot;fdtSize: 0x%&quot; B_PRIxSIZE &quot;\n&quot;, \
fdtSize);</span><br><span> </span><br><span style="color: hsl(0, 100%, \
40%);">-	mmu_init();</span><br><span style="color: hsl(120, 100%, \
40%);">+	mmu_init(gFDT);</span><br><span> </span><br><span> 	// Handle our tarFS \
post-mmu</span><br><span> 	if (args.platform.boot_tgz_size &gt; 0) \
{</span><br><span></span><br></pre><p>To view, visit <a \
href="https://review.haiku-os.org/c/haiku/+/2292">change 2292</a>. To unsubscribe, or \
for help writing mail filters, visit <a \
href="https://review.haiku-os.org/settings">settings</a>.</p><div itemscope \
itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" \
itemtype="http://schema.org/ViewAction"><link itemprop="url" \
href="https://review.haiku-os.org/c/haiku/+/2292"/><meta itemprop="name" \
content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: haiku </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: \
Ibe010c6c7ed71a20fc852ce6c72c6f32b98dfad2 </div> <div style="display:none"> \
Gerrit-Change-Number: 2292 </div> <div style="display:none"> Gerrit-PatchSet: 1 \
</div> <div style="display:none"> Gerrit-Owner: Alex von Gluck IV \
&lt;kallisti5@unixzen.com&gt; </div> <div style="display:none"> Gerrit-MessageType: \
newchange </div>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic