[haiku-commits] haiku: hrev44643 - in src/system/boot: arch/arm platform/u-boot

  • From: kallisti5@xxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 15 Sep 2012 20:24:45 +0200 (CEST)

hrev44643 adds 4 changesets to branch 'master'
old head: 8e813c26cde335c408493c86f544421eb355ffac
new head: 8eeafbce5f491129c36c8d1cb42a207816b9f3af

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

d501b69: rPi: Set 1 cpu in the loader

7ccc9b4: arm loader: Style cleanup of loader arm arch code
  
  * These video sources would be good cannidates to be
    refactored as classes. (like the arm serial code)
  * No functional change. There are some order style issues
    in some of the code (the top externs), but I decided to
    not fix them as I can't build these atm to test.

58f219d: beagleboard: Fix build, missing header

8eeafbc: arm framebuffer: Convert arm arch_video code into classes
  
  * Proper framebuffer code is chosen based on hardware
  * This change could extend into other arch code as well
  * François gave permission to update his copyrights
  * Minimal functional change

                          [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ]

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

11 files changed, 362 insertions(+), 354 deletions(-)
src/system/boot/arch/arm/Jamfile                   |    7 +-
src/system/boot/arch/arm/arch_framebuffer.h        |   51 +++++
src/system/boot/arch/arm/arch_framebuffer_920.cpp  |   93 ++++++++
..._video_omap3.cpp => arch_framebuffer_omap3.cpp} |  176 +++++++++-------
...arch_video_pxa.cpp => arch_framebuffer_pxa.cpp} |  140 ++++++------
src/system/boot/arch/arm/arch_video.cpp            |   68 ------
src/system/boot/arch/arm/arch_video.h              |   17 --
src/system/boot/arch/arm/arch_video_920.cpp        |   93 --------
src/system/boot/platform/raspberrypi_arm/cpu.cpp   |    4 +-
src/system/boot/platform/u-boot/video.cpp          |   61 +++---
src/system/kernel/arch/arm/arch_uart_8250.cpp      |    6 +-

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

Commit:      d501b694bfec1de13313b3cac5eee25b4647f916
URL:         http://cgit.haiku-os.org/haiku/commit/?id=d501b69
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Fri Sep 14 20:38:10 2012 UTC

rPi: Set 1 cpu in the loader

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

diff --git a/src/system/boot/platform/raspberrypi_arm/cpu.cpp 
b/src/system/boot/platform/raspberrypi_arm/cpu.cpp
index bc2f15f..f8d27d9 100644
--- a/src/system/boot/platform/raspberrypi_arm/cpu.cpp
+++ b/src/system/boot/platform/raspberrypi_arm/cpu.cpp
@@ -35,6 +35,8 @@ spin(bigtime_t microseconds)
 extern "C" void
 cpu_init()
 {
+       gKernelArgs.num_cpus = 1;
+               // this will eventually be corrected later on
+
 #warning IMPLEMENT cpu_init
 }
-

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

Commit:      7ccc9b45e879ebc3ec9b711ff3c4e48d173828c8
URL:         http://cgit.haiku-os.org/haiku/commit/?id=7ccc9b4
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Sat Sep 15 14:23:26 2012 UTC

arm loader: Style cleanup of loader arm arch code

* These video sources would be good cannidates to be
  refactored as classes. (like the arm serial code)
* No functional change. There are some order style issues
  in some of the code (the top externs), but I decided to
  not fix them as I can't build these atm to test.

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

diff --git a/src/system/boot/arch/arm/arch_video.cpp 
b/src/system/boot/arch/arm/arch_video.cpp
index bc53b92..8da3ef5 100644
--- a/src/system/boot/arch/arm/arch_video.cpp
+++ b/src/system/boot/arch/arm/arch_video.cpp
@@ -20,8 +20,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+
 //XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, 
uint32 flags);
+extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
+       uint32 flags);
 
 
 #define TRACE_VIDEO
@@ -37,7 +39,6 @@ extern "C" addr_t mmu_map_physical_memory(addr_t 
physicalAddress, size_t size, u
 #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-
 #if !BOARD_CPU_PXA270 && !BOARD_CPU_OMAP3 && !BOARD_CPU_ARM920T
 //     #pragma mark -
 
@@ -64,5 +65,3 @@ arch_set_default_video_mode()
 
 
 #endif
-
-
diff --git a/src/system/boot/arch/arm/arch_video_920.cpp 
b/src/system/boot/arch/arm/arch_video_920.cpp
index 4be91e3..f345b71 100644
--- a/src/system/boot/arch/arm/arch_video_920.cpp
+++ b/src/system/boot/arch/arm/arch_video_920.cpp
@@ -20,8 +20,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+
 //XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, 
uint32 flags);
+extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
+       uint32 flags);
 
 
 #define TRACE_VIDEO
@@ -37,10 +39,12 @@ extern "C" addr_t mmu_map_physical_memory(addr_t 
physicalAddress, size_t size, u
 #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-
 #if BOARD_CPU_ARM920T
+
+
 //     #pragma mark -
 
+
 extern void *gFrameBufferBase;
 
 status_t
@@ -50,15 +54,18 @@ arch_probe_video_mode(void)
        gKernelArgs.frame_buffer.width = 1024;
        gKernelArgs.frame_buffer.height = 768;
        gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
-       gKernelArgs.frame_buffer.physical_buffer.size = 
gKernelArgs.frame_buffer.width
+       gKernelArgs.frame_buffer.physical_buffer.size
+               = gKernelArgs.frame_buffer.width
                * gKernelArgs.frame_buffer.height
                * gKernelArgs.frame_buffer.depth / 8;
 
 #if 0
        if (!gFrameBufferBase) {
-               int err = platform_allocate_region(&gFrameBufferBase, 
gKernelArgs.frame_buffer.physical_buffer.size, 0, false);
+               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;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase;
                dprintf("video framebuffer: %p\n", gFrameBufferBase);
        }
 #else
diff --git a/src/system/boot/arch/arm/arch_video_omap3.cpp 
b/src/system/boot/arch/arm/arch_video_omap3.cpp
index fe7f45f..5d96aa2 100644
--- a/src/system/boot/arch/arm/arch_video_omap3.cpp
+++ b/src/system/boot/arch/arm/arch_video_omap3.cpp
@@ -20,8 +20,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+
 //XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, 
uint32 flags);
+extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
+       uint32 flags);
 
 
 #define TRACE_VIDEO
