summaryrefslogtreecommitdiff
path: root/sys/pci/amdpm.c
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>2003-09-06 13:56:56 +0000
committerDoug Rabson <dfr@FreeBSD.org>2003-09-06 13:56:56 +0000
commit8e60aa28ab7c2670642e60ef54e3cf0ab0284dcc (patch)
tree6510b4bf2b8369759b62789cca25090777e5737b /sys/pci/amdpm.c
parentdcae6166e2c12c4a2f5ff0022fd4456ee8d4b6a4 (diff)
Notes
Diffstat (limited to 'sys/pci/amdpm.c')
-rw-r--r--sys/pci/amdpm.c137
1 files changed, 36 insertions, 101 deletions
diff --git a/sys/pci/amdpm.c b/sys/pci/amdpm.c
index c3868fe5e93b..d972a47c38c4 100644
--- a/sys/pci/amdpm.c
+++ b/sys/pci/amdpm.c
@@ -90,9 +90,7 @@ static int amdpm_debug = 0;
* Base address programmed via AMDPCI_PMBASE.
*/
-static u_int32_t pm_reg_offset = 0xE0;
-
-#define AMDSMB_GLOBAL_STATUS (0x00 + pm_reg_offset)
+#define AMDSMB_GLOBAL_STATUS (0x00)
#define AMDSMB_GS_TO_STS (1<<5)
#define AMDSMB_GS_HCYC_STS (1<<4)
#define AMDSMB_GS_HST_STS (1<<3)
@@ -101,7 +99,7 @@ static u_int32_t pm_reg_offset = 0xE0;
#define AMDSMB_GS_ABRT_STS (1<<0)
#define AMDSMB_GS_CLEAR_STS (AMDSMB_GS_TO_STS|AMDSMB_GS_HCYC_STS|AMDSMB_GS_PRERR_STS|AMDSMB_GS_COL_STS|AMDSMB_GS_ABRT_STS)
-#define AMDSMB_GLOBAL_ENABLE (0x02 + pm_reg_offset)
+#define AMDSMB_GLOBAL_ENABLE (0x02)
#define AMDSMB_GE_ABORT (1<<5)
#define AMDSMB_GE_HCYC_EN (1<<4)
#define AMDSMB_GE_HOST_STC (1<<3)
@@ -112,14 +110,14 @@ static u_int32_t pm_reg_offset = 0xE0;
#define AMDSMB_GE_CYC_PROCCALL 4
#define AMDSMB_GE_CYC_BLOCK 5
-#define AMDSMB_HSTADDR (0x04 + pm_reg_offset)
-#define AMDSMB_HSTDATA (0x06 + pm_reg_offset)
-#define AMDSMB_HSTCMD (0x08 + pm_reg_offset)
-#define AMDSMB_HSTDFIFO (0x09 + pm_reg_offset)
-#define AMDSMB_HSLVDATA (0x0A + pm_reg_offset)
-#define AMDSMB_HSLVDA (0x0C + pm_reg_offset)
-#define AMDSMB_HSLVDDR (0x0E + pm_reg_offset)
-#define AMDSMB_SNPADDR (0x0F + pm_reg_offset)
+#define AMDSMB_HSTADDR (0x04)
+#define AMDSMB_HSTDATA (0x06)
+#define AMDSMB_HSTCMD (0x08)
+#define AMDSMB_HSTDFIFO (0x09)
+#define AMDSMB_HSLVDATA (0x0A)
+#define AMDSMB_HSLVDA (0x0C)
+#define AMDSMB_HSLVDDR (0x0E)
+#define AMDSMB_SNPADDR (0x0F)
struct amdpm_softc {
int base;
@@ -144,10 +142,12 @@ static int
amdpm_probe(device_t dev)
{
u_long base;
+ u_int16_t vid;
u_int16_t did;
+ vid = pci_get_vendor(dev);
did = pci_get_device(dev);
- if ((pci_get_vendor(dev) == AMDPM_VENDORID_AMD) &&
+ if ((vid == AMDPM_VENDORID_AMD) &&
((did == AMDPM_DEVICEID_AMD756PM) ||
(did == AMDPM_DEVICEID_AMD766PM) ||
(did == AMDPM_DEVICEID_AMD768PM))) {
@@ -159,9 +159,27 @@ amdpm_probe(device_t dev)
*/
base = pci_read_config(dev, AMDPCI_PMBASE, 4);
base &= 0xff00;
- bus_set_resource(dev, SYS_RES_IOPORT, AMDPCI_PMBASE, base, 256);
+ bus_set_resource(dev, SYS_RES_IOPORT, AMDPCI_PMBASE,
+ base+0xe0, 32);
return (0);
}
+
+ if ((vid == AMDPM_VENDORID_NVIDIA) &&
+ (did == AMDPM_DEVICEID_NF_SMB)) {
+ device_set_desc(dev, "nForce SMBus Controller");
+
+ /*
+ * We have to do this, since the BIOS won't give us the
+ * resource info (not mine, anyway).
+ */
+ base = pci_read_config(dev, NFPCI_PMBASE, 4);
+ base &= 0xff00;
+ bus_set_resource(dev, SYS_RES_IOPORT, NFPCI_PMBASE,
+ base, 32);
+
+ return (0);
+ }
+
return ENXIO;
}
@@ -176,7 +194,10 @@ amdpm_attach(device_t dev)
pci_write_config(dev, AMDPCI_GEN_CONFIG_PM, val_b | AMDPCI_PMIOEN, 1);
/* Allocate I/O space */
- amdpm_sc->rid = AMDPCI_PMBASE;
+ if (pci_get_vendor(dev) == AMDPM_VENDORID_AMD)
+ amdpm_sc->rid = AMDPCI_PMBASE;
+ else
+ amdpm_sc->rid = NFPCI_PMBASE;
amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE);
if (amdpm_sc->res == NULL) {
@@ -215,62 +236,6 @@ amdpm_detach(device_t dev)
}
static int
-nfpm_probe(device_t dev)
-{
- u_long base;
-
- if ((pci_get_vendor(dev) == AMDPM_VENDORID_NVIDIA) &&
- (pci_get_device(dev) == AMDPM_DEVICEID_NF_SMB)) {
- device_set_desc(dev, "nForce SMBus Controller");
-
- /*
- * We have to do this, since the BIOS won't give us the
- * resource info (not mine, anyway).
- */
- base = pci_read_config(dev, NFPCI_PMBASE, 4);
- base &= 0xff00;
- bus_set_resource(dev, SYS_RES_IOPORT, NFPCI_PMBASE, base, 256);
-
- pm_reg_offset = 0x00;
-
- return (0);
- }
- return ENXIO;
-}
-
-static int
-nfpm_attach(device_t dev)
-{
- struct amdpm_softc *amdpm_sc = device_get_softc(dev);
- u_char val_b;
-
- /* Enable I/O block access */
- val_b = pci_read_config(dev, AMDPCI_GEN_CONFIG_PM, 1);
- pci_write_config(dev, AMDPCI_GEN_CONFIG_PM, val_b | AMDPCI_PMIOEN, 1);
-
- /* Allocate I/O space */
- amdpm_sc->rid = NFPCI_PMBASE;
- amdpm_sc->res = bus_alloc_resource(dev, SYS_RES_IOPORT, &amdpm_sc->rid, 0, ~0, 1, RF_ACTIVE);
-
- if (amdpm_sc->res == NULL) {
- device_printf(dev, "could not map i/o space\n");
- return (ENXIO);
- }
-
- amdpm_sc->smbst = rman_get_bustag(amdpm_sc->res);
- amdpm_sc->smbsh = rman_get_bushandle(amdpm_sc->res);
-
- /* Allocate a new smbus device */
- amdpm_sc->smbus = device_add_child(dev, "smbus", -1);
- if (!amdpm_sc->smbus)
- return (EINVAL);
-
- bus_generic_attach(dev);
-
- return (0);
-}
-
-static int
amdpm_callback(device_t dev, int index, caddr_t *data)
{
int error = 0;
@@ -650,37 +615,7 @@ static driver_t amdpm_driver = {
sizeof(struct amdpm_softc),
};
-static devclass_t nfpm_devclass;
-
-static device_method_t nfpm_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, nfpm_probe),
- DEVMETHOD(device_attach, nfpm_attach),
- DEVMETHOD(device_detach, amdpm_detach),
-
- /* SMBus interface */
- DEVMETHOD(smbus_callback, amdpm_callback),
- DEVMETHOD(smbus_quick, amdpm_quick),
- DEVMETHOD(smbus_sendb, amdpm_sendb),
- DEVMETHOD(smbus_recvb, amdpm_recvb),
- DEVMETHOD(smbus_writeb, amdpm_writeb),
- DEVMETHOD(smbus_readb, amdpm_readb),
- DEVMETHOD(smbus_writew, amdpm_writew),
- DEVMETHOD(smbus_readw, amdpm_readw),
- DEVMETHOD(smbus_bwrite, amdpm_bwrite),
- DEVMETHOD(smbus_bread, amdpm_bread),
-
- { 0, 0 }
-};
-
-static driver_t nfpm_driver = {
- "nfpm",
- nfpm_methods,
- sizeof(struct amdpm_softc),
-};
-
DRIVER_MODULE(amdpm, pci, amdpm_driver, amdpm_devclass, 0, 0);
-DRIVER_MODULE(nfpm, pci, nfpm_driver, nfpm_devclass, 0, 0);
MODULE_DEPEND(amdpm, pci, 1, 1, 1);
MODULE_DEPEND(amdpm, smbus, SMBUS_MINVER, SMBUS_PREFVER, SMBUS_MAXVER);