Subject: Re: viaide(4) patch for suspend/resume
To: None <current-users@netbsd.org>
From: Christos Zoulas <christos@astron.com>
List: current-users
Date: 12/22/2007 17:10:40
In article <20071221222135.GA2241@britannica.bec.de>,
Joerg Sonnenberger <joerg@britannica.bec.de> wrote:
>-=-=-=-=-=-
>
>Hi all,
>can someone with viaide(4) test suspend/resume with the attached patch?
>E.g. if reading uncached directories afterwards is still possible?
>
>Joerg
>
>-=-=-=-=-=-
>
>Index: pciidevar.h
>===================================================================
>RCS file: /data/repo/netbsd/src/sys/dev/pci/pciidevar.h,v
>retrieving revision 1.35
>diff -u -p -r1.35 pciidevar.h
>--- pciidevar.h 17 Oct 2006 13:45:05 -0000 1.35
>+++ pciidevar.h 19 Dec 2007 14:25:34 -0000
>@@ -150,12 +150,7 @@ struct pciide_softc {
> #endif /* NATA_DMA */
> } pciide_channels[PCIIDE_MAX_CHANNELS];
>
>- /* Power management */
>- void *sc_powerhook;
>- struct pci_conf_state sc_pciconf; /* Restore buffer */
>- /* Intel power management */
>- pcireg_t sc_idetim;
>- pcireg_t sc_udmatim;
>+ pcireg_t sc_pm_reg[4];
> };
>
> /* Given an ata_channel, get the pciide_softc. */
>Index: piixide.c
>===================================================================
>RCS file: /data/repo/netbsd/src/sys/dev/pci/piixide.c,v
>retrieving revision 1.42
>diff -u -p -r1.42 piixide.c
>--- piixide.c 9 Dec 2007 20:28:12 -0000 1.42
>+++ piixide.c 19 Dec 2007 14:26:05 -0000
>@@ -288,9 +288,9 @@ piixide_resume(device_t dv)
> struct pciide_softc *sc = device_private(dv);
>
> pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM,
>- sc->sc_idetim);
>+ sc->sc_pm_reg[0]);
> pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMATIM,
>- sc->sc_udmatim);
>+ sc->sc_pm_reg[1]);
>
> return true;
> }
>@@ -300,9 +300,9 @@ piixide_suspend(device_t dv)
> {
> struct pciide_softc *sc = device_private(dv);
>
>- sc->sc_idetim = pci_conf_read(sc->sc_pc, sc->sc_tag,
>+ sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag,
> PIIX_IDETIM);
>- sc->sc_udmatim = pci_conf_read(sc->sc_pc, sc->sc_tag,
>+ sc->sc_pm_reg[1] = pci_conf_read(sc->sc_pc, sc->sc_tag,
> PIIX_UDMATIM);
>
> return true;
>Index: viaide.c
>===================================================================
>RCS file: /data/repo/netbsd/src/sys/dev/pci/viaide.c,v
>retrieving revision 1.50
>diff -u -p -r1.50 viaide.c
>--- viaide.c 20 Dec 2007 22:24:40 -0000 1.50
>+++ viaide.c 21 Dec 2007 16:08:30 -0000
>@@ -67,6 +67,8 @@ static int viaide_match(struct device *,
> static void viaide_attach(struct device *, struct device *, void *);
> static const struct pciide_product_desc *
> viaide_lookup(pcireg_t);
>+static bool viaide_suspend(device_t);
>+static bool viaide_resume(device_t);
>
> CFATTACH_DECL(viaide, sizeof(struct pciide_softc),
> viaide_match, viaide_attach, NULL, NULL);
>@@ -374,6 +376,9 @@ viaide_attach(struct device *parent, str
> if (pp == NULL)
> panic("viaide_attach");
> pciide_common_attach(sc, pa, pp);
>+
>+ if (!pmf_device_register(self, viaide_suspend, viaide_resume))
>+ aprint_error_dev(self, "couldn't establish power handler\n");
> }
>
> static int
>@@ -386,6 +391,39 @@ via_pcib_match(struct pci_attach_args *p
> return 0;
> }
>
>+static bool
>+viaide_suspend(device_t dv)
>+{
>+ struct pciide_softc *sc = device_private(dv);
>+
>+ sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc));
>+ /* APO_DATATIM(sc) includes APO_UDMA(sc) */
>+ sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc));
>+ /* This two are VIA-only, but should be ignored by other devices. */
>+ sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC(sc));
>+ sc->sc_pm_reg[0] = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_MISCTIM(sc));
you need 0, 1, 2, 3 above...
>+
>+ return true;
>+}
>+
>+static bool
>+viaide_resume(device_t dv)
>+{
>+ struct pciide_softc *sc = device_private(dv);
>+
>+ pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF(sc),
>+ sc->sc_pm_reg[0]);
>+ pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM(sc),
>+ sc->sc_pm_reg[1]);
>+ /* This two are VIA-only, but should be ignored by other devices. */
>+ pci_conf_write(sc->sc_pc, sc->sc_tag, APO_CTLMISC(sc),
>+ sc->sc_pm_reg[2]);
>+ pci_conf_write(sc->sc_pc, sc->sc_tag, APO_MISCTIM(sc),
>+ sc->sc_pm_reg[3]);
>+
>+ return true;
>+}
>+
> static void
> via_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
> {
>
>-=-=-=-=-=-