@@ -37,7 +39,6 @@ extern "C" addr_t mmu_map_physical_memory(addr_t 
physicalAddress, size_t size, u
 #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-
 #if BOARD_CPU_OMAP3
 //     #pragma mark -
 
@@ -87,13 +88,15 @@ struct video_mode modes[] = {
 };
 
 
-static inline void setaddr(uint32 reg, unsigned int v)
+static inline void
+setaddr(uint32 reg, unsigned int v)
 {
        *((volatile uint32 *)(reg)) = v;
 }
 
 
-static inline void modaddr(unsigned int reg, unsigned int m, unsigned int v)
+static inline void
+modaddr(unsigned int reg, unsigned int m, unsigned int v)
 {
        uint32 o;
 
@@ -104,31 +107,35 @@ static inline void modaddr(unsigned int reg, unsigned int 
m, unsigned int v)
 }
 
 
-static inline void setreg(uint32 base, unsigned int reg, unsigned int v)
+static inline
+void setreg(uint32 base, unsigned int reg, unsigned int v)
 {
-       *((volatile uint32 *)(base+reg)) = v;
+       *((volatile uint32 *)(base + reg)) = v;
 }
 
 
-static inline uint32 readreg(uint32 base, unsigned int reg)
+static inline
+uint32 readreg(uint32 base, unsigned int reg)
 {
-       return *((volatile uint32 *)(base+reg));
+       return *((volatile uint32 *)(base + reg));
 }
 
 
-static inline void modreg(uint32 base, unsigned int reg, unsigned int m, 
unsigned int v)
+static inline void
+modreg(uint32 base, unsigned int reg, unsigned int m, unsigned int v)
 {
        uint32 o;
 
-       o = *((volatile uint32 *)(base+reg));
+       o = *((volatile uint32 *)(base + reg));
        o &= ~m;
        o |= v;
-       *((volatile uint32 *)(base+reg)) = o;
+       *((volatile uint32 *)(base + reg)) = o;
 }
 
 
 // init beagle gpio for video
-static void omap_beagle_init(void)
+static void
+omap_beagle_init(void)
 {
        // setup GPIO stuff, i can't find any references to these
        setreg(GPIO1_BASE, GPIO_OE, 0xfefffedf);
@@ -137,7 +144,8 @@ static void omap_beagle_init(void)
 }
 
 
-static void omap_clock_init(void)
+static void
+omap_clock_init(void)
 {
        // sets pixel clock to 72MHz
 
@@ -159,15 +167,18 @@ static void omap_clock_init(void)
 }
 
 
-static void omap_dss_init(void)
+static void
+omap_dss_init(void)
 {
        setreg(DSS_BASE, DSS_SYSCONFIG, DSS_AUTOIDLE);
        // Select DSS1 ALWON as clock source
-       setreg(DSS_BASE, DSS_CONTROL, DSS_VENC_OUT_SEL | DSS_DAC_POWERDN_BGZ | 
DSS_DAC_DEMEN | DSS_VENC_CLOCK_4X_ENABLE);
+       setreg(DSS_BASE, DSS_CONTROL, DSS_VENC_OUT_SEL | DSS_DAC_POWERDN_BGZ
+               | DSS_DAC_DEMEN | DSS_VENC_CLOCK_4X_ENABLE);
 }
 
 
-static void omap_dispc_init(void)
+static void
+omap_dispc_init(void)
 {
        uint32 DISPC = DISPC_BASE;
 
@@ -220,18 +231,18 @@ static void omap_set_lcd_mode(int w, int h) {
 
        dprintf("omap3: set_lcd_mode %d,%d\n", w, h);
 
-       for (i=0;i<sizeof(modes)/sizeof(modes[0]);i++) {
-               if (w <= modes[i].width 
-                   && h <= modes[i].height)
+       for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) {
+               if (w <= modes[i].width
+                       && h <= modes[i].height)
                goto found;
        }
        i -= 1;
 found:
        m = &modes[i];
-       
+
        dprintf("omap3: found mode[%s]\n", m->name);
 
-       setreg(DISPC, DISPC_SIZE_LCD, (m->width - 1) | ((m->height-1) << 16));
+       setreg(DISPC, DISPC_SIZE_LCD, (m->width - 1) | ((m->height - 1) << 16));
        setreg(DISPC, DISPC_TIMING_H, m->dispc_timing_h);
        setreg(DISPC, DISPC_TIMING_V, m->dispc_timing_v);
 
@@ -240,18 +251,19 @@ found:
 
        // Tell hardware to update, and wait for it
        modreg(DISPC, DISPC_CONTROL,
-             DISPC_GOLCD,
-             DISPC_GOLCD);
+               DISPC_GOLCD,
+               DISPC_GOLCD);
 
        while ((readreg(DISPC, DISPC_CONTROL) & DISPC_GOLCD))
                ;
 }
 
 
-static void omap_attach_framebuffer(void *data, int width, int height, int 
depth)
+static void
+omap_attach_framebuffer(void *data, int width, int height, int depth)
 {
        uint32 DISPC = DISPC_BASE;
-       uint32 gsize = ((height-1)<<16) | (width-1);
+       uint32 gsize = ((height - 1) << 16) | (width - 1);
 
        dprintf("omap3: attach bitmap (%d,%d) %p to screen\n", width, height, 
data);
 
@@ -263,22 +275,20 @@ static void omap_attach_framebuffer(void *data, int 
width, int height, int depth
        setreg(DISPC, DISPC_GFX_ROW_INC, 1);
        setreg(DISPC, DISPC_GFX_PIXEL_INC, 1);
        setreg(DISPC, DISPC_GFX_WINDOW_SKIP, 0);
-       setreg(DISPC, DISPC_GFX_ATTRIBUTES,
-              DISPC_GFXFORMAT_RGB16
-              | DISPC_GFXBURSTSIZE_16x32
-              | DISPC_GFXENABLE);
+       setreg(DISPC, DISPC_GFX_ATTRIBUTES, DISPC_GFXFORMAT_RGB16
+               | DISPC_GFXBURSTSIZE_16x32 | DISPC_GFXENABLE);
 
        // Tell hardware to update, and wait for it
-       modreg(DISPC, DISPC_CONTROL,
-              DISPC_GOLCD,
-              DISPC_GOLCD);
-       
+       modreg(DISPC, DISPC_CONTROL, DISPC_GOLCD, DISPC_GOLCD);
+
        while ((readreg(DISPC, DISPC_CONTROL) & DISPC_GOLCD))
                ;
 }
 
 
-static void omap_init(void) {
+static void
+omap_init(void)
+{
        dprintf("omap3: video_init()\n");
 
        setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000);
@@ -298,15 +308,18 @@ arch_probe_video_mode(void)
        gKernelArgs.frame_buffer.width = 1024;
        gKernelArgs.frame_buffer.height = 768;
        gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
-       gKernelArgs.frame_buffer.physical_buffer.size = 
gKernelArgs.frame_buffer.width
+       gKernelArgs.frame_buffer.physical_buffer.size
+               = gKernelArgs.frame_buffer.width
                * gKernelArgs.frame_buffer.height
                * gKernelArgs.frame_buffer.depth / 8;
 
 #if 0
        if (!gFrameBufferBase) {
-               int err = platform_allocate_region(&gFrameBufferBase, 
gKernelArgs.frame_buffer.physical_buffer.size, 0, false);
+               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;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase;
                dprintf("video framebuffer: %p\n", gFrameBufferBase);
        }
 #else
@@ -347,5 +360,3 @@ arch_set_default_video_mode()
 
 
 #endif
-
-
diff --git a/src/system/boot/arch/arm/arch_video_pxa.cpp 
b/src/system/boot/arch/arm/arch_video_pxa.cpp
index 55bb4b2..41ff526 100644
--- a/src/system/boot/arch/arm/arch_video_pxa.cpp
+++ b/src/system/boot/arch/arm/arch_video_pxa.cpp
@@ -20,8 +20,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+
 //XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size, 
uint32 flags);
+extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
+       uint32 flags);
 
 
 #define TRACE_VIDEO
@@ -37,8 +39,9 @@ extern "C" addr_t mmu_map_physical_memory(addr_t 
physicalAddress, size_t size, u
 #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-
 #if BOARD_CPU_PXA270
+
+
 //     #pragma mark -
 
 
@@ -89,7 +92,8 @@ arch_probe_video_mode(void)
        gKernelArgs.frame_buffer.height = (read_io_32(LCCR2) & ((1 << 10) - 1)) 
+ 1;
        gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width
                * sizeof(uint32);
-       gKernelArgs.frame_buffer.physical_buffer.size = 
gKernelArgs.frame_buffer.width
+       gKernelArgs.frame_buffer.physical_buffer.size
+               = gKernelArgs.frame_buffer.width
                * gKernelArgs.frame_buffer.height
                * gKernelArgs.frame_buffer.depth / 8;
 
@@ -98,11 +102,11 @@ arch_probe_video_mode(void)
 
        gKernelArgs.frame_buffer.enabled = true;
 
-       
 
        return B_OK;
 }
 
+
 status_t
 arch_set_video_mode(int width, int height, int depth)
 {
@@ -110,7 +114,7 @@ arch_set_video_mode(int width, int height, int depth)
        status_t err;
        void *fb;
        uint32 fbSize = width * height * depth / 8;
-       //fb = malloc(800*600*4 + 16 - 1);
+       //fb = malloc(800 * 600 * 4 + 16 - 1);
        //fb = (void *)(((uint32)fb) & ~(0x0f));
        //fb = scratch - 800;
        //fb = (void *)0xa0000000;
@@ -123,18 +127,20 @@ arch_set_video_mode(int width, int height, int depth)
 #endif
 #if 0
        if (!gFrameBufferBase) {
-               //XXX: realloc if larger !!!
+               // XXX: realloc if larger !!!
                err = platform_allocate_region(&gFrameBufferBase, fbSize, 0, 
false);
 dprintf("error %08x\n", err);
                if (err < B_OK)
                        return err;
-               gKernelArgs.frame_buffer.physical_buffer.start = 
(addr_t)gFrameBufferBase;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase;
 /*
                gFrameBufferBase = (void *)mmu_map_physical_memory(
                        0xa8000000, fbSize, 0);
                if (gFrameBufferBase == NULL)
                        return B_NO_MEMORY;
-               gKernelArgs.frame_buffer.physical_buffer.start = 
(addr_t)gFrameBufferBase;//0xa8000000;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase; // 0xa8000000;
 */
        }
 #endif
@@ -142,7 +148,6 @@ dprintf("error %08x\n", err);
 
        dprintf("fb @ %p\n", fb);
 
-       
        sVideoDMADesc.fdadr = ((uint32)&sVideoDMADesc & ~0x0f) | 0x01;
        sVideoDMADesc.fsadr = (uint32)(fb) & ~0x0f;
        sVideoDMADesc.fidr = 0;
@@ -172,7 +177,8 @@ dprintf("error %08x\n", err);
                }
                write_io_32(LCCR1, (0 << 0) | (width - 1));
                write_io_32(LCCR2, (0 << 0) | (height - 1));
-               write_io_32(LCCR3, (pdfor << 30) | ((bpp >> 3) << 29) | ((bpp & 
0x07) << 24));
+               write_io_32(LCCR3, (pdfor << 30) | ((bpp >> 3) << 29)
+                       | ((bpp & 0x07) << 24));
                write_io_32(FDADR0, sVideoDMADesc.fdadr);
                write_io_32(LCCR0, read_io_32(LCCR0) | 0x01800001);     // no 
ints +ENB
                write_io_32(FBR0, sVideoDMADesc.fdadr);
@@ -183,13 +189,13 @@ dprintf("error %08x\n", err);
                dumpr(LCCR4);
        } else
                return EALREADY; // for now
