Hi!

Remade Brad diff taking into account comments.

In original code (function viapm_attach):
bus_space_map(sc->sc_iot, iobase & 0xfffe,
                                  ^^^^^^^^^
Mask 0xfffe, but datasheet's must beat 0xfff0

-- 
Alexandr Shadchin
OpenBSD 4.7-beta (GENERIC) #35: Tue Feb 16 20:22:47 YEKT 2010
    [email protected]:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Intel Pentium III ("GenuineIntel" 686-class) 853 MHz
cpu0: 
FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,SER,MMX,FXSR,SSE
real mem  = 670593024 (639MB)
avail mem = 641101824 (611MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 04/12/01, BIOS32 rev. 0 @ 0xfb300, SMBIOS 
rev. 2.2 @ 0xf0800 (39 entries)
bios0: vendor Award Software International, Inc. version "4.51 PG" date 04/12/01
bios0: VIA Technologies, Inc. VT82C693/A
apm0 at bios0: Power Management spec V1.2 (slowidle)
apm0: AC on, battery charge unknown
acpi at bios0 function 0x0 not configured
pcibios0 at bios0: rev 2.1 @ 0xf0000/0xb788
pcibios0: PCI IRQ Routing Table rev 1.0 @ 0xfdf00/144 (7 entries)
pcibios0: PCI Exclusive IRQs: 5 7 10 11
pcibios0: PCI Interrupt Router at 000:07:0 ("VIA VT82C596A ISA" rev 0x00)
pcibios0: PCI bus #1 is the last bus
bios0: ROM list: 0xc0000/0xc800
cpu0 at mainbus0: (uniprocessor)
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 0 function 0 "VIA VT82C691 PCI" rev 0x44
viaagp0 at pchb0: v2
agp0 at viaagp0: aperture at 0xe0000000, size 0x10000000
ppb0 at pci0 dev 1 function 0 "VIA VT82C598 AGP" rev 0x00
pci1 at ppb0 bus 1
vga1 at pci1 dev 0 function 0 "NVIDIA GeForce2 MX" rev 0xb2
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
pcib0 at pci0 dev 7 function 0 "VIA VT82C596A ISA" rev 0x23
pciide0 at pci0 dev 7 function 1 "VIA VT82C571 IDE" rev 0x10: ATA66, channel 0 
configured to compatibility, channel 1 configured to compatibility
atapiscsi0 at pciide0 channel 0 drive 0
scsibus0 at atapiscsi0: 2 targets
cd0 at scsibus0 targ 0 lun 0: <_NEC, DVD_RW ND-3500AG, 2.1B> ATAPI 5/cdrom 
removable
cd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
wd0 at pciide0 channel 1 drive 0: <ST340016A>
wd0: 16-sector PIO, LBA, 39097MB, 80070686 sectors
wd1 at pciide0 channel 1 drive 1: <ST340016A>
wd1: 16-sector PIO, LBA, 38166MB, 78165360 sectors
wd0(pciide0:1:0): using PIO mode 4, Ultra-DMA mode 4
wd1(pciide0:1:1): using PIO mode 4, Ultra-DMA mode 4
uhci0 at pci0 dev 7 function 2 "VIA VT83C572 USB" rev 0x11: irq 10
viapm0 at pci0 dev 7 function 3 "VIA VT82C596 Power" rev 0x30
iic0 at viapm0
spdmem0 at iic0 addr 0x50: 128MB SDRAM non-parity PC133CL2
spdmem1 at iic0 addr 0x51: 256MB SDRAM non-parity PC133CL3
spdmem2 at iic0 addr 0x52: 256MB SDRAM non-parity PC133CL3
skc0 at pci0 dev 8 function 0 "D-Link Systems DGE-530T B1" rev 0x11, Yukon Lite 
(0x9): irq 11
sk0 at skc0 port A: address 00:17:9a:06:14:4f
eephy0 at sk0 phy 0: 88E1011 Gigabit PHY, rev. 5
envy0 at pci0 dev 9 function 0 "IC Ensemble Envy24PT/HT Audio" rev 0x01: irq 5
envy0: VIA Tremor 5.1, 2 inputs, 6 outputs
ac97: codec id 0x56494170 (VIA Technologies VT1617A)
ac97: codec features headphone, 18 bit DAC, 18 bit ADC, KS Waves 3D
audio0 at envy0
rl0 at pci0 dev 10 function 0 "Realtek 8139" rev 0x10: irq 7, address 
00:50:22:40:2b:23
rlphy0 at rl0 phy 0: RTL internal PHY
rl1 at pci0 dev 12 function 0 "D-Link Systems 530TX+" rev 0x10: irq 11, address 
00:55:d0:ca:12:21
rlphy1 at rl1 phy 0: RTL internal PHY
isa0 at pcib0
isadma0 at isa0
pckbc0 at isa0 port 0x60/5
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pmsi0 at pckbc0 (aux slot)
pckbc0: using irq 12 for aux slot
wsmouse0 at pmsi0 mux 0
pcppi0 at isa0 port 0x61
midi0 at pcppi0: <PC speaker>
spkr0 at pcppi0
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
fdc0 at isa0 port 0x3f0/6 irq 6 drq 2
usb0 at uhci0: USB revision 1.0
uhub0 at usb0 "VIA UHCI root hub" rev 1.00/1.00 addr 1
biomask e75d netmask efdd ttymask ffdf
mtrr: Pentium Pro MTRR support
vscsi0 at root
scsibus1 at vscsi0: 256 targets
softraid0 at root
root on wd0a swap on wd0b dump on wd0b
pppoe0: received unexpected PADO
Index: viapm.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/viapm.c,v
retrieving revision 1.12
diff -u -p -r1.12 viapm.c
--- viapm.c     26 Jun 2009 02:46:27 -0000      1.12
+++ viapm.c     16 Feb 2010 15:28:59 -0000
@@ -40,8 +40,11 @@
  */
 
 /* PCI configuration registers */
-#define VIAPM_SMB_BASE 0xd0            /* SMBus base address */
-#define VIAPM_SMB_HOSTC        0xd2            /* host configuration */
+#define VIAPM_SMB_BASE1        0x90            /* SMBus base address */
+#define VIAPM_SMB_BASE2        0x80
+#define VIAPM_SMB_BASE3        0xd0
+#define VIAPM_SMB_HOSTC1       0xd2            /* host configuration */
+#define VIAPM_SMB_HOSTC2       0x84
 #define VIAPM_SMB_HOSTC_HSTEN  (1 << 0)        /* enable host controller */
 #define VIAPM_SMB_HOSTC_INTEN  (1 << 1)        /* enable SCI/SMI */
 #define VIAPM_SMB_HOSTC_SCIEN  (1 << 3)        /* interrupt type (SCI/SMI) */
@@ -125,6 +128,10 @@ struct cfdriver viapm_cd = {
 };
 
 const struct pci_matchid viapm_ids[] = {
+       { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C596 },
+       { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C596B_PM },
+       { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C686A_SMB },
+       { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT8231_PWR },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT8233_ISA },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT8233A_ISA },
        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT8235_ISA },
