Index: dev/pci/piixpm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/piixpm.c,v
retrieving revision 1.35
diff -u -r1.35 piixpm.c
--- dev/pci/piixpm.c    9 Apr 2011 04:33:40 -0000       1.35
+++ dev/pci/piixpm.c    24 Apr 2011 03:16:31 -0000
@@ -115,6 +115,7 @@
        struct piixpm_softc *sc = (struct piixpm_softc *)self;
        struct pci_attach_args *pa = aux;
        struct i2cbus_attach_args iba;
+       u_int8_t base_en_low, base_en_high;
        pcireg_t base, conf;
        pci_intr_handle_t ih;
        const char *intrstr = NULL;
@@ -123,19 +124,33 @@
        conf = pci_conf_read(pa->pa_pc, pa->pa_tag, PIIX_SMB_HOSTC);
        DPRINTF((": conf 0x%08x", conf));
 
-       if ((conf & PIIX_SMB_HOSTC_HSTEN) == 0) {
-               printf(": SMBus disabled\n");
-               return;
-       }
-
        /* Map I/O space */
        sc->sc_iot = pa->pa_iot;
-       base = pci_conf_read(pa->pa_pc, pa->pa_tag, PIIX_SMB_BASE) & 0xffff;
-       if (PCI_MAPREG_IO_ADDR(base) == 0 ||
-           bus_space_map(sc->sc_iot, PCI_MAPREG_IO_ADDR(base),
-           PIIX_SMB_SIZE, 0, &sc->sc_ioh)) {
-               printf(": can't map i/o space\n");
-               return;
+       if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ATI &&
+           PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ATI_SBX00_SMB &&
+           PCI_REVISION(pa->pa_class) >= 0x40) {
+               /* SB800+ SMB configuration.. pio macros avoidable? */
+               outb(0xcd6, 0x2c);
+               base_en_low = inb(0xcd7);
+               outb(0xcd6, 0x2d);
+               base_en_high = inb(0xcd7);
+               base = ((base_en_high << 8) | base_en_low) & 0xffe0;
+               bus_space_map(sc->sc_iot, PCI_MAPREG_IO_ADDR(base),
+                   PIIX_SMB_SIZE, 0, &sc->sc_ioh);
+       } else {
+               if ((conf & PIIX_SMB_HOSTC_HSTEN) == 0) {
+                       printf(": SMBus disabled\n");
+                       return;
+               }
+
+               base = pci_conf_read(pa->pa_pc, pa->pa_tag,
+                   PIIX_SMB_BASE) & 0xffff;
+               if (PCI_MAPREG_IO_ADDR(base) == 0 ||
+                   bus_space_map(sc->sc_iot, PCI_MAPREG_IO_ADDR(base),
+                   PIIX_SMB_SIZE, 0, &sc->sc_ioh)) {
+                       printf(": can't map i/o space\n");
+                       return;
+               }
        }
 
        sc->sc_poll = 1;

Reply via email to