-       
+
        // clear the video memory
        memset((void *)fb, 0, fbSize);
 
        // XXX test pattern
        for (int i = 0; i < 128; i++) {
-               ((uint32 *)fb)[i+16] = 0x000000ff << ((i%4) * 8);
+               ((uint32 *)fb)[i + 16] = 0x000000ff << ((i%4) * 8);
                scratch[i] = 0x000000ff << ((i%4) * 8);
        }
 
@@ -207,5 +213,3 @@ arch_set_default_video_mode()
 
 
 #endif
-
-

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

Commit:      58f219d49f15771c0df4c7d1f53790ca0689c603
URL:         http://cgit.haiku-os.org/haiku/commit/?id=58f219d
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Sat Sep 15 17:50:08 2012 UTC

beagleboard: Fix build, missing header

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

diff --git a/src/system/kernel/arch/arm/arch_uart_8250.cpp 
b/src/system/kernel/arch/arm/arch_uart_8250.cpp
index 6e91e6f..a2efda5 100644
--- a/src/system/kernel/arch/arm/arch_uart_8250.cpp
+++ b/src/system/kernel/arch/arm/arch_uart_8250.cpp
@@ -6,10 +6,12 @@
  *             François Revol, revol@xxxxxxx
  */
 
-#include <debug.h>
+
+#include <arch/arm/reg.h>
 #include <arch/generic/debug_uart_8250.h>
