summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@openbsd.org>2013-07-21 12:27:07 +0200
committerJonathan Gray <jsg@jsg.id.au>2013-08-12 10:46:26 +1000
commit34680c3dcdc0aadcd0937af13f19098c5c605fcd (patch)
treefd616fca53e3ec90c2ef4684c38341a259a8c327
parentceffd920a45d2eaa5602875bf66c21d804db42e6 (diff)
make radeondrm attach to pci
-rw-r--r--sys/arch/amd64/conf/GENERIC2
-rw-r--r--sys/arch/i386/conf/GENERIC2
-rw-r--r--sys/dev/pci/drm/files.drm2
-rw-r--r--sys/dev/pci/drm/radeon/radeon.h1
-rw-r--r--sys/dev/pci/drm/radeon/radeon_kms.c49
5 files changed, 29 insertions, 27 deletions
diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC
index b490750ccb4..c6f76031861 100644
--- a/sys/arch/amd64/conf/GENERIC
+++ b/sys/arch/amd64/conf/GENERIC
@@ -308,7 +308,7 @@ agp* at intagp?
#option DRM_DEBUG
inteldrm* at vga? # Intel i915, i945 DRM driver
drm* at inteldrm?
-radeondrm* at vga? # ATI Radeon DRM driver
+radeondrm* at pci? # ATI Radeon DRM driver
drm* at radeondrm?
wsdisplay* at radeondrm?
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC
index 056b3d4095a..937b8652c0b 100644
--- a/sys/arch/i386/conf/GENERIC
+++ b/sys/arch/i386/conf/GENERIC
@@ -378,7 +378,7 @@ agp* at viaagp? # AGP bridges
#option DRMDEBUG
inteldrm* at vga? # Intel i915, i945 DRM driver
drm* at inteldrm?
-radeondrm* at vga? # ATI Radeon DRM driver
+radeondrm* at pci? # ATI Radeon DRM driver
drm* at radeondrm?
wsdisplay* at radeondrm?
diff --git a/sys/dev/pci/drm/files.drm b/sys/dev/pci/drm/files.drm
index a26985fab42..e2a2efb1eb9 100644
--- a/sys/dev/pci/drm/files.drm
+++ b/sys/dev/pci/drm/files.drm
@@ -76,7 +76,7 @@ file dev/pci/drm/i915/dvo_sil164.c inteldrm
file dev/pci/drm/i915/dvo_tfp410.c inteldrm
device radeondrm: drmbase, ttm, wsemuldisplaydev, rasops8, rasops32, i2cbus, i2c_bitbang
-attach radeondrm at drmdev
+attach radeondrm at pci
file dev/pci/drm/ati_pcigart.c radeondrm
file dev/pci/drm/drm_heap.c radeondrm
file dev/pci/drm/radeon/atom.c radeondrm
diff --git a/sys/dev/pci/drm/radeon/radeon.h b/sys/dev/pci/drm/radeon/radeon.h
index 64877253910..a592e3857ba 100644
--- a/sys/dev/pci/drm/radeon/radeon.h
+++ b/sys/dev/pci/drm/radeon/radeon.h
@@ -1561,6 +1561,7 @@ struct radeon_device {
void *switchcbarg;
struct workq_task switchwqt;
struct rasops_info ro;
+ int console;
struct rwlock exclusive_lock;
diff --git a/sys/dev/pci/drm/radeon/radeon_kms.c b/sys/dev/pci/drm/radeon/radeon_kms.c
index 7ed2207a918..65998f7c8c1 100644
--- a/sys/dev/pci/drm/radeon/radeon_kms.c
+++ b/sys/dev/pci/drm/radeon/radeon_kms.c
@@ -1349,7 +1349,9 @@ static struct drm_driver_info kms_driver = {
int
radeondrm_probe(struct device *parent, void *match, void *aux)
{
- return drm_pciprobe((struct pci_attach_args *)aux, radeondrm_pciidlist);
+ if (drm_pciprobe(aux, radeondrm_pciidlist))
+ return 20;
+ return 0;
}
/**
@@ -1523,12 +1525,16 @@ radeondrm_attach_kms(struct device *parent, struct device *self, void *aux)
struct drm_device *dev;
struct pci_attach_args *pa = aux;
const struct drm_pcidev *id_entry;
-#ifndef __sparc64__
- struct vga_pci_softc *vga_sc = (struct vga_pci_softc *)parent;
-#endif
int is_agp;
pcireg_t type;
+#ifdef __sparc64__
+ extern int fbnode;
+#else
+ extern int vga_console_attached;
+ bus_space_handle_t ioh_vga;
+#endif
+
id_entry = drm_find_description(PCI_VENDOR(pa->pa_id),
PCI_PRODUCT(pa->pa_id), radeondrm_pciidlist);
rdev->flags = id_entry->driver_private;
@@ -1538,6 +1544,19 @@ radeondrm_attach_kms(struct device *parent, struct device *self, void *aux)
rdev->memt = pa->pa_memt;
rdev->dmat = pa->pa_dmat;
+#ifdef __sparc64__
+ if (fbnode == PCITAG_NODE(rdev->pa_tag))
+ rdev->console = 1;
+#else
+ if ((pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG)
+ & (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE))
+ == (PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE)) {
+ rdev->console = 1;
+ vga_console_attached = 1;
+ bus_space_map(pa->pa_iot, 0x3c0, 0x10, 0, &ioh_vga);
+ }
+#endif
+
#define RADEON_PCI_MEM 0x10
#define RADEON_PCI_IO 0x14
#define RADEON_PCI_MMIO 0x18
@@ -1603,10 +1622,6 @@ radeondrm_attach_kms(struct device *parent, struct device *self, void *aux)
return;
}
-#ifndef __sparc64__
- vga_sc->sc_type = -1;
-#endif
-
if (rootvp == NULL)
mountroothook_establish(radeondrm_attachhook, rdev);
else
@@ -1618,7 +1633,6 @@ radeondrm_attachhook(void *xsc)
{
struct radeon_device *rdev = xsc;
int r, acpi_status;
- int console = 0;
/* radeon_device_init should report only fatal error
* like memory allocation failure or iomapping failure,
@@ -1650,11 +1664,6 @@ radeondrm_attachhook(void *xsc)
}
{
-#ifdef __sparc64__
- extern int fbnode;
-#else
- extern int wsdisplay_console_initted;
-#endif
struct wsemuldisplaydev_attach_args aa;
struct rasops_info *ri = &rdev->ro;
@@ -1678,26 +1687,18 @@ radeondrm_attachhook(void *xsc)
radeondrm_stdscreen.fontwidth = ri->ri_font->fontwidth;
radeondrm_stdscreen.fontheight = ri->ri_font->fontheight;
-#ifdef __sparc64__
- if (fbnode == PCITAG_NODE(rdev->pa_tag))
- console = 1;
-#else
- console = wsdisplay_console_initted;
-#endif
-
- aa.console = console;
+ aa.console = rdev->console;
aa.scrdata = &radeondrm_screenlist;
aa.accessops = &radeondrm_accessops;
aa.accesscookie = rdev;
aa.defaultscreens = 0;
- if (console) {
+ if (rdev->console) {
long defattr;
ri->ri_ops.alloc_attr(ri->ri_active, 0, 0, 0, &defattr);
wsdisplay_cnattach(&radeondrm_stdscreen, ri->ri_active,
0, 0, defattr);
- aa.console = 1;
}
/*