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