-#include <new>
 #include <board_config.h>
+#include <debug.h>
+#include <new>
 
 
 class ArchUART8250 : public DebugUART8250 {

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

Revision:    hrev44643
Commit:      8eeafbce5f491129c36c8d1cb42a207816b9f3af
URL:         http://cgit.haiku-os.org/haiku/commit/?id=8eeafbc
Author:      Alexander von Gluck IV <kallisti5@xxxxxxxxxxx>
Date:        Sat Sep 15 18:21:45 2012 UTC

arm framebuffer: Convert arm arch_video code into classes

* Proper framebuffer code is chosen based on hardware
* This change could extend into other arch code as well
* François gave permission to update his copyrights
* Minimal functional change

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

diff --git a/src/system/boot/arch/arm/Jamfile b/src/system/boot/arch/arm/Jamfile
index cd3dd05..7d3d143 100644
--- a/src/system/boot/arch/arm/Jamfile
+++ b/src/system/boot/arch/arm/Jamfile
@@ -27,10 +27,9 @@ KernelMergeObject boot_arch_$(TARGET_ARCH).o :
        arch_uart_8250.cpp
        arch_uart_pl011.cpp
        arch_elf.cpp
-       arch_video.cpp
-       arch_video_920.cpp
-       arch_video_pxa.cpp
-       arch_video_omap3.cpp
+       arch_framebuffer_920.cpp
+       arch_framebuffer_pxa.cpp
+       arch_framebuffer_omap3.cpp
        $(librootArchObjects)
        : -fno-pic
        :
diff --git a/src/system/boot/arch/arm/arch_framebuffer.h 
b/src/system/boot/arch/arm/arch_framebuffer.h
new file mode 100644
index 0000000..6057d0f
--- /dev/null
+++ b/src/system/boot/arch/arm/arch_framebuffer.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2011-2012 Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Alexander von Gluck IV, kallisti5@xxxxxxxxxxx
+ */
+#ifndef _ARCH_FRAMEBUFFER_H
+#define _ARCH_FRAMEBUFFER_H
+
+
+#include <boot/platform.h>
+#include <SupportDefs.h>
+
+
+#define TRACE_VIDEO
+#ifdef TRACE_VIDEO
+#   define TRACE(x...) dprintf(x)
+#      define CALLED() dprintf("%s()\n", __func__);
+#else
+#   define TRACE(x...) ;
+#      define CALLED() ;
+#endif
+#define ERROR(x...) dprintf(x)
+
+
+class ArchFramebuffer {
+public:
+                                                       ArchFramebuffer(addr_t 
base)
+                                                               :
+                                                               fBase(base) {};
+                                                       ~ArchFramebuffer() {};
+
+       virtual status_t                Init() { return B_OK; };
+       virtual status_t                Probe() { return B_OK; };
+       virtual status_t                SetDefaultMode() { return B_OK; };
+       virtual status_t                SetVideoMode(int width, int height, int 
depth)
+                                                               { return B_OK; 
};
+
+       virtual addr_t                  Base() { return fBase; };
+
+protected:
+                       addr_t                  fBase;
+private:
+                       int                             fCurrentWidth;
+                       int                             fCurrentHeight;
+                       int                             fCurrentDepth;
+};
+
+
+#endif /* _ARCH_FRAMEBUFFER_H */
diff --git a/src/system/boot/arch/arm/arch_video_920.cpp 
b/src/system/boot/arch/arm/arch_framebuffer_920.cpp
similarity index 53%
rename from src/system/boot/arch/arm/arch_video_920.cpp
rename to src/system/boot/arch/arm/arch_framebuffer_920.cpp
index f345b71..ee2125d 100644
--- a/src/system/boot/arch/arm/arch_video_920.cpp
+++ b/src/system/boot/arch/arm/arch_framebuffer_920.cpp
@@ -1,10 +1,14 @@
 /*
- * Copyright 2009, François Revol, revol@xxxxxxxx
+ * Copyright 2009-2012 Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             François Revol, revol@xxxxxxx
+ *             Alexander von Gluck IV, kallisti5@xxxxxxxxxxx
  */
 
 
-#include "arch_video.h"
+#include "arch_framebuffer.h"
 
 #include <arch/cpu.h>
 #include <boot/stage2.h>
@@ -12,89 +16,78 @@
 #include <boot/menu.h>
 #include <boot/kernel_args.h>
 #include <boot/platform/generic/video.h>
-#include <board_config.h>
-#include <util/list.h>
 #include <drivers/driver_settings.h>
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 
+class ArchFBArm920 : public ArchFramebuffer {
+public:
+                                                       ArchFBArm920(addr_t 
base);
+                                                       ~ArchFBArm920();
+                       status_t                Init();
+                       status_t                Probe();
+                       status_t                SetDefaultMode();
+                       status_t                SetVideoMode(int width, int 
height, int depth);
+};
 
-//XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
-       uint32 flags);
+ArchFBArm920 *arch_get_fb_arm_920(addr_t base);
 
 
-#define TRACE_VIDEO
-#ifdef TRACE_VIDEO
-#      define TRACE(x) dprintf x
-#else
-#      define TRACE(x) ;
-#endif
-
-#define write_io_32(a, v) ((*(vuint32 *)a) = v)
-#define read_io_32(a) (*(vuint32 *)a)
-
-#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
-
-
-#if BOARD_CPU_ARM920T
-
-
-//     #pragma mark -
+status_t
+ArchFBArm920::Init()
+{
+       gKernelArgs.frame_buffer.enabled = true;
 
+#warning TODO: ARM920 init
+       return B_OK;
+}
 
