Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/dev/pci/piixpm.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/dev/pci/piixpm.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.45.4.2 retrieving revision 1.45.4.3 diff -u -p -r1.45.4.2 -r1.45.4.3 --- src/sys/dev/pci/piixpm.c 2015/12/27 12:09:57 1.45.4.2 +++ src/sys/dev/pci/piixpm.c 2016/10/05 20:55:55 1.45.4.3 @@ -1,4 +1,4 @@ -/* $NetBSD: piixpm.c,v 1.45.4.2 2015/12/27 12:09:57 skrll Exp $ */ +/* $NetBSD: piixpm.c,v 1.45.4.3 2016/10/05 20:55:55 skrll Exp $ */ /* $OpenBSD: piixpm.c,v 1.20 2006/02/27 08:25:02 grange Exp $ */ /* @@ -22,7 +22,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.45.4.2 2015/12/27 12:09:57 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: piixpm.c,v 1.45.4.3 2016/10/05 20:55:55 skrll Exp $"); #include #include @@ -144,6 +144,13 @@ piixpm_match(device_t parent, cfdata_t m case PCI_PRODUCT_SERVERWORKS_HT1000SB: return 1; } + break; + case PCI_VENDOR_AMD: + switch (PCI_PRODUCT(pa->pa_id)) { + case PCI_PRODUCT_AMD_HUDSON_SMB: + return 1; + } + break; } return 0; @@ -190,7 +197,8 @@ piixpm_attach(device_t parent, device_t base = pci_conf_read(pa->pa_pc, pa->pa_tag, PIIX_PM_BASE); if (bus_space_map(sc->sc_pm_iot, PCI_MAPREG_IO_ADDR(base), PIIX_PM_SIZE, 0, &sc->sc_pm_ioh)) { - aprint_error_dev(self, "can't map power management I/O space\n"); + aprint_error_dev(self, + "can't map power management I/O space\n"); goto nopowermanagement; } @@ -205,7 +213,15 @@ piixpm_attach(device_t parent, device_t nopowermanagement: - /* SB800 rev 0x40+ needs special initialization */ + /* SB800 rev 0x40+ and AMD HUDSON need special initialization */ + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_AMD && + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_HUDSON_SMB) { + if (piixpm_sb800_init(sc) == 0) { + goto attach_i2c; + } + aprint_normal_dev(self, "SMBus initialization failed\n"); + return; + } if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ATI && PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ATI_SB600_SMB && PCI_REVISION(pa->pa_class) >= 0x40) { @@ -213,7 +229,7 @@ nopowermanagement: sc->sc_numbusses = 4; goto attach_i2c; } - aprint_normal_dev(self, "SMBus disabled\n"); + aprint_normal_dev(self, "SMBus initialization failed\n"); return; } @@ -238,9 +254,10 @@ nopowermanagement: } else if ((conf & PIIX_SMB_HOSTC_INTMASK) == PIIX_SMB_HOSTC_IRQ) { /* Install interrupt handler */ if (pci_intr_map(pa, &ih) == 0) { - intrstr = pci_intr_string(pa->pa_pc, ih, intrbuf, sizeof(intrbuf)); - sc->sc_smb_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO, - piixpm_intr, sc); + intrstr = pci_intr_string(pa->pa_pc, ih, intrbuf, + sizeof(intrbuf)); + sc->sc_smb_ih = pci_intr_establish(pa->pa_pc, ih, + IPL_BIO, piixpm_intr, sc); if (sc->sc_smb_ih != NULL) { aprint_normal("interrupting at %s", intrstr); sc->sc_poll = 0; @@ -367,7 +384,8 @@ piixpm_sb800_init(struct piixpm_softc *s aprint_debug_dev(sc->sc_dev, "SMBus @ 0x%04x\n", base_addr); - bus_space_write_1(iot, ioh, PIIXPM_INDIRECTIO_INDEX, SB800_PM_SMBUS0SELEN); + bus_space_write_1(iot, ioh, PIIXPM_INDIRECTIO_INDEX, + SB800_PM_SMBUS0SELEN); bus_space_write_1(iot, ioh, PIIXPM_INDIRECTIO_DATA, 1); /* SMBUS0SEL */ if (bus_space_map(iot, PCI_MAPREG_IO_ADDR(base_addr), @@ -458,8 +476,8 @@ piixpm_i2c_exec(void *cookie, i2c_op_t o device_xname(sc->sc_dev), op, addr, cmdlen, len, flags)); /* Clear status bits */ - bus_space_write_1(sc->sc_smb_iot, sc->sc_smb_ioh, PIIX_SMB_HS, - PIIX_SMB_HS_INTR | PIIX_SMB_HS_DEVERR | + bus_space_write_1(sc->sc_smb_iot, sc->sc_smb_ioh, PIIX_SMB_HS, + PIIX_SMB_HS_INTR | PIIX_SMB_HS_DEVERR | PIIX_SMB_HS_BUSERR | PIIX_SMB_HS_FAILED); bus_space_barrier(sc->sc_smb_iot, sc->sc_smb_ioh, PIIX_SMB_HS, 1, BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); @@ -570,7 +588,8 @@ timeout: DELAY(PIIXPM_DELAY); st = bus_space_read_1(sc->sc_smb_iot, sc->sc_smb_ioh, PIIX_SMB_HS); if ((st & PIIX_SMB_HS_FAILED) == 0) - aprint_error_dev(sc->sc_dev, "transaction abort failed, status 0x%x\n", st); + aprint_error_dev(sc->sc_dev, + "transaction abort failed, status 0x%x\n", st); bus_space_write_1(sc->sc_smb_iot, sc->sc_smb_ioh, PIIX_SMB_HS, st); /* * CSB5 needs hard reset to unlock the smbus after timeout.