@@ -151,23 +158,42 @@ viapm_attach(struct device *parent, stru
        struct pci_attach_args *pa = aux;
        struct i2cbus_attach_args iba;
        pcireg_t conf, iobase;
+       int basereg, hstcfg = (VIAPM_SMB_HOSTC1 & 0xfc);
 #if 0
        pci_intr_handle_t ih;
        const char *intrstr = NULL;
 #endif
 
+       switch (PCI_PRODUCT(pa->pa_id)) {
+       case PCI_PRODUCT_VIATECH_VT82C596:
+       case PCI_PRODUCT_VIATECH_VT82C596B_PM:
+       case PCI_PRODUCT_VIATECH_VT82C686A_SMB:
+       case PCI_PRODUCT_VIATECH_VT8231_PWR:
+               basereg = VIAPM_SMB_BASE1;
+               break;
+       default:
+               basereg = VIAPM_SMB_BASE3;
+       }
+
        /* Map I/O space */
        sc->sc_iot = pa->pa_iot;
-       iobase = pci_conf_read(pa->pa_pc, pa->pa_tag, VIAPM_SMB_BASE);
+       iobase = pci_conf_read(pa->pa_pc, pa->pa_tag, basereg);
+       if ((PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VIATECH_VT82C596) &&
+           !(iobase & 0x0001)) {
+               iobase = pci_conf_read(pa->pa_pc, pa->pa_tag, VIAPM_SMB_BASE2);
+               hstcfg = VIAPM_SMB_HOSTC2;
+       }
        if (iobase == 0 ||
-           bus_space_map(sc->sc_iot, iobase & 0xfffe,
+           bus_space_map(sc->sc_iot, iobase & 0xfff0,
            VIAPM_SMB_SIZE, 0, &sc->sc_ioh)) {
                printf(": can't map i/o space\n");
                return;
        }
 
        /* Read configuration */
-       conf = (iobase >> 16);
+       conf = pci_conf_read(pa->pa_pc, pa->pa_tag, hstcfg);
+       if (hstcfg != VIAPM_SMB_HOSTC2)
+               conf >>= 16;
        DPRINTF((": conf 0x%x", conf));
 
        if ((conf & VIAPM_SMB_HOSTC_HSTEN) == 0) {

Reply via email to