diff options
author | randyf <none@none> | 2007-10-20 16:00:42 -0700 |
---|---|---|
committer | randyf <none@none> | 2007-10-20 16:00:42 -0700 |
commit | 2df1fe9ca32bb227b9158c67f5c00b54c20b10fd (patch) | |
tree | 358c576f885c00d42a760d9e35e5b66e77209fe2 /usr/src/uts/intel/io/pci/pci_pci.c | |
parent | 10b3fbf593a6678eec9b50a01903ef4eb73111e4 (diff) | |
download | illumos-gate-2df1fe9ca32bb227b9158c67f5c00b54c20b10fd.tar.gz |
PSARC/2005/469 X86 Energy Star compliance
PSARC/2006/632 PSMI extension for state save and restore
6330209 nge needs to support DDI_SUSPEND/DDI_RESUME
6381827 Suspend to RAM on x86
6393154 audio810 needs to support DDI_SUSPEND/DDI_RESUME
6397047 fd, fdc needs to support Suspend/Resume
6401974 cannot enter S3 with ohci PME enable set on Tyan 2865 with Sun or Tyan 2.01 BIOS
6422613 memscrubber doesn't re-acquire lock before CALLB_CPR_EXIT
6455736 ata/dadk/cmdk should support DDI_SUSPEND/DDI_RESUME
6511370 CPR on SPARC regression
6586018 TODOP Macros in i86pc/sys/machclock.h not in sun4u/sun4v equivilent (Sparc only)
6610124 It takes more than 3 minutes after printing "pci_pre_resume nv_sata:0"
6617143 powerd/pmconfig emits a different default message for an existing on or off action.
--HG--
rename : usr/src/cmd/power/power.conf => usr/src/cmd/power/power.conf.sparc
Diffstat (limited to 'usr/src/uts/intel/io/pci/pci_pci.c')
-rw-r--r-- | usr/src/uts/intel/io/pci/pci_pci.c | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/usr/src/uts/intel/io/pci/pci_pci.c b/usr/src/uts/intel/io/pci/pci_pci.c index b6dbe7f1b9..753c04d8f8 100644 --- a/usr/src/uts/intel/io/pci/pci_pci.c +++ b/usr/src/uts/intel/io/pci/pci_pci.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -319,7 +319,7 @@ ppb_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) DDI_FM_EREPORT_CAPABLE)) pci_ereport_setup(devi); if (ppb->ppb_fmcap & DDI_FM_ERRCB_CAPABLE) - ddi_fm_handler_register(devi, ppb_fm_callback, NULL); + ddi_fm_handler_register(devi, ppb_fm_callback, NULL); if (pci_config_setup(devi, &config_handle) != DDI_SUCCESS) { if (ppb->ppb_fmcap & DDI_FM_ERRCB_CAPABLE) @@ -348,7 +348,8 @@ ppb_attach(dev_info_t *devi, ddi_attach_cmd_t cmd) * to this bus. */ if (pcihp_init(devi) != DDI_SUCCESS) - cmn_err(CE_WARN, "pci: Failed to setup hotplug framework"); + cmn_err(CE_WARN, + "pci: Failed to setup hotplug framework"); ddi_report_dev(devi); return (DDI_SUCCESS); @@ -419,7 +420,7 @@ ppb_bus_map(dev_info_t *dip, dev_info_t *rdip, ddi_map_req_t *mp, pdip = (dev_info_t *)DEVI(dip)->devi_parent; return ((DEVI(pdip)->devi_ops->devo_bus_ops->bus_map)(pdip, - rdip, mp, offset, len, vaddrp)); + rdip, mp, offset, len, vaddrp)); } /*ARGSUSED*/ @@ -432,6 +433,7 @@ ppb_ctlops(dev_info_t *dip, dev_info_t *rdip, int rn; int totreg; ppb_devstate_t *ppb; + struct attachspec *asp; switch (ctlop) { case DDI_CTLOPS_REPORTDEV: @@ -459,6 +461,22 @@ ppb_ctlops(dev_info_t *dip, dev_info_t *rdip, return (DDI_FAILURE); break; + /* X86 systems support PME wakeup from suspend */ + case DDI_CTLOPS_ATTACH: + asp = (struct attachspec *)arg; + if (asp->cmd == DDI_RESUME && asp->when == DDI_PRE) + if (pci_pre_resume(rdip) != DDI_SUCCESS) + return (DDI_FAILURE); + return (ddi_ctlops(dip, rdip, ctlop, arg, result)); + + + case DDI_CTLOPS_DETACH: + asp = (struct attachspec *)arg; + if (asp->cmd == DDI_SUSPEND && asp->when == DDI_POST) + if (pci_post_suspend(rdip) != DDI_SUCCESS) + return (DDI_FAILURE); + return (ddi_ctlops(dip, rdip, ctlop, arg, result)); + case DDI_CTLOPS_PEEK: case DDI_CTLOPS_POKE: ppb = ddi_get_soft_state(ppb_state, ddi_get_instance(dip)); @@ -474,8 +492,8 @@ ppb_ctlops(dev_info_t *dip, dev_info_t *rdip, *(int *)result = 0; if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, - DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, "reg", - (caddr_t)&drv_regp, ®len) != DDI_SUCCESS) + DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP, "reg", + (caddr_t)&drv_regp, ®len) != DDI_SUCCESS) return (DDI_FAILURE); totreg = reglen / sizeof (pci_regspec_t); @@ -596,8 +614,8 @@ ppb_initchild(dev_info_t *child) } /* transfer select properties from PROM to kernel */ - if (ddi_getprop(DDI_DEV_T_NONE, child, DDI_PROP_DONTPASS, "interrupts", - -1) != -1) { + if (ddi_getprop(DDI_DEV_T_NONE, child, DDI_PROP_DONTPASS, + "interrupts", -1) != -1) { pdptr = kmem_zalloc((sizeof (struct ddi_parent_private_data) + sizeof (struct intrspec)), KM_SLEEP); pdptr->par_intr = (struct intrspec *)(pdptr + 1); @@ -660,20 +678,20 @@ ppb_save_config_regs(ppb_devstate_t *ppb_p) ddi_acc_handle_t config_handle; for (i = 0, dip = ddi_get_child(ppb_p->dip); dip != NULL; - i++, dip = ddi_get_next_sibling(dip)) { + i++, dip = ddi_get_next_sibling(dip)) { if (pci_config_setup(dip, &config_handle) != DDI_SUCCESS) { cmn_err(CE_WARN, "%s%d: can't config space for %s%d\n", - ddi_driver_name(ppb_p->dip), - ddi_get_instance(ppb_p->dip), - ddi_driver_name(dip), - ddi_get_instance(dip)); + ddi_driver_name(ppb_p->dip), + ddi_get_instance(ppb_p->dip), + ddi_driver_name(dip), + ddi_get_instance(dip)); continue; } ppb_p->config_state[i].dip = dip; ppb_p->config_state[i].command = - pci_config_get16(config_handle, PCI_CONF_COMM); + pci_config_get16(config_handle, PCI_CONF_COMM); pci_config_teardown(&config_handle); } ppb_p->config_state_index = i; @@ -701,14 +719,14 @@ ppb_restore_config_regs(ppb_devstate_t *ppb_p) dip = ppb_p->config_state[i].dip; if (pci_config_setup(dip, &config_handle) != DDI_SUCCESS) { cmn_err(CE_WARN, "%s%d: can't config space for %s%d\n", - ddi_driver_name(ppb_p->dip), - ddi_get_instance(ppb_p->dip), - ddi_driver_name(dip), - ddi_get_instance(dip)); + ddi_driver_name(ppb_p->dip), + ddi_get_instance(ppb_p->dip), + ddi_driver_name(dip), + ddi_get_instance(dip)); continue; } pci_config_put16(config_handle, PCI_CONF_COMM, - ppb_p->config_state[i].command); + ppb_p->config_state[i].command); pci_config_teardown(&config_handle); } } |