-extern void *gFrameBufferBase;
 
 status_t
-arch_probe_video_mode(void)
+ArchFBArm920::Probe()
 {
-       gKernelArgs.frame_buffer.depth = 16;
-       gKernelArgs.frame_buffer.width = 1024;
-       gKernelArgs.frame_buffer.height = 768;
-       gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
-       gKernelArgs.frame_buffer.physical_buffer.size
-               = gKernelArgs.frame_buffer.width
-               * gKernelArgs.frame_buffer.height
-               * gKernelArgs.frame_buffer.depth / 8;
-
 #if 0
-       if (!gFrameBufferBase) {
+       // 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;
+               if (err < B_OK)
+                       return err;
                gKernelArgs.frame_buffer.physical_buffer.start
                        = (addr_t)gFrameBufferBase;
                dprintf("video framebuffer: %p\n", gFrameBufferBase);
        }
 #else
-       gFrameBufferBase = (void *)0x88000000;
-       gKernelArgs.frame_buffer.physical_buffer.start = 
(addr_t)gFrameBufferBase;
+       gKernelArgs.frame_buffer.physical_buffer.start = fBase;
 #endif
 
+       gKernelArgs.frame_buffer.depth = 16;
+       gKernelArgs.frame_buffer.width = 1024;
+       gKernelArgs.frame_buffer.height = 768;
+       gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
+       gKernelArgs.frame_buffer.physical_buffer.size
+               = gKernelArgs.frame_buffer.width
+               * gKernelArgs.frame_buffer.height
+               * gKernelArgs.frame_buffer.depth / 8;
+
        dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
                gKernelArgs.frame_buffer.height, 
gKernelArgs.frame_buffer.depth);
 
-       gKernelArgs.frame_buffer.enabled = true;
        return B_OK;
 }
 
 
 status_t
-arch_set_video_mode(int width, int height, int depth)
+ArchFBArm920::SetDefaultMode()
 {
-       return B_OK;
+       return SetVideoMode(gKernelArgs.frame_buffer.width,
+               gKernelArgs.frame_buffer.height,
+               gKernelArgs.frame_buffer.depth);
 }
 
 
 status_t
-arch_set_default_video_mode()
+ArchFBArm920::SetVideoMode(int width, int height, int depth)
 {
-       return arch_set_video_mode(800, 600, 32);
+       #warning TODO: ArchFBArm920 SetVideoMode
+       return B_OK;
 }
-
-
-#endif
-
-
diff --git a/src/system/boot/arch/arm/arch_video_omap3.cpp 
b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
similarity index 84%
rename from src/system/boot/arch/arm/arch_video_omap3.cpp
rename to src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
index 5d96aa2..1ebffef 100644
--- a/src/system/boot/arch/arm/arch_video_omap3.cpp
+++ b/src/system/boot/arch/arm/arch_framebuffer_omap3.cpp
@@ -1,11 +1,16 @@
 /*
- * Copyright 2009, François Revol, revol@xxxxxxxx
+ * Copyright 2009-2012 Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *      François Revol, revol@xxxxxxx
+ *      Alexander von Gluck IV, kallisti5@xxxxxxxxxxx
  */
 
 
-#include "arch_video.h"
+#include "arch_framebuffer.h"
 
+#include <arch/arm/omap3.h>
 #include <arch/cpu.h>
 #include <boot/stage2.h>
 #include <boot/platform.h>
@@ -20,31 +25,35 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "graphics/omap/omap3_regs.h"
+
 
 //XXX
 extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
        uint32 flags);
 
 
-#define TRACE_VIDEO
-#ifdef TRACE_VIDEO
-#      define TRACE(x) dprintf x
-#else
-#      define TRACE(x) ;
-#endif
-
 #define write_io_32(a, v) ((*(vuint32 *)a) = v)
 #define read_io_32(a) (*(vuint32 *)a)
 
 #define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-#if BOARD_CPU_OMAP3
-//     #pragma mark -
+class ArchFBArmOmap3 : public ArchFramebuffer {
+public:
+                                                       ArchFBArmOmap3(addr_t 
base);
+                                                       ~ArchFBArmOmap3();
+                       status_t                Init();
+                       status_t                Probe();
+                       status_t                SetDefaultMode();
+                       status_t                SetVideoMode(int width, int 
height, int depth);
+};
 
-#include "graphics/omap/omap3_regs.h"
+ArchFBArmOmap3 *arch_get_fb_arm_omap3(addr_t base);
+
+
+//     #pragma mark -
 
