From 65c2672f67a72b278a4304e450ce53f615bcb870 Mon Sep 17 00:00:00 2001 From: Oleksandr Tymoshenko Date: Wed, 20 Apr 2016 22:38:00 +0000 Subject: [PATCH] Force framebuffer virtual viewport to be the same as physical VideoCore reports garbage in viewport geometry fields unless viewport was set previously by earlier stage boot loader. So when booting FreeBSD kernel directly from VideoCore's start.elf framebuffer intialization fails due to invalid vxres, vyres values. Make sure we request viewport to be equal to physical resolution Submitted by: Sylvain Garrigues --- sys/arm/broadcom/bcm2835/bcm2835_fb.c | 3 +++ sys/arm/broadcom/bcm2835/bcm2835_fbd.c | 4 ++++ sys/arm/broadcom/bcm2835/bcm2835_mbox.c | 8 -------- sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h | 2 -- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fb.c b/sys/arm/broadcom/bcm2835/bcm2835_fb.c index 843c0c8e5a05..cb0fc72ab0b6 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_fb.c +++ b/sys/arm/broadcom/bcm2835/bcm2835_fb.c @@ -149,6 +149,9 @@ bcm_fb_attach(device_t dev) if (bcm2835_mbox_fb_get_w_h(&fb) != 0) return (ENXIO); fb.bpp = FB_DEPTH; + fb.vxres = fb.xres; + fb.vyres = fb.yres; + fb.xoffset = fb.yoffset = 0; if (bcm2835_mbox_fb_init(&fb) != 0) return (ENXIO); diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c index 4902955a07b6..d34360f710e5 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c +++ b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c @@ -80,6 +80,10 @@ bcm_fb_init(struct bcmsc_softc *sc, struct bcm2835_fb_config *fb) return (ENXIO); fb->bpp = FB_DEPTH; + fb->vxres = fb->xres; + fb->vyres = fb->yres; + fb->xoffset = fb->yoffset = 0; + if ((err = bcm2835_mbox_fb_init(fb)) != 0) { device_printf(sc->dev, "bcm2835_mbox_fb_init failed, err=%d\n", err); return (ENXIO); diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c index 221bccc66a93..f1ab1b969336 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c +++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c @@ -475,20 +475,12 @@ bcm2835_mbox_fb_get_w_h(struct bcm2835_fb_config *fb) msg.hdr.code = BCM2835_MBOX_CODE_REQ; BCM2835_MBOX_INIT_TAG(&msg.physical_w_h, GET_PHYSICAL_W_H); msg.physical_w_h.tag_hdr.val_len = 0; - BCM2835_MBOX_INIT_TAG(&msg.virtual_w_h, GET_VIRTUAL_W_H); - msg.virtual_w_h.tag_hdr.val_len = 0; - BCM2835_MBOX_INIT_TAG(&msg.offset, GET_VIRTUAL_OFFSET); - msg.offset.tag_hdr.val_len = 0; msg.end_tag = 0; err = bcm2835_mbox_property(&msg, sizeof(msg)); if (err == 0) { fb->xres = msg.physical_w_h.body.resp.width; fb->yres = msg.physical_w_h.body.resp.height; - fb->vxres = msg.virtual_w_h.body.resp.width; - fb->vyres = msg.virtual_w_h.body.resp.height; - fb->xoffset = msg.offset.body.resp.x; - fb->yoffset = msg.offset.body.resp.y; } return (err); diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h index 68befef2aae1..a1963aa4d86f 100644 --- a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h +++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h @@ -469,8 +469,6 @@ struct bcm2835_fb_config { struct msg_fb_get_w_h { struct bcm2835_mbox_hdr hdr; struct bcm2835_mbox_tag_fb_w_h physical_w_h; - struct bcm2835_mbox_tag_fb_w_h virtual_w_h; - struct bcm2835_mbox_tag_virtual_offset offset; uint32_t end_tag; };