Index: kernel/genarch/src/drivers/bcm2835/mbox.c
===================================================================
--- kernel/genarch/src/drivers/bcm2835/mbox.c	(revision 44b2b78be3d89c7a81b12bc1276fd80e28175892)
+++ kernel/genarch/src/drivers/bcm2835/mbox.c	(revision f22f679fa78e8a86ddf97362ae98660cdb16ee13)
@@ -34,4 +34,6 @@
  */
 
+#include <mm/km.h>
+#include <mm/slab.h>
 #include <typedefs.h>
 #include <genarch/drivers/bcm2835/mbox.h>
@@ -39,7 +41,4 @@
 static void mbox_write(bcm2835_mbox_t *mbox, uint8_t chan, uint32_t value)
 {
-	if (!mbox)
-		mbox = (bcm2835_mbox_t *)BCM2835_MBOX0_ADDR;
-
 	while (mbox->status & MBOX_STATUS_FULL) ;
 	mbox->write = MBOX_COMPOSE(chan, value);
@@ -49,7 +48,4 @@
 {
 	uint32_t msg;
-
-	if (!mbox)
-		mbox = (bcm2835_mbox_t *)BCM2835_MBOX0_ADDR;
 
 	do {
@@ -73,6 +69,8 @@
 	req->zero = 0;
 
-	mbox_write(NULL, MBOX_CHAN_PROP_A2V, KA2VC((uint32_t)req));
-	mbox_read(NULL, MBOX_CHAN_PROP_A2V);
+	mbox_write((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
+		   MBOX_CHAN_PROP_A2V, KA2VCA((uint32_t)req));
+	mbox_read((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
+		  MBOX_CHAN_PROP_A2V);
 
 	if (req->buf_hdr.code == MBOX_PROP_CODE_RESP_OK) {
@@ -87,4 +85,54 @@
 }
 
+bool bcm2835_fb_init(fb_properties_t *prop)
+{
+	bcm2835_mbox_t *fb_mbox;
+	bcm2835_fb_desc_t *fb_desc;
+	void *fb_desc_buf;
+	bool ret = false;
+
+	fb_desc_buf = malloc(sizeof(bcm2835_fb_desc_t) + MBOX_ADDR_ALIGN, 0);
+	if (!fb_desc_buf)
+		return false;
+
+	fb_mbox = (void *) km_map(BCM2835_MBOX0_ADDR, sizeof(bcm2835_mbox_t),
+				  PAGE_NOT_CACHEABLE);
+	fb_desc = (bcm2835_fb_desc_t *) ALIGN_UP((uintptr_t)fb_desc_buf,
+						 MBOX_ADDR_ALIGN);
+
+	fb_desc->width = 640;
+	fb_desc->height = 480;
+	fb_desc->virt_width = fb_desc->width;
+	fb_desc->virt_height = fb_desc->height;
+	fb_desc->pitch = 0;			/* Set by VC */
+	fb_desc->bpp = 16;
+	fb_desc->x_offset = 0;
+	fb_desc->y_offset = 0;
+	fb_desc->addr = 0;			/* Set by VC */
+	fb_desc->size = 0;			/* Set by VC */
+
+	mbox_write(fb_mbox, MBOX_CHAN_FB, KA2VCA(fb_desc));
+
+	if (mbox_read(fb_mbox, MBOX_CHAN_FB)) {
+		printf("BCM2835 framebuffer initialization failed\n");
+		goto out;
+	}
+
+	prop->addr = fb_desc->addr;
+	prop->offset = 0;
+	prop->x = fb_desc->width;
+	prop->y = fb_desc->height;
+	prop->scan = fb_desc->pitch;
+	prop->visual = VISUAL_RGB_5_6_5_LE;
+
+	printf("BCM2835 framebuffer at 0x%08x (%dx%d)\n", prop->addr,
+	       prop->x, prop->y);
+	ret = true;
+out:
+	km_unmap((uintptr_t)fb_mbox, sizeof(bcm2835_mbox_t));
+	free(fb_desc_buf);
+	return ret;
+}
+
 /**
  * @}
