PCI config space is not restored upon resume (macbook pro)
Oleg Sharoyko
osharoiko at gmail.com
Wed Aug 4 07:13:06 UTC 2010
On 3 August 2010 20:25, Oleg Sharoyko <osharoiko at gmail.com> wrote:
>> I wonder if the bus numbers for PCI-PCI bridges need to be restored on resume?
>> If they aren't then config transactions won't be routed properly. You could
>> add a pcib_resume() method that prints out the various bus register values
>> after resume to see if they match what we print out during boot.
Indeed this was the problem of PCI-PIC bridges' registers not being
restored upon resume.
Thanks for your advise! I'm including the patch, which uses exiting
methods from dev/pic/pic_pci.c
to save/restore bridges' registers on suspend/resume. With it my
macbook pro no longer
looses devices after resume.
Unfortunately it doesn't help with videocard problem. Though I no
longer see 'failed to reload state'
message, display still stays blank and dark after resume. Would
freebsd-acpi be the right list
to ask for help or can you recommend anything else I can do to solve
this problem?
Index: dev/acpica/acpi_pcib_pci.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/acpica/acpi_pcib_pci.c,v
retrieving revision 1.18
diff -u -r1.18 acpi_pcib_pci.c
--- dev/acpica/acpi_pcib_pci.c 5 Jun 2009 18:44:36 -0000 1.18
+++ dev/acpica/acpi_pcib_pci.c 4 Aug 2010 06:54:36 -0000
@@ -65,6 +65,7 @@
static int acpi_pcib_pci_probe(device_t bus);
static int acpi_pcib_pci_attach(device_t bus);
+static int acpi_pcib_pci_suspend(device_t bus);
static int acpi_pcib_pci_resume(device_t bus);
static int acpi_pcib_read_ivar(device_t dev, device_t child,
int which, uintptr_t *result);
@@ -76,7 +77,7 @@
DEVMETHOD(device_probe, acpi_pcib_pci_probe),
DEVMETHOD(device_attach, acpi_pcib_pci_attach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
- DEVMETHOD(device_suspend, bus_generic_suspend),
+ DEVMETHOD(device_suspend, acpi_pcib_pci_suspend),
DEVMETHOD(device_resume, acpi_pcib_pci_resume),
/* Bus interface */
@@ -142,9 +143,20 @@
}
static int
-acpi_pcib_pci_resume(device_t dev)
+acpi_pcib_pci_suspend(device_t dev)
{
+ struct acpi_pcib_softc *sc;
+ sc = device_get_softc(dev);
+ pcib_cfg_save(&sc->ap_pcibsc);
+ return (bus_generic_suspend(dev));
+}
+static int
+acpi_pcib_pci_resume(device_t dev)
+{
+ struct acpi_pcib_softc *sc;
+ sc = device_get_softc(dev);
+ pcib_cfg_restore(&sc->ap_pcibsc);
return (acpi_pcib_resume(dev));
}
Index: dev/pci/pci_pci.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci_pci.c,v
retrieving revision 1.61
diff -u -r1.61 pci_pci.c
--- dev/pci/pci_pci.c 10 Dec 2009 01:01:53 -0000 1.61
+++ dev/pci/pci_pci.c 4 Aug 2010 06:54:36 -0000
@@ -238,7 +238,7 @@
/*
* Get current bridge configuration.
*/
-static void
+void
pcib_cfg_save(struct pcib_softc *sc)
{
device_t dev;
@@ -260,7 +260,7 @@
/*
* Restore previous bridge configuration.
*/
-static void
+void
pcib_cfg_restore(struct pcib_softc *sc)
{
device_t dev;
Index: dev/pci/pcib_private.h
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pcib_private.h,v
retrieving revision 1.15
diff -u -r1.15 pcib_private.h
--- dev/pci/pcib_private.h 14 Mar 2009 14:08:53 -0000 1.15
+++ dev/pci/pcib_private.h 4 Aug 2010 06:54:36 -0000
@@ -82,5 +82,7 @@
int pcib_alloc_msix(device_t pcib, device_t dev, int *irq);
int pcib_release_msix(device_t pcib, device_t dev, int irq);
int pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t
*addr, uint32_t *data);
+void pcib_cfg_save(struct pcib_softc *sc);
+void pcib_cfg_restore(struct pcib_softc *sc);
#endif
--
Oleg Sharoyko
More information about the freebsd-hackers
mailing list