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) {