-extern void *gFrameBufferBase;
 
 struct video_mode {
        short width, height;
@@ -224,7 +233,9 @@ omap_dispc_init(void)
 }
 
 
-static void omap_set_lcd_mode(int w, int h) {
+static void
+omap_set_lcd_mode(int w, int h)
+{
        uint32 DISPC = DISPC_BASE;
        unsigned int i;
        struct video_mode *m;
@@ -260,12 +271,12 @@ found:
 
 
 static void
-omap_attach_framebuffer(void *data, int width, int height, int depth)
+omap_attach_framebuffer(addr_t data, int width, int height, int depth)
 {
        uint32 DISPC = DISPC_BASE;
        uint32 gsize = ((height - 1) << 16) | (width - 1);
 
-       dprintf("omap3: attach bitmap (%d,%d) %p to screen\n", width, height, 
data);
+       dprintf("omap3: attach bitmap (%d,%d) to screen\n", width, height);
 
        setreg(DISPC, DISPC_GFX_BA0, (uint32)data);
        setreg(DISPC, DISPC_GFX_BA1, (uint32)data);
@@ -286,10 +297,10 @@ omap_attach_framebuffer(void *data, int width, int 
height, int depth)
 }
 
 
-static void
-omap_init(void)
+status_t
+ArchFBArmOmap3::Init()
 {
-       dprintf("omap3: video_init()\n");
+       gKernelArgs.frame_buffer.enabled = true;
 
        setreg(DISPC_BASE, DISPC_IRQENABLE, 0x00000);
        setreg(DISPC_BASE, DISPC_IRQSTATUS, 0x1ffff);
@@ -298,23 +309,18 @@ omap_init(void)
        omap_clock_init();
        omap_dss_init();
        omap_dispc_init();
+
+       return B_OK;
 }
 
 
 status_t
-arch_probe_video_mode(void)
+ArchFBArmOmap3::Probe()
 {
-       gKernelArgs.frame_buffer.depth = 16;
-       gKernelArgs.frame_buffer.width = 1024;
-       gKernelArgs.frame_buffer.height = 768;
-       gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
-       gKernelArgs.frame_buffer.physical_buffer.size
-               = gKernelArgs.frame_buffer.width
-               * gKernelArgs.frame_buffer.height
-               * gKernelArgs.frame_buffer.depth / 8;
 
 #if 0
-       if (!gFrameBufferBase) {
+       // 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;
@@ -323,40 +329,43 @@ arch_probe_video_mode(void)
                dprintf("video framebuffer: %p\n", gFrameBufferBase);
        }
 #else
-       gFrameBufferBase = (void *)0x88000000;
-       gKernelArgs.frame_buffer.physical_buffer.start = 
(addr_t)gFrameBufferBase;
+       gKernelArgs.frame_buffer.physical_buffer.start = fBase;
 #endif
 
-       dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
-               gKernelArgs.frame_buffer.height, 
gKernelArgs.frame_buffer.depth);
-
-       gKernelArgs.frame_buffer.enabled = true;
+       gKernelArgs.frame_buffer.depth = 16;
+       gKernelArgs.frame_buffer.width = 1024;
+       gKernelArgs.frame_buffer.height = 768;
+       gKernelArgs.frame_buffer.bytes_per_row = gKernelArgs.frame_buffer.width 
* 2;
+       gKernelArgs.frame_buffer.physical_buffer.size
+               = gKernelArgs.frame_buffer.width
+               * gKernelArgs.frame_buffer.height
+               * gKernelArgs.frame_buffer.depth / 8;
 
-       omap_init();
+       TRACE("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
+               gKernelArgs.frame_buffer.height, 
gKernelArgs.frame_buffer.depth);
 
        return B_OK;
 }
 
 
 status_t
-arch_set_video_mode(int width, int height, int depth)
+ArchFBArmOmap3::SetVideoMode(int width, int height, int depth)
 {
-       dprintf("arch_set_video_mode %d,%d @ %d\n", width, height, depth);
+       TRACE("%s: %dx%d@%d\n", __func__, width, height, depth);
 
        omap_set_lcd_mode(width, height);
-       omap_attach_framebuffer(gFrameBufferBase, width, height, depth);
+       omap_attach_framebuffer(fBase, width, height, depth);
 
        return B_OK;
 }
 
 
 status_t
-arch_set_default_video_mode()
+ArchFBArmOmap3::SetDefaultMode()
 {
-       dprintf("arch_set_default_video_mode()\n");
+       CALLED();
 
-       return arch_set_video_mode(1024, 768, 16);
+       return SetVideoMode(gKernelArgs.frame_buffer.width,
+               gKernelArgs.frame_buffer.height,
+               gKernelArgs.frame_buffer.depth);
 }
-
-
-#endif
diff --git a/src/system/boot/arch/arm/arch_video_pxa.cpp 
b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp
similarity index 79%
rename from src/system/boot/arch/arm/arch_video_pxa.cpp
rename to src/system/boot/arch/arm/arch_framebuffer_pxa.cpp
index 41ff526..196401d 100644
--- a/src/system/boot/arch/arm/arch_video_pxa.cpp
+++ b/src/system/boot/arch/arm/arch_framebuffer_pxa.cpp
@@ -1,10 +1,14 @@
 /*
- * Copyright 2009, François Revol, revol@xxxxxxxx
+ * Copyright 2009-2012 Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *      François Revol, revol@xxxxxxx
+ *      Alexander von Gluck IV, kallisti5@xxxxxxxxxxx
  */
 
 
-#include "arch_video.h"
+#include "arch_framebuffer.h"
 
 #include <arch/cpu.h>
 #include <boot/stage2.h>
@@ -26,35 +30,70 @@ extern "C" addr_t mmu_map_physical_memory(addr_t 
physicalAddress, size_t size,
        uint32 flags);
 
 
-#define TRACE_VIDEO
-#ifdef TRACE_VIDEO
-#      define TRACE(x) dprintf x
-#else
-#      define TRACE(x) ;
-#endif
+class ArchFBArmPxa270 : public ArchFramebuffer {
+public:
+                                                       ArchFBArmPxa270(addr_t 
base);
+                                                       ~ArchFBArmPxa270();
+                       status_t                Init();
+                       status_t                Probe();
+                       status_t                SetDefaultMode();
+                       status_t                SetVideoMode(int width, int 
height, int depth);
+};
 
-#define write_io_32(a, v) ((*(vuint32 *)a) = v)
-#define read_io_32(a) (*(vuint32 *)a)
+ArchFBArmPxa270 *arch_get_fb_arm_pxa270(addr_t base);
 
-#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
+//  #pragma mark -
 
-#if BOARD_CPU_PXA270
 
+#define write_io_32(a, v) ((*(vuint32 *)a) = v)
+#define read_io_32(a) (*(vuint32 *)a)
 
-//     #pragma mark -
+#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
 
 
-extern void *gFrameBufferBase;
 static struct pxa27x_lcd_dma_descriptor sVideoDMADesc;
 static uint32 scratch[128] __attribute__((aligned(16)));
 
 
 status_t
-arch_probe_video_mode(void)
+ArchFBArmPxa270::Init()
 {
-       dprintf("%s()\n", __FUNCTION__);
-       uint32 bppCode, pixelFormat;
+       gKernelArgs.frame_buffer.enabled = true;
+       return B_OK;
+}
+
+
+status_t
+ArchFBArmPxa270::Probe()
+{
+       CALLED();
+
+#if 0
+       // TODO: More dynamic framebuffer base?
+       if (!fBase) {
+               // XXX: realloc if larger !!!
+               err = platform_allocate_region(&gFrameBufferBase, fbSize, 0, 
false);
+dprintf("error %08x\n", err);
+               if (err < B_OK)
+                       return err;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase;
+/*
+               gFrameBufferBase = (void *)mmu_map_physical_memory(
+                       0xa8000000, fbSize, 0);
+               if (gFrameBufferBase == NULL)
+                       return B_NO_MEMORY;
+               gKernelArgs.frame_buffer.physical_buffer.start
+                       = (addr_t)gFrameBufferBase; // 0xa8000000;
+*/
+       }
+#else
+       gKernelArgs.frame_buffer.physical_buffer.start = fBase;
+#endif
+
+       uint32 bppCode;
+       uint32 pixelFormat;
        struct pxa27x_lcd_dma_descriptor *dma;
 
        // check if LCD controller is enabled
@@ -83,7 +122,7 @@ arch_probe_video_mode(void)
                case 10:
                        gKernelArgs.frame_buffer.depth = 32; // RGB888
                        break;
-               defaut:
+               default:
                        return B_ERROR;
        }
 
@@ -100,15 +139,12 @@ arch_probe_video_mode(void)
        dprintf("video mode: %ux%ux%u\n", gKernelArgs.frame_buffer.width,
                gKernelArgs.frame_buffer.height, 
gKernelArgs.frame_buffer.depth);
 
-       gKernelArgs.frame_buffer.enabled = true;
-
-
        return B_OK;
 }
 
 
 status_t
