[haiku-commits] haiku: hrev48215 - src/system/boot/arch/arm

  • From: revol@xxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 3 Nov 2014 21:08:29 +0100 (CET)

hrev48215 adds 2 changesets to branch 'master'
old head: cb3ea122d3c5d2ad41eff682dd5f78e0e1193d10
new head: 361f5a857f6aebe050fc327109aae296eed2b0aa
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=361f5a8+%5Ecb3ea12

----------------------------------------------------------------------------

1cac430: ARM: Add an mmu_get_virtual_mapping() call to bootloader
  
  Will be needed to figure out the framebuffer address
  once we allocate it properly instead of hardcoding.

361f5a8: ARM: OMAP3: dynamically allocate the framebuffer
  
  It seems to work on overo at least, which has only 128MB by default in QEMU.

                                          [ François Revol <revol@xxxxxxx> ]

----------------------------------------------------------------------------

2 files changed, 45 insertions(+), 15 deletions(-)
.../boot/arch/arm/arch_framebuffer_omap3.cpp     | 38 ++++++++++++--------
src/system/boot/arch/arm/arch_mmu.cpp            | 22 ++++++++++++

############################################################################

Commit:      1cac4300c3f1520a74c6ebe3155c7dc54f8afad9
URL:         http://cgit.haiku-os.org/haiku/commit/?id=1cac430
Author:      François Revol <revol@xxxxxxx>
Date:        Mon Nov  3 19:49:01 2014 UTC

ARM: Add an mmu_get_virtual_mapping() call to bootloader

Will be needed to figure out the framebuffer address
once we allocate it properly instead of hardcoding.

----------------------------------------------------------------------------

diff --git a/src/system/boot/arch/arm/arch_mmu.cpp 
b/src/system/boot/arch/arm/arch_mmu.cpp
index 890526e..56e6989 100644
--- a/src/system/boot/arch/arm/arch_mmu.cpp
+++ b/src/system/boot/arch/arm/arch_mmu.cpp
@@ -429,6 +429,28 @@ unmap_page(addr_t virtualAddress)
 }
 
 
+// XXX: use phys_addr_t ?
+extern "C" bool
+mmu_get_virtual_mapping(addr_t virtualAddress, /*phys_*/addr_t 
*_physicalAddress)
+{
+       if (virtualAddress < KERNEL_LOAD_BASE) {
+               panic("mmu_get_virtual_mapping: asked to lookup invalid page 
%p!\n",
+                       (void *)virtualAddress);
+               return false;
+       }
+
+       // map the page to the correct page table
+       uint32 *pageTable = get_or_create_page_table(virtualAddress,
+               ARM_MMU_L1_TYPE_COARSE);
+
+       uint32 pageTableIndex = VADDR_TO_PTENT(virtualAddress);
+
+       *_physicalAddress = pageTable[pageTableIndex] & ~(B_PAGE_SIZE - 1);
+
+       return true;
+}
+
+
 extern "C" void *
 mmu_allocate(void *virtualAddress, size_t size)
 {

############################################################################

Revision:    hrev48215
Commit:      361f5a857f6aebe050fc327109aae296eed2b0aa
URL:         http://cgit.haiku-os.org/haiku/commit/?id=361f5a8
Author:      François Revol <revol@xxxxxxx>
Date:        Mon Nov  3 19:59:25 2014 UTC

ARM: OMAP3: dynamically allocate the framebuffer

It seems to work on overo at least, which has only 128MB by default in QEMU.

----------------------------------------------------------------------------

diff --git a/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp 
b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
index 0fab14e..57c499f 100644
--- a/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
+++ b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
@@ -30,6 +30,8 @@
 //XXX
 extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
        uint32 flags);
+extern "C" bool
+mmu_get_virtual_mapping(addr_t virtualAddress, phys_addr_t *_physicalAddress);
 
 
 #define write_io_32(a, v) ((*(vuint32 *)a) = v)
@@ -322,20 +324,6 @@ status_t
 ArchFBArmOmap3::Probe()
 {
 
-#if 0
-       // TODO: More dynamic framebuffer base?
-       if (!fBase) {
-               int err = platform_allocate_region(&gFrameBufferBase,
-                       gKernelArgs.frame_buffer.physical_buffer.size, 0, 
false);
-               if (err < B_OK) return err;
-               gKernelArgs.frame_buffer.physical_buffer.start
-                       = (addr_t)gFrameBufferBase;
-               dprintf("video framebuffer: %p\n", gFrameBufferBase);
-       }
-#else
-       gKernelArgs.frame_buffer.physical_buffer.start = fBase;
-#endif
-
        gKernelArgs.frame_buffer.depth = 16;
        gKernelArgs.frame_buffer.width = 1024;
        gKernelArgs.frame_buffer.height = 768;
@@ -345,6 +333,26 @@ ArchFBArmOmap3::Probe()
                * gKernelArgs.frame_buffer.height
                * gKernelArgs.frame_buffer.depth / 8;
 
+#if 1
+       //dprintf("fBase %p\n", (void *)fBase);
+       if (!fBase || true) {
+               fBase = 0;
+               int err = platform_allocate_region((void **)&fBase,
+                       gKernelArgs.frame_buffer.physical_buffer.size, 0, 
false);
+               if (err < B_OK) return err;
+               if (!mmu_get_virtual_mapping(fBase, &fPhysicalBase))
+                       return B_ERROR;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)fPhysicalBase;
+               dprintf("video framebuffer: va: %p pa: %p\n", (void *)fBase,
+                       (void *)fPhysicalBase);
+       }
+#else
+       // TODO: More dynamic framebuffer base?
+       fPhysicalBase = fBase;
+       gKernelArgs.frame_buffer.physical_buffer.start = fPhysicalBase;
+#endif
+
        TRACE("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
                gKernelArgs.frame_buffer.height, 
gKernelArgs.frame_buffer.depth);
 
@@ -358,7 +366,7 @@ ArchFBArmOmap3::SetVideoMode(int width, int height, int 
depth)
        TRACE("%s: %dx%d@%d\n", __func__, width, height, depth);
 
        omap_set_lcd_mode(width, height);
-       omap_attach_framebuffer(fBase, width, height, depth);
+       omap_attach_framebuffer(fPhysicalBase, width, height, depth);
 
        return B_OK;
 }


Other related posts:

  • » [haiku-commits] haiku: hrev48215 - src/system/boot/arch/arm - revol