summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2010-08-07 06:10:07 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2010-08-07 06:10:07 +0000
commite5b528dadb9394ee08b04373a1b2845b9fc301ba (patch)
treef30a40099c12fb814562d1330d1ca04704e84632
parenteb95cc9da073c2c7f556ff2c8c2a63c319881bfb (diff)
On resume, re-activate the host RNG on the host bridges that need it.
ok kettenis
-rw-r--r--sys/arch/amd64/pci/pchb.c30
-rw-r--r--sys/arch/i386/pci/pchb.c30
2 files changed, 56 insertions, 4 deletions
diff --git a/sys/arch/amd64/pci/pchb.c b/sys/arch/amd64/pci/pchb.c
index f42b042f042..e715e3097c4 100644
--- a/sys/arch/amd64/pci/pchb.c
+++ b/sys/arch/amd64/pci/pchb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pchb.c,v 1.34 2010/06/24 00:06:57 kettenis Exp $ */
+/* $OpenBSD: pchb.c,v 1.35 2010/08/07 06:10:04 deraadt Exp $ */
/* $NetBSD: pchb.c,v 1.1 2003/04/26 18:39:50 fvdl Exp $ */
/*
* Copyright (c) 2000 Michael Shalayeff
@@ -108,6 +108,7 @@ struct pchb_softc {
bus_space_handle_t sc_bh;
/* rng stuff */
+ int sc_rng_active;
int sc_rng_ax;
int sc_rng_i;
struct timeout sc_rng_to;
@@ -115,10 +116,11 @@ struct pchb_softc {
int pchbmatch(struct device *, void *, void *);
void pchbattach(struct device *, struct device *, void *);
+int pchbactivate(struct device *, int);
struct cfattach pchb_ca = {
sizeof(struct pchb_softc), pchbmatch, pchbattach, NULL,
- config_activate_children
+ pchbactivate
};
struct cfdriver pchb_cd = {
@@ -202,6 +204,7 @@ pchbattach(struct device *parent, struct device *self, void *aux)
timeout_set(&sc->sc_rng_to, pchb_rnd, sc);
sc->sc_rng_i = 4;
pchb_rnd(sc);
+ sc->sc_rng_active = 1;
break;
}
printf("\n");
@@ -270,6 +273,29 @@ pchbattach(struct device *parent, struct device *self, void *aux)
}
int
+pchbactivate(struct device *self, int act)
+{
+ struct pchb_softc *sc = (struct pchb_softc *)self;
+
+ switch (act) {
+ case DVACT_SUSPEND:
+ config_activate_children(self, act);
+ break;
+ case DVACT_RESUME:
+ /* re-enable RNG, if we have it */
+ if (sc->sc_rng_active)
+ bus_space_write_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_HWST,
+ bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_HWST) | I82802_RNG_HWST_ENABLE);
+ config_activate_children(self, act);
+ break;
+ }
+ return (0);
+}
+
+
+int
pchb_print(void *aux, const char *pnp)
{
struct pcibus_attach_args *pba = aux;
diff --git a/sys/arch/i386/pci/pchb.c b/sys/arch/i386/pci/pchb.c
index c2839350918..3b594a5a269 100644
--- a/sys/arch/i386/pci/pchb.c
+++ b/sys/arch/i386/pci/pchb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pchb.c,v 1.82 2010/06/24 00:06:57 kettenis Exp $ */
+/* $OpenBSD: pchb.c,v 1.83 2010/08/07 06:10:06 deraadt Exp $ */
/* $NetBSD: pchb.c,v 1.65 2007/08/15 02:26:13 markd Exp $ */
/*
@@ -120,6 +120,7 @@ struct pchb_softc {
bus_space_handle_t sc_bh;
/* rng stuff */
+ int sc_rng_active;
int sc_rng_ax;
int sc_rng_i;
struct timeout sc_rng_to;
@@ -127,10 +128,11 @@ struct pchb_softc {
int pchbmatch(struct device *, void *, void *);
void pchbattach(struct device *, struct device *, void *);
+int pchbactivate(struct device *, int);
struct cfattach pchb_ca = {
sizeof(struct pchb_softc), pchbmatch, pchbattach, NULL,
- config_activate_children
+ pchbactivate
};
struct cfdriver pchb_cd = {
@@ -345,6 +347,7 @@ pchbattach(struct device *parent, struct device *self, void *aux)
timeout_set(&sc->sc_rng_to, pchb_rnd, sc);
sc->sc_rng_i = 4;
pchb_rnd(sc);
+ sc->sc_rng_active = 1;
break;
}
printf("\n");
@@ -413,6 +416,29 @@ pchbattach(struct device *parent, struct device *self, void *aux)
}
int
+pchbactivate(struct device *self, int act)
+{
+ struct pchb_softc *sc = (struct pchb_softc *)self;
+
+ switch (act) {
+ case DVACT_SUSPEND:
+ config_activate_children(self, act);
+ break;
+ case DVACT_RESUME:
+ /* re-enable RNG, if we have it */
+ if (sc->sc_rng_active)
+ bus_space_write_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_HWST,
+ bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_HWST) | I82802_RNG_HWST_ENABLE);
+ config_activate_children(self, act);
+ break;
+ }
+ return (0);
+}
+
+
+int
pchb_print(void *aux, const char *pnp)
{
struct pcibus_attach_args *pba = aux;