-arch_set_video_mode(int width, int height, int depth)
+ArchFBArmPxa270::SetVideoMode(int width, int height, int depth)
 {
        dprintf("%s(%d, %d, %d)\n", __FUNCTION__, width, height, depth);
        status_t err;
@@ -119,32 +155,9 @@ arch_set_video_mode(int width, int height, int depth)
        //fb = scratch - 800;
        //fb = (void *)0xa0000000;
 
-//     gFrameBufferBase = scratch - 800;
+//     fBase = scratch - 800;
 
-#if 1
-       gFrameBufferBase = (void *)0xa4000000;
-       gKernelArgs.frame_buffer.physical_buffer.start = 
(addr_t)gFrameBufferBase;
-#endif
-#if 0
-       if (!gFrameBufferBase) {
-               // XXX: realloc if larger !!!
-               err = platform_allocate_region(&gFrameBufferBase, fbSize, 0, 
false);
-dprintf("error %08x\n", err);
-               if (err < B_OK)
-                       return err;
-               gKernelArgs.frame_buffer.physical_buffer.start
-                       = (addr_t)gFrameBufferBase;
-/*
-               gFrameBufferBase = (void *)mmu_map_physical_memory(
-                       0xa8000000, fbSize, 0);
-               if (gFrameBufferBase == NULL)
-                       return B_NO_MEMORY;
-               gKernelArgs.frame_buffer.physical_buffer.start
-                       = (addr_t)gFrameBufferBase; // 0xa8000000;
-*/
-       }
-#endif
-       fb = gFrameBufferBase;
+       fb = (void*)fBase;
 
        dprintf("fb @ %p\n", fb);
 
@@ -200,16 +213,15 @@ dprintf("error %08x\n", err);
        }
 
        // update framebuffer descriptor
-       return arch_probe_video_mode();
+       return Probe();
 }
 
 
 status_t
-arch_set_default_video_mode()
+ArchFBArmPxa270::SetDefaultMode()
 {
-       dprintf("%s()\n", __FUNCTION__);
-       return arch_set_video_mode(800, 600, 32);
+       CALLED();
+       return SetVideoMode(gKernelArgs.frame_buffer.width,
+               gKernelArgs.frame_buffer.height,
+               gKernelArgs.frame_buffer.depth);
 }
