Am 13.06.2016 um 12:35 schrieb Mark Kettenis <mark.kette...@xs4all.nl>:
>> Date: Sun, 12 Jun 2016 11:47:37 -0500 >> From: joshua stein <j...@openbsd.org> >> >> Here's a new version with feedback from Miod and Ted. >> >> It also fixes a bug on a Broadwell Chromebook (tested by Edward >> Wandasiewicz) which has proper inteldrm but no vga, so cbfb was >> getting chosen as the console early on but then not detaching when >> inteldrm wanted to take over. This detaches cbfb in the intel and >> radeon drivers. > > The addition of those hooks makes me even more convinced that efifb(4) > and cbfb(4) should be the same driver. The only thing that is really > different is the data structure that is used to initialize the > framebuffer parameters. I tend to agree with Mark, these two should be merged. > We should not get hung up too much about the driver name. If it is > felt that efifb(4) is inappropriate for these chromebooks with > coreboot, we can always rename the driver. Yes, renaming makes sense then. >> Index: dev/wscons/wsconsio.h >> =================================================================== >> RCS file: /cvs/src/sys/dev/wscons/wsconsio.h,v >> retrieving revision 1.74 >> diff -u -p -u -p -r1.74 wsconsio.h >> --- dev/wscons/wsconsio.h 30 Mar 2016 23:34:12 -0000 1.74 >> +++ dev/wscons/wsconsio.h 12 Jun 2016 16:40:46 -0000 >> @@ -348,6 +348,7 @@ struct wsmouse_calibcoords { >> #define WSDISPLAY_TYPE_INTELDRM 69 /* Intel KMS framebuffer */ >> #define WSDISPLAY_TYPE_RADEONDRM 70 /* ATI Radeon KMS framebuffer >> */ >> #define WSDISPLAY_TYPE_EFIFB 71 /* EFI framebuffer */ >> +#define WSDISPLAY_TYPE_CBFB 72 /* Coreboot framebuffer */ >> >> /* Basic display information. Not applicable to all display types. */ >> struct wsdisplay_fbinfo { >> Index: arch/amd64/amd64/cbfb.c >> =================================================================== >> RCS file: arch/amd64/amd64/cbfb.c >> diff -N arch/amd64/amd64/cbfb.c >> --- /dev/null 1 Jan 1970 00:00:00 -0000 >> +++ arch/amd64/amd64/cbfb.c 12 Jun 2016 16:40:46 -0000 >> @@ -0,0 +1,445 @@ >> +/* $OpenBSD$ */ >> + >> +/* >> + * Coreboot framebuffer console driver >> + * >> + * Copyright (c) 2016 joshua stein <j...@openbsd.org> >> + * Copyright (c) 2015 YASUOKA Masahiko <yasu...@yasuoka.net> >> + * >> + * Permission to use, copy, modify, and distribute this software for any >> + * purpose with or without fee is hereby granted, provided that the above >> + * copyright notice and this permission notice appear in all copies. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES >> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF >> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR >> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES >> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN >> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF >> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. >> + */ >> + >> +#include <sys/param.h> >> +#include <sys/systm.h> >> + >> +#include <uvm/uvm_extern.h> >> +#include <machine/bus.h> >> + >> +#include <dev/wscons/wsconsio.h> >> +#include <dev/wscons/wsdisplayvar.h> >> +#include <dev/rasops/rasops.h> >> +#include <dev/pci/pcivar.h> >> + >> +#include <machine/cbfbvar.h> >> + >> +/* coreboot tables */ >> + >> +struct cb_header { >> + union { >> + uint8_t signature[4]; /* "LBIO" */ >> + uint32_t signature32; >> + }; >> + uint32_t header_bytes; >> + uint32_t header_checksum; >> + uint32_t table_bytes; >> + uint32_t table_checksum; >> + uint32_t table_entries; >> +}; >> + >> +struct cb_framebuffer { >> + uint64_t physical_address; >> + uint32_t x_resolution; >> + uint32_t y_resolution; >> + uint32_t bytes_per_line; >> + uint8_t bits_per_pixel; >> + uint8_t red_mask_pos; >> + uint8_t red_mask_size; >> + uint8_t green_mask_pos; >> + uint8_t green_mask_size; >> + uint8_t blue_mask_pos; >> + uint8_t blue_mask_size; >> + uint8_t reserved_mask_pos; >> + uint8_t reserved_mask_size; >> +}; >> + >> +struct cb_entry { >> + uint32_t tag; >> +#define CB_TAG_VERSION 0x0004 >> +#define CB_TAG_FORWARD 0x0011 >> +#define CB_TAG_FRAMEBUFFER 0x0012 >> + uint32_t size; >> + union { >> + char string[0]; >> + uint64_t forward; >> + struct cb_framebuffer fb; >> + } u; >> +}; >> + >> +struct cbfb { >> + struct rasops_info rinfo; >> + int depth; >> + paddr_t paddr; >> + psize_t psize; >> + >> + struct cb_framebuffer table_cbfb; >> +}; >> + >> +struct cbfb_softc { >> + struct device sc_dev; >> + struct cbfb *sc_fb; >> +}; >> + >> +int cbfb_match(struct device *, void *, void *); >> +void cbfb_attach(struct device *, struct device *, void *); >> +void cbfb_rasops_preinit(struct cbfb *); >> +int cbfb_ioctl(void *, u_long, caddr_t, int, struct proc *); >> +paddr_t cbfb_mmap(void *, off_t, int); >> +int cbfb_alloc_screen(void *, const struct wsscreen_descr *, void **, >> + int *, int *, long *); >> +void cbfb_free_screen(void *, void *); >> +int cbfb_show_screen(void *, void *, int, void (*cb) (void *, int, int), >> + void *); >> +int cbfb_list_font(void *, struct wsdisplay_font *); >> +int cbfb_load_font(void *, void *, struct wsdisplay_font *); >> + >> +int cb_parse_table(paddr_t); >> + >> +const struct cfattach cbfb_ca = { >> + sizeof(struct cbfb_softc), cbfb_match, cbfb_attach, NULL >> +}; >> + >> +#define CBFB_WIDTH 100 >> +#define CBFB_HEIGHT 31 >> + >> +struct wsdisplay_charcell cbfb_bs[CBFB_HEIGHT * CBFB_WIDTH]; >> + >> +struct wsscreen_descr cbfb_std_descr = { "std" }; >> + >> +const struct wsscreen_descr *cbfb_descrs[] = { >> + &cbfb_std_descr >> +}; >> + >> +const struct wsscreen_list cbfb_screen_list = { >> + nitems(cbfb_descrs), cbfb_descrs >> +}; >> + >> +struct wsdisplay_accessops cbfb_accessops = { >> + .ioctl = cbfb_ioctl, >> + .mmap = cbfb_mmap, >> + .alloc_screen = cbfb_alloc_screen, >> + .free_screen = cbfb_free_screen, >> + .show_screen = cbfb_show_screen, >> + .load_font = cbfb_load_font, >> + .list_font = cbfb_list_font >> +}; >> + >> +struct cfdriver cbfb_cd = { >> + NULL, "cbfb", DV_DULL >> +}; >> + >> +struct cbfb cbfb_console; >> + >> +int >> +cbfb_match(struct device *parent, void *cf, void *aux) >> +{ >> + struct cbfb_attach_args *cbaa = aux; >> + >> + if (strcmp(cbaa->cbfbaa_name, cbfb_cd.cd_name) == 0 && cbfb_found()) >> + return (1); >> + >> + return (0); >> +} >> + >> +int >> +cbfb_found(void) >> +{ >> + return !!(cbfb_console.paddr); >> +} >> + >> +void >> +cbfb_attach(struct device *parent, struct device *self, void *aux) >> +{ >> + struct cbfb *fb; >> + struct cbfb_softc *sc = (struct cbfb_softc *)self; >> + struct wsemuldisplaydev_attach_args aa; >> + struct rasops_info *ri; >> + int ccol = 0, crow = 0; >> + bus_space_tag_t iot = X86_BUS_SPACE_MEM; >> + bus_space_handle_t ioh; >> + long defattr; >> + >> + printf(": %dx%d, %d bpp\n", >> + cbfb_console.table_cbfb.x_resolution, >> + cbfb_console.table_cbfb.y_resolution, >> + cbfb_console.table_cbfb.bits_per_pixel); >> + >> + aa.console = 1; >> + fb = sc->sc_fb = &cbfb_console; >> + ri = &fb->rinfo; >> + ccol = ri->ri_ccol; >> + crow = ri->ri_crow; >> + >> + if (bus_space_map(iot, fb->paddr, fb->psize, >> + BUS_SPACE_MAP_PREFETCHABLE | BUS_SPACE_MAP_LINEAR, &ioh) == 0) >> + ri->ri_origbits = bus_space_vaddr(iot, ioh); >> + >> + cbfb_rasops_preinit(fb); >> + ri->ri_flg &= ~RI_CLEAR; >> + ri->ri_flg |= RI_VCONS | RI_WRONLY; >> + >> + rasops_init(ri, cbfb_std_descr.nrows, cbfb_std_descr.ncols); >> + >> + aa.scrdata = &cbfb_screen_list; >> + aa.accessops = &cbfb_accessops; >> + aa.accesscookie = sc; >> + aa.defaultscreens = 0; >> + >> + ri->ri_ops.alloc_attr(ri->ri_active, 0, 0, 0, &defattr); >> + wsdisplay_cnattach(&cbfb_std_descr, ri->ri_active, ccol, crow, defattr); >> + >> + config_found(self, &aa, wsemuldisplaydevprint); >> +} >> + >> +void >> +cbfb_rasops_preinit(struct cbfb *cbfb) >> +{ >> + struct rasops_info *ri = &cbfb->rinfo; >> + >> + ri->ri_width = cbfb->table_cbfb.x_resolution; >> + ri->ri_height = cbfb->table_cbfb.y_resolution; >> + ri->ri_depth = cbfb->depth; >> + ri->ri_stride = cbfb->table_cbfb.bytes_per_line; >> + ri->ri_rnum = cbfb->table_cbfb.red_mask_size; >> + ri->ri_rpos = cbfb->table_cbfb.red_mask_pos; >> + ri->ri_gnum = cbfb->table_cbfb.green_mask_size; >> + ri->ri_gpos = cbfb->table_cbfb.green_mask_pos; >> + ri->ri_bnum = cbfb->table_cbfb.blue_mask_size; >> + ri->ri_bpos = cbfb->table_cbfb.blue_mask_pos; >> +} >> + >> +int >> +cbfb_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) >> +{ >> + struct cbfb_softc *sc = v; >> + struct cbfb *fb = sc->sc_fb; >> + struct rasops_info *ri = &fb->rinfo; >> + struct wsdisplay_fbinfo *wdf; >> + >> + switch (cmd) { >> + case WSDISPLAYIO_GTYPE: >> + *(u_int *)data = WSDISPLAY_TYPE_CBFB; >> + break; >> + case WSDISPLAYIO_GINFO: >> + wdf = (struct wsdisplay_fbinfo *)data; >> + wdf->width = ri->ri_width; >> + wdf->height = ri->ri_height; >> + wdf->depth = ri->ri_depth; >> + wdf->cmsize = 0; /* color map is unavailable */ >> + break; >> + case WSDISPLAYIO_LINEBYTES: >> + *(u_int *)data = ri->ri_stride; >> + break; >> + case WSDISPLAYIO_SMODE: >> + break; >> + case WSDISPLAYIO_GETSUPPORTEDDEPTH: >> + switch (ri->ri_depth) { >> + case 32: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_24_32; >> + break; >> + case 24: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_24_24; >> + break; >> + case 16: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_16; >> + break; >> + case 15: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_15; >> + break; >> + case 8: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_8; >> + break; >> + case 4: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_4; >> + break; >> + case 1: >> + *(u_int *)data = WSDISPLAYIO_DEPTH_1; >> + break; >> + default: >> + return (-1); >> + } >> + break; >> + default: >> + return (-1); >> + } >> + >> + return (0); >> +} >> + >> +paddr_t >> +cbfb_mmap(void *v, off_t off, int prot) >> +{ >> + struct cbfb_softc *sc = v; >> + >> + if (off < 0 || off >= sc->sc_fb->psize) >> + return (-1); >> + >> + return ((sc->sc_fb->paddr + off) | PMAP_WC); >> +} >> + >> +int >> +cbfb_alloc_screen(void *v, const struct wsscreen_descr *descr, >> + void **cookiep, int *curxp, int *curyp, long *attrp) >> +{ >> + struct cbfb_softc *sc = v; >> + struct rasops_info *ri = &sc->sc_fb->rinfo; >> + >> + return rasops_alloc_screen(ri, cookiep, curxp, curyp, attrp); >> +} >> + >> +void >> +cbfb_free_screen(void *v, void *cookie) >> +{ >> + struct cbfb_softc *sc = v; >> + struct rasops_info *ri = &sc->sc_fb->rinfo; >> + >> + rasops_free_screen(ri, cookie); >> +} >> + >> +int >> +cbfb_show_screen(void *v, void *cookie, int waitok, >> + void (*cb) (void *, int, int), void *cb_arg) >> +{ >> + struct cbfb_softc *sc = v; >> + struct rasops_info *ri = &sc->sc_fb->rinfo; >> + >> + return rasops_show_screen(ri, cookie, waitok, cb, cb_arg); >> +} >> + >> +int >> +cbfb_load_font(void *v, void *cookie, struct wsdisplay_font *font) >> +{ >> + struct cbfb_softc *sc = v; >> + struct rasops_info *ri = &sc->sc_fb->rinfo; >> + >> + return (rasops_load_font(ri, cookie, font)); >> +} >> + >> +int >> +cbfb_list_font(void *v, struct wsdisplay_font *font) >> +{ >> + struct cbfb_softc *sc = v; >> + struct rasops_info *ri = &sc->sc_fb->rinfo; >> + >> + return (rasops_list_font(ri, font)); >> +} >> + >> +int >> +cbfb_cnattach(void) >> +{ >> + if (cb_parse_table((paddr_t)0x0) || !cbfb_console.paddr) >> + return (-1); >> + >> + return (0); >> +} >> + >> +int >> +cbfb_is_console(struct pci_attach_args *pa) >> +{ >> + return !!(cbfb_console.paddr); >> +} >> + >> +void >> +cbfb_cndetach(void) >> +{ >> + cbfb_console.paddr = 0; >> +} >> + >> +static uint16_t >> +cb_checksum(const void *addr, unsigned size) >> +{ >> + const uint16_t *p = addr; >> + unsigned i, n = size / 2; >> + uint32_t sum = 0; >> + >> + for (i = 0; i < n; i++) >> + sum += p[i]; >> + >> + sum = (sum >> 16) + (sum & 0xffff); >> + sum += (sum >> 16); >> + sum = ~sum & 0xffff; >> + >> + return (uint16_t)sum; >> +} >> + >> +static void >> +cb_fb_init(struct cb_framebuffer *table_cbfb) >> +{ >> + struct cbfb *cbfb; >> + struct rasops_info *ri = &cbfb->rinfo; >> + long defattr = 0; >> + >> + memset(&cbfb_console, 0, sizeof(cbfb_console)); >> + memcpy(&cbfb_console.table_cbfb, table_cbfb, >> + sizeof(struct cb_framebuffer)); >> + >> + cbfb = &cbfb_console; >> + cbfb->paddr = table_cbfb->physical_address; >> + cbfb->depth = table_cbfb->bits_per_pixel; >> + cbfb->psize = table_cbfb->y_resolution * table_cbfb->bytes_per_line; >> + >> + ri->ri_bits = (u_char *)PMAP_DIRECT_MAP(cbfb->paddr); >> + >> + cbfb_rasops_preinit(cbfb); >> + >> + ri->ri_bs = cbfb_bs; >> + ri->ri_flg = RI_CLEAR | RI_CENTER | RI_WRONLY; >> + rasops_init(ri, CBFB_HEIGHT, CBFB_WIDTH); >> + cbfb_std_descr.ncols = ri->ri_cols; >> + cbfb_std_descr.nrows = ri->ri_rows; >> + cbfb_std_descr.textops = &ri->ri_ops; >> + cbfb_std_descr.fontwidth = ri->ri_font->fontwidth; >> + cbfb_std_descr.fontheight = ri->ri_font->fontheight; >> + cbfb_std_descr.capabilities = ri->ri_caps; >> + >> + ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr); >> + wsdisplay_cnattach(&cbfb_std_descr, ri, 0, 0, defattr); >> +} >> + >> +int >> +cb_parse_table(paddr_t addr) >> +{ >> + int i, j; >> + >> + for (i = 0; i < (4 * 1024); i += 16) { >> + struct cb_header *cbh; >> + struct cb_entry *cbe; >> + paddr_t cbtable; >> + >> + cbh = (struct cb_header *)(PMAP_DIRECT_MAP(addr + i)); >> + if (memcmp(cbh->signature, "LBIO", 4) != 0) >> + continue; >> + >> + if (!cbh->header_bytes) >> + continue; >> + >> + if (cb_checksum(cbh, sizeof(*cbh)) != 0) >> + return (-1); >> + >> + cbtable = PMAP_DIRECT_MAP(addr + i + cbh->header_bytes); >> + >> + for (j = 0; j < cbh->table_bytes; j += cbe->size) { >> + cbe = (struct cb_entry *)((char *)cbtable + j); >> + >> + switch (cbe->tag) { >> + case CB_TAG_FORWARD: >> + return cb_parse_table(cbe->u.forward); >> + >> + case CB_TAG_FRAMEBUFFER: >> + cb_fb_init(&cbe->u.fb); >> + break; >> + } >> + } >> + } >> + >> + return (0); >> +} >> Index: arch/amd64/amd64/mainbus.c >> =================================================================== >> RCS file: /cvs/src/sys/arch/amd64/amd64/mainbus.c,v >> retrieving revision 1.36 >> diff -u -p -u -p -r1.36 mainbus.c >> --- arch/amd64/amd64/mainbus.c 12 Dec 2015 12:33:49 -0000 1.36 >> +++ arch/amd64/amd64/mainbus.c 12 Jun 2016 16:40:46 -0000 >> @@ -52,6 +52,7 @@ >> #include "vmm.h" >> #include "pvbus.h" >> #include "efifb.h" >> +#include "cbfb.h" >> >> #include <machine/cpuvar.h> >> #include <machine/i82093var.h> >> @@ -74,6 +75,10 @@ >> #include <machine/efifbvar.h> >> #endif >> >> +#if NCBFB > 0 >> +#include <machine/cbfbvar.h> >> +#endif >> + >> int mainbus_match(struct device *, void *, void *); >> void mainbus_attach(struct device *, struct device *, void *); >> >> @@ -105,6 +110,9 @@ union mainbus_attach_args { >> #if NEFIFB > 0 >> struct efifb_attach_args mba_eaa; >> #endif >> +#if NCBFB > 0 >> + struct cbfb_attach_args mba_cbfbaa; >> +#endif >> }; >> >> /* >> @@ -255,6 +263,13 @@ mainbus_attach(struct device *parent, st >> #if NEFIFB > 0 >> if (bios_efiinfo != NULL) { >> mba.mba_eaa.eaa_name = "efifb"; >> + config_found(self, &mba, mainbus_print); >> + } >> +#endif >> + >> +#if NCBFB > 0 >> + if (cbfb_found()) { >> + mba.mba_cbfbaa.cbfbaa_name = "cbfb"; >> config_found(self, &mba, mainbus_print); >> } >> #endif >> Index: arch/amd64/amd64/wscons_machdep.c >> =================================================================== >> RCS file: /cvs/src/sys/arch/amd64/amd64/wscons_machdep.c,v >> retrieving revision 1.12 >> diff -u -p -u -p -r1.12 wscons_machdep.c >> --- arch/amd64/amd64/wscons_machdep.c 6 Mar 2016 22:41:24 -0000 1.12 >> +++ arch/amd64/amd64/wscons_machdep.c 12 Jun 2016 16:40:46 -0000 >> @@ -75,6 +75,10 @@ >> #if NEFIFB > 0 >> #include <machine/efifbvar.h> >> #endif >> +#include "cbfb.h" >> +#if NCBFB > 0 >> +#include <machine/cbfbvar.h> >> +#endif >> >> int wscn_video_init(void); >> void wscn_input_init(int); >> @@ -145,6 +149,10 @@ wscn_video_init(void) >> #endif >> #if (NVGA > 0) >> if (vga_cnattach(X86_BUS_SPACE_IO, X86_BUS_SPACE_MEM, -1, 1) == 0) >> + return (0); >> +#endif >> +#if (NCBFB > 0) >> + if (cbfb_cnattach() == 0) >> return (0); >> #endif >> #if (NPCDISPLAY > 0) >> Index: arch/amd64/conf/GENERIC >> =================================================================== >> RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v >> retrieving revision 1.419 >> diff -u -p -u -p -r1.419 GENERIC >> --- arch/amd64/conf/GENERIC 1 Jun 2016 09:48:20 -0000 1.419 >> +++ arch/amd64/conf/GENERIC 12 Jun 2016 16:40:46 -0000 >> @@ -358,6 +358,9 @@ lpt* at puc? >> efifb0 at mainbus? # EFI Framebuffer >> wsdisplay0 at efifb? console 1 >> >> +cbfb0 at mainbus? # Coreboot Framebuffer >> +wsdisplay0 at cbfb? console 1 >> + >> #bha* at pci? # BusLogic [57]4X SCSI controllers >> ahc* at pci? # Adaptec 2940 SCSI controllers >> jmb* at pci? # JMicron JMB36x controllers >> Index: arch/amd64/conf/files.amd64 >> =================================================================== >> RCS file: /cvs/src/sys/arch/amd64/conf/files.amd64,v >> retrieving revision 1.85 >> diff -u -p -u -p -r1.85 files.amd64 >> --- arch/amd64/conf/files.amd64 8 Jan 2016 15:54:13 -0000 1.85 >> +++ arch/amd64/conf/files.amd64 12 Jun 2016 16:40:46 -0000 >> @@ -114,6 +114,13 @@ attach efifb at mainbus >> file arch/amd64/amd64/efifb.c efifb needs-flag >> >> # >> +# Coreboot Framebuffer >> +# >> +device cbfb: wsemuldisplaydev, rasops32, rasops16, rasops8, rasops4 >> +attach cbfb at mainbus >> +file arch/amd64/amd64/cbfb.c cbfb needs-flag >> + >> +# >> # PCI drivers >> # >> >> Index: arch/amd64/include/cbfbvar.h >> =================================================================== >> RCS file: arch/amd64/include/cbfbvar.h >> diff -N arch/amd64/include/cbfbvar.h >> --- /dev/null 1 Jan 1970 00:00:00 -0000 >> +++ arch/amd64/include/cbfbvar.h 12 Jun 2016 16:40:46 -0000 >> @@ -0,0 +1,34 @@ >> +/* $OpenBSD$ */ >> + >> +/* >> + * Copyright (c) 2016 joshua stein <j...@openbsd.org> >> + * Copyright (c) 2015 YASUOKA Masahiko <yasu...@yasuoka.net> >> + * >> + * Permission to use, copy, modify, and distribute this software for any >> + * purpose with or without fee is hereby granted, provided that the above >> + * copyright notice and this permission notice appear in all copies. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES >> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF >> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR >> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES >> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN >> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF >> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. >> + */ >> + >> +#ifndef _MACHINE_CBFB_H_ >> +#define _MACHINE_CBFB_H_ >> + >> +struct cbfb_attach_args { >> + const char *cbfbaa_name; >> +}; >> + >> +struct pci_attach_args; >> + >> +int cbfb_found(void); >> +int cbfb_cnattach(void); >> +int cbfb_is_console(struct pci_attach_args *); >> +void cbfb_cndetach(void); >> + >> +#endif /* _MACHINE_CBFB_H_ */ >> Index: dev/pci/drm/i915/i915_drv.c >> =================================================================== >> RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_drv.c,v >> retrieving revision 1.100 >> diff -u -p -u -p -r1.100 i915_drv.c >> --- dev/pci/drm/i915/i915_drv.c 8 Apr 2016 08:27:53 -0000 1.100 >> +++ dev/pci/drm/i915/i915_drv.c 12 Jun 2016 16:40:47 -0000 >> @@ -953,12 +953,17 @@ int i915_reset(struct drm_device *dev) >> >> #ifdef __amd64__ >> #include "efifb.h" >> +#include "cbfb.h" >> #endif >> >> #if NEFIFB > 0 >> #include <machine/efifbvar.h> >> #endif >> >> +#if NCBFB > 0 >> +#include <machine/cbfbvar.h> >> +#endif >> + >> #include "intagp.h" >> >> #if NINTAGP > 0 >> @@ -1251,6 +1256,10 @@ inteldrm_attach(struct device *parent, s >> if (efifb_is_console(pa)) >> console = 1; >> #endif >> +#if NCBFB > 0 >> + if (cbfb_is_console(pa)) >> + console = 1; >> +#endif >> >> printf("\n"); >> >> @@ -1506,6 +1515,10 @@ inteldrm_attach(struct device *parent, s >> #if NEFIFB > 0 >> if (efifb_is_console(pa)) >> efifb_cndetach(); >> +#endif >> +#if NCBFB > 0 >> + if (cbfb_is_console(pa)) >> + cbfb_cndetach(); >> #endif >> >> printf("%s: %dx%d\n", dev_priv->sc_dev.dv_xname, >> Index: dev/pci/drm/radeon/radeon_kms.c >> =================================================================== >> RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_kms.c,v >> retrieving revision 1.48 >> diff -u -p -u -p -r1.48 radeon_kms.c >> --- dev/pci/drm/radeon/radeon_kms.c 8 Apr 2016 08:27:53 -0000 1.48 >> +++ dev/pci/drm/radeon/radeon_kms.c 12 Jun 2016 16:40:47 -0000 >> @@ -43,12 +43,17 @@ extern int vga_console_attached; >> >> #ifdef __amd64__ >> #include "efifb.h" >> +#include "cbfb.h" >> #endif >> >> #if NEFIFB > 0 >> #include <machine/efifbvar.h> >> #endif >> >> +#if NCBFB > 0 >> +#include <machine/cbfbvar.h> >> +#endif >> + >> #define DRIVER_NAME "radeon" >> #define DRIVER_DESC "ATI Radeon" >> #define DRIVER_DATE "20080613" >> @@ -514,6 +519,13 @@ radeondrm_attach_kms(struct device *pare >> if (efifb_is_console(pa)) { >> rdev->console = 1; >> efifb_cndetach(); >> + } >> +#endif >> + >> +#if NCBFB > 0 >> + if (cbfb_is_console(pa)) { >> + rdev->console = 1; >> + cbfb_cndetach(); >> } >> #endif >> #endif >