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; }