[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("checking FDT for \
%s...\n", 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, "reg", &len);</span><br><span \
style="color: hsl(120, 100%, 40%);">+ prop = fdt_getprop(fdt, node, "reg", \
&len);</span><br><span> if (prop == NULL) {</span><br><span> \
dprintf("Unable to locate %s in FDT!\n", 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("Invalid FDT \
provided to %s!", __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, \
"/pl011@9000000");</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, "/axi");</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(("init_page_directory\n"));</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 \
"simple-bus" 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("/axi");</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 "C" \
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(("mmu_init\n"));</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("/memory", true) != B_OK) {</span><br><span \
style="color: hsl(120, 100%, 40%);">+ if (fdt_map_memory_ranges(fdt, \
"/memory", true) != B_OK) {</span><br><span> panic("Error: could \
not find physical memory ranges from FDT!\n");</span><br><span> \
</span><br><span> #ifdef SDRAM_BASE</span><br><span>@@ -743,7 +756,7 \
@@</span><br><span> (addr_t)&_end - (addr_t)&_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 "C" {</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 "C" \
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 "C" {</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("fdtSize: 0x%" B_PRIxSIZE "\n", \
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 > 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 \
<kallisti5@unixzen.com> </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