aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/pci
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2010-03-02 01:56:55 +0000
committerXin LI <delphij@FreeBSD.org>2010-03-02 01:56:55 +0000
commitaa3d547d095ff07fdc39ffc5ae4c371844b504ab (patch)
tree7ed974e780fcc4cd6ef6cb1dd534de1780381fb5 /sys/dev/pci
parent4dcf8bb3e27cb46f60afb73c7d1fb61ca6a322ab (diff)
Notes
Diffstat (limited to 'sys/dev/pci')
-rw-r--r--sys/dev/pci/vga_pci.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c
index 3e5b1a64bdd0..19fe9df7beb9 100644
--- a/sys/dev/pci/vga_pci.c
+++ b/sys/dev/pci/vga_pci.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/rman.h>
+#include <sys/sysctl.h>
#include <sys/systm.h>
#include <dev/pci/pcireg.h>
@@ -58,9 +59,19 @@ struct vga_pci_softc {
struct vga_resource vga_res[PCIR_MAX_BAR_0 + 1];
};
+SYSCTL_DECL(_hw_pci);
+
+int vga_pci_default_unit = -1;
+TUNABLE_INT("hw.pci.default_vgapci_unit", &vga_pci_default_unit);
+SYSCTL_INT(_hw_pci, OID_AUTO, default_vgapci_unit, CTLFLAG_RDTUN,
+ &vga_pci_default_unit, -1, "Default VGA-compatible display");
+
static int
vga_pci_probe(device_t dev)
{
+ device_t bdev;
+ int unit;
+ uint16_t bctl;
switch (pci_get_class(dev)) {
case PCIC_DISPLAY:
@@ -72,6 +83,16 @@ vga_pci_probe(device_t dev)
default:
return (ENXIO);
}
+
+ /* Probe default display. */
+ unit = device_get_unit(dev);
+ bdev = device_get_parent(device_get_parent(dev));
+ bctl = pci_read_config(bdev, PCIR_BRIDGECTL_1, 2);
+ if (vga_pci_default_unit < 0 && (bctl & PCIB_BCR_VGA_ENABLE) != 0)
+ vga_pci_default_unit = unit;
+ if (vga_pci_default_unit == unit)
+ device_set_flags(dev, 1);
+
device_set_desc(dev, "VGA-compatible display");
return (BUS_PROBE_GENERIC);
}