-
-
-#endif
diff --git a/src/system/boot/arch/arm/arch_video.cpp 
b/src/system/boot/arch/arm/arch_video.cpp
deleted file mode 100644
index 8da3ef5..0000000
--- a/src/system/boot/arch/arm/arch_video.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright 2009, François Revol, revol@xxxxxxxx
- * Distributed under the terms of the MIT License.
- */
-
-
-#include "arch_video.h"
-
-#include <arch/cpu.h>
-#include <boot/stage2.h>
-#include <boot/platform.h>
-#include <boot/menu.h>
-#include <boot/kernel_args.h>
-#include <boot/platform/generic/video.h>
-#include <board_config.h>
-#include <util/list.h>
-#include <drivers/driver_settings.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-//XXX
-extern "C" addr_t mmu_map_physical_memory(addr_t physicalAddress, size_t size,
-       uint32 flags);
-
-
-#define TRACE_VIDEO
-#ifdef TRACE_VIDEO
-#      define TRACE(x) dprintf x
-#else
-#      define TRACE(x) ;
-#endif
-
-#define write_io_32(a, v) ((*(vuint32 *)a) = v)
-#define read_io_32(a) (*(vuint32 *)a)
-
-#define dumpr(a) dprintf("LCC:%s:0x%lx\n", #a, read_io_32(a))
-
-
-#if !BOARD_CPU_PXA270 && !BOARD_CPU_OMAP3 && !BOARD_CPU_ARM920T
-//     #pragma mark -
-
-
-status_t
-arch_probe_video_mode(void)
-{
-       return B_ERROR;
-}
-
-
-status_t
-arch_set_video_mode(int width, int height, int depth)
-{
-       return B_ERROR;
-}
-
-
-status_t
-arch_set_default_video_mode()
-{
-       return arch_set_video_mode(800, 600, 32);
-}
-
-
-#endif
diff --git a/src/system/boot/arch/arm/arch_video.h 
b/src/system/boot/arch/arm/arch_video.h
deleted file mode 100644
index 5481380..0000000
--- a/src/system/boot/arch/arm/arch_video.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2009, Haiku Inc.
- * All rights reserved. Distributed under the terms of the MIT License.
- */
-#ifndef _ARCH_VIDEO_H
-#define _ARCH_VIDEO_H
-
-#include <SupportDefs.h>
-
-/* try to detect current video mode and set gFrameBuffer accordingly */
-extern status_t arch_probe_video_mode();
-/* try to set a video mode */
-extern status_t arch_set_video_mode(int width, int height, int depth);
-extern status_t arch_set_default_video_mode();
-
-
-#endif /* _ARCH_VIDEO_H */
diff --git a/src/system/boot/platform/u-boot/video.cpp 
b/src/system/boot/platform/u-boot/video.cpp
index 4d775e4..d3767f9 100644
--- a/src/system/boot/platform/u-boot/video.cpp
+++ b/src/system/boot/platform/u-boot/video.cpp
@@ -5,10 +5,6 @@
 
 
 #include "video.h"
-//XXX
-#ifdef __ARM__
-#include "arch_video.h"
-#endif
 
 #include <arch/cpu.h>
 #include <boot/stage2.h>
@@ -23,15 +19,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "arch_framebuffer.h"
 
-#define TRACE_VIDEO
-#ifdef TRACE_VIDEO
-#      define TRACE(x) dprintf x
-#else
-#      define TRACE(x) ;
-#endif
 
-void *gFrameBufferBase = NULL;
+ArchFramebuffer *gFramebuffer = NULL;
 
 
 //     #pragma mark -
@@ -66,7 +57,6 @@ video_mode_menu()
 }
 
 
-
 //     #pragma mark -
 
 
@@ -77,15 +67,16 @@ platform_set_palette(const uint8 *palette)
 
 
 extern "C" void
-platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width, uint16 
height,
-       uint16 imageWidth, uint16 left, uint16 top)
+platform_blit4(addr_t frameBuffer, const uint8 *data, uint16 width,
+       uint16 height, uint16 imageWidth, uint16 left, uint16 top)
 {
 }
 
+
 extern "C" void
 platform_switch_to_logo(void)
 {
-       TRACE(("%s()\n", __FUNCTION__));
+       CALLED();
        // in debug mode, we'll never show the logo
        if ((platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) != 0)
                return;
@@ -95,15 +86,15 @@ platform_switch_to_logo(void)
 
        status_t err;
 
-#ifdef __ARM__
-       err = arch_set_default_video_mode();
-       dprintf("set video mode: 0x%08x\n", err);
-       if (err < B_OK)
-               return;
-#endif
+       if (gFramebuffer != NULL) {
+               err = gFramebuffer->SetDefaultMode();
+               if (err < B_OK) {
+                       ERROR("Framebuffer SetDefaultMode failed!\n");
+                       return;
+               }
 
-       err = video_display_splash((addr_t)gFrameBufferBase);
-       dprintf("video_display_splash: 0x%08x\n", err);
+               err = video_display_splash(gFramebuffer->Base());
+       }
        #warning U-Boot:TODO
 }
 
@@ -111,7 +102,7 @@ platform_switch_to_logo(void)
 extern "C" void
 platform_switch_to_text_mode(void)
 {
-       TRACE(("%s()\n", __FUNCTION__));
+       CALLED();
        #warning U-Boot:TODO
 }
 
@@ -119,14 +110,26 @@ platform_switch_to_text_mode(void)
 extern "C" status_t
 platform_init_video(void)
 {
-       TRACE(("%s()\n", __FUNCTION__));
-       #warning U-Boot:TODO
+       CALLED();
+
 #ifdef __ARM__
-       arch_probe_video_mode();
+       #if defined(BOARD_CPU_ARM920T)
+               gFramebuffer = arch_get_fb_arm_920(0x88000000);
+       #elif defined(BOARD_CPU_OMAP3)
+               gFramebuffer = arch_get_fb_arm_omap3(0x88000000);
+       #elif defined(BOARD_CPU_PXA270)
+               gFramebuffer = arch_get_fb_arm_pxa270(0xA4000000);
+       #endif
 #endif
+
+       if (gFramebuffer != NULL) {
+               gFramebuffer->Probe();
+               gFramebuffer->Init();
+       }
+
        //XXX for testing
        //platform_switch_to_logo();
        //return arch_probe_video_mode();
-       //return B_OK;
-}
 
+       return B_OK;
+}


Other related posts:

  • » [haiku-commits] haiku: hrev44643 - in src/system/boot: arch/arm platform/u-boot - kallisti5