svn commit: r245389 - head/sys/arm/broadcom/bcm2835

Aleksandr Rybalko ray at FreeBSD.org
Sun Jan 13 22:05:47 UTC 2013


Author: ray
Date: Sun Jan 13 22:05:46 2013
New Revision: 245389
URL: http://svnweb.freebsd.org/changeset/base/245389

Log:
  Enable syscons framebuffer support for bcm2835. It makes possible to run Xorg
  on Raspberry Pi.
  o convert mmap address to physical.
  o add FBIOGTYPE ioctl handler - allow to get screen resolution by new
      xf86-video-scfb driver.
  Originally designed for "Efika MX" project.
  
  Sponsored by:	FreeBSD Foundation

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_fb.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_fb.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_fb.c	Sun Jan 13 21:32:40 2013	(r245388)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_fb.c	Sun Jan 13 22:05:46 2013	(r245389)
@@ -136,6 +136,7 @@ struct video_adapter_softc {
 	int		console;
 
 	intptr_t	fb_addr;
+	intptr_t	fb_paddr;
 	unsigned int	fb_size;
 
 	unsigned int	height;
@@ -222,6 +223,7 @@ bcm_fb_init(void *arg)
 			fb_config->screen_size);
 
 		va_sc->fb_addr = (intptr_t)pmap_mapdev(fb_config->base, fb_config->screen_size);
+		va_sc->fb_paddr = fb_config->base;
 		va_sc->fb_size = fb_config->screen_size;
 		va_sc->depth = fb_config->bpp;
 		va_sc->stride = fb_config->pitch;
@@ -795,7 +797,7 @@ bcmfb_mmap(video_adapter_t *adp, vm_ooff
 	 * framebuffer, since it shouldn't be touched
 	 */
 	if (offset < sc->stride*sc->height) {
-		*paddr = sc->fb_addr + offset;
+		*paddr = sc->fb_paddr + offset;
 		return (0);
 	}
 
@@ -805,6 +807,27 @@ bcmfb_mmap(video_adapter_t *adp, vm_ooff
 static int
 bcmfb_ioctl(video_adapter_t *adp, u_long cmd, caddr_t data)
 {
+	struct video_adapter_softc *sc;
+	struct fbtype *fb;
+
+	sc = (struct video_adapter_softc *)adp;
+
+	switch (cmd) {
+	case FBIOGTYPE:
+		fb = (struct fbtype *)data;
+		fb->fb_type = FBTYPE_PCIMISC;
+		fb->fb_height = sc->height;
+		fb->fb_width = sc->width;
+		fb->fb_depth = sc->depth;
+		if (sc->depth <= 1 || sc->depth > 8)
+			fb->fb_cmsize = 0;
+		else
+			fb->fb_cmsize = 1 << sc->depth;
+		fb->fb_size = sc->fb_size;
+		break;
+	default:
+		return (fb_commonioctl(adp, cmd, data));
+	}
 
 	return (0);
 }


More information about the svn-src-all mailing list