summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2007-05-31 23:35:47 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2007-05-31 23:35:47 +0000
commit9be8669d590dbdf3de9d781dba9b93b2c0126953 (patch)
treefc95bb48c92f1d870a6eea9e24401aa26696d3dd
parent28450fedff07969e340c64383a347a02e3036056 (diff)
intel pchb rnd support, from i386
ok deraadt
-rw-r--r--sys/arch/amd64/amd64/rbus_machdep.c3
-rw-r--r--sys/arch/amd64/pci/pchb.c142
-rw-r--r--sys/arch/amd64/pci/pchbvar.h61
3 files changed, 137 insertions, 69 deletions
diff --git a/sys/arch/amd64/amd64/rbus_machdep.c b/sys/arch/amd64/amd64/rbus_machdep.c
index 0397b847934..12150a28089 100644
--- a/sys/arch/amd64/amd64/rbus_machdep.c
+++ b/sys/arch/amd64/amd64/rbus_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rbus_machdep.c,v 1.2 2007/01/15 23:19:05 jsg Exp $ */
+/* $OpenBSD: rbus_machdep.c,v 1.3 2007/05/31 23:35:46 tedu Exp $ */
/* $NetBSD: rbus_machdep.c,v 1.2 1999/10/15 06:43:06 haya Exp $ */
/*
@@ -50,7 +50,6 @@
#include <dev/isa/isavar.h>
#include <dev/pci/pcivar.h>
-#include <arch/amd64/pci/pchbvar.h>
/**********************************************************************
diff --git a/sys/arch/amd64/pci/pchb.c b/sys/arch/amd64/pci/pchb.c
index b2fbf898162..8fa544183bf 100644
--- a/sys/arch/amd64/pci/pchb.c
+++ b/sys/arch/amd64/pci/pchb.c
@@ -1,6 +1,30 @@
-/* $OpenBSD: pchb.c,v 1.6 2007/05/19 19:32:03 tedu Exp $ */
+/* $OpenBSD: pchb.c,v 1.7 2007/05/31 23:35:46 tedu Exp $ */
/* $NetBSD: pchb.c,v 1.1 2003/04/26 18:39:50 fvdl Exp $ */
-
+/*
+ * Copyright (c) 2000 Michael Shalayeff
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
/*-
* Copyright (c) 1996, 1998, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -41,15 +65,17 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
+#include <sys/timeout.h>
#include <machine/bus.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
-
#include <dev/pci/pcidevs.h>
-#include <arch/amd64/pci/pchbvar.h>
+#include <dev/rndvar.h>
+
+#include <dev/ic/i82802reg.h>
#define PCISET_BRIDGETYPE_MASK 0x3
#define PCISET_TYPE_COMPAT 0x1
@@ -87,10 +113,22 @@
#define AMD64HT_LDT_SEC_BUS_NUM(reg) (((reg) >> 8) & 0xff)
+struct pchb_softc {
+ struct device sc_dev;
+
+ bus_space_tag_t sc_bt;
+ bus_space_handle_t sc_bh;
+
+ int sc_rnd_i;
+ u_int32_t sc_rnd_ax;
+ struct timeout sc_rnd_to;
+};
+
int pchbmatch(struct device *, void *, void *);
void pchbattach(struct device *, struct device *, void *);
int pchb_print(void *, const char *);
+void pchb_rnd(void *);
void pchb_amd64ht_attach (struct device *, struct pci_attach_args *, int);
struct cfattach pchb_ca = {
@@ -117,8 +155,10 @@ pchbmatch(struct device *parent, void *match, void *aux)
void
pchbattach(struct device *parent, struct device *self, void *aux)
{
+ struct pchb_softc *sc = (struct pchb_softc *)self;
struct pci_attach_args *pa = aux;
- int i;
+ struct timeval tv1, tv2;
+ int i, r;
printf("\n");
@@ -135,6 +175,68 @@ pchbattach(struct device *parent, struct device *self, void *aux)
#ifdef PCIAGP
pciagp_set_pchb(pa);
#endif
+ switch (PCI_PRODUCT(pa->pa_id)) {
+ case PCI_PRODUCT_INTEL_82915G_HB:
+ case PCI_PRODUCT_INTEL_82915GM_HB:
+ case PCI_PRODUCT_INTEL_82925X_HB:
+ case PCI_PRODUCT_INTEL_82945GP_MCH:
+ case PCI_PRODUCT_INTEL_82955X_HB:
+ sc->sc_bt = pa->pa_memt;
+ if (bus_space_map(sc->sc_bt, I82802_IOBASE,
+ I82802_IOSIZE, 0, &sc->sc_bh)) {
+ break;
+ }
+
+ /* probe and init rng */
+ if (!(bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_HWST) & I82802_RNG_HWST_PRESENT)) {
+ break;
+ }
+
+ /* enable RNG */
+ 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);
+
+ /* see if we can read anything */
+ for (i = 1000; i-- &&
+ !(bus_space_read_1(sc->sc_bt,sc->sc_bh,
+ I82802_RNG_RNGST) & I82802_RNG_RNGST_DATAV));
+ DELAY(10);
+
+ if (!(bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_RNGST) & I82802_RNG_RNGST_DATAV)) {
+ break;
+ }
+
+ r = bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_DATA);
+
+ /* benchmark the RNG */
+ microtime(&tv1);
+ for (i = 8 * 1024; i--; ) {
+ while(!(bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_RNGST) & I82802_RNG_RNGST_DATAV))
+ ;
+ r = bus_space_read_1(sc->sc_bt, sc->sc_bh,
+ I82802_RNG_DATA);
+ }
+ microtime(&tv2);
+
+ timersub(&tv2, &tv1, &tv1);
+ if (tv1.tv_sec)
+ tv1.tv_usec += 1000000 * tv1.tv_sec;
+ printf(": rng active");
+ if (tv1.tv_usec != 0)
+ printf(", %dKb/sec",
+ 8 * 1000000 / tv1.tv_usec);
+
+ timeout_set(&sc->sc_rnd_to, pchb_rnd, sc);
+ sc->sc_rnd_i = 4;
+ pchb_rnd(sc);
+ break;
+ }
break;
}
}
@@ -151,7 +253,7 @@ pchb_print(void *aux, const char *pnp)
}
void
-pchb_amd64ht_attach (struct device *self, struct pci_attach_args *pa, int i)
+pchb_amd64ht_attach(struct device *self, struct pci_attach_args *pa, int i)
{
struct pcibus_attach_args pba;
pcireg_t type, bus;
@@ -176,3 +278,31 @@ pchb_amd64ht_attach (struct device *self, struct pci_attach_args *pa, int i)
config_found(self, &pba, pchb_print);
}
}
+
+/*
+ * Should do FIPS testing as per:
+ * http://csrc.nist.gov/publications/fips/fips140-1/fips1401.pdf
+ */
+void
+pchb_rnd(void *v)
+{
+ struct pchb_softc *sc = v;
+
+ /*
+ * Don't wait for data to be ready. If it's not there, we'll check
+ * next time.
+ */
+ if ((bus_space_read_1(sc->sc_bt, sc->sc_bh, I82802_RNG_RNGST) &
+ I82802_RNG_RNGST_DATAV)) {
+
+ sc->sc_rnd_ax = (sc->sc_rnd_ax << 8) |
+ bus_space_read_1(sc->sc_bt, sc->sc_bh, I82802_RNG_DATA);
+
+ if (!sc->sc_rnd_i--) {
+ sc->sc_rnd_i = 4;
+ add_true_randomness(sc->sc_rnd_ax);
+ }
+ }
+
+ timeout_add(&sc->sc_rnd_to, 1);
+}
diff --git a/sys/arch/amd64/pci/pchbvar.h b/sys/arch/amd64/pci/pchbvar.h
deleted file mode 100644
index 9e573bb97e3..00000000000
--- a/sys/arch/amd64/pci/pchbvar.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* $NetBSD: pchbvar.h,v 1.1 2003/04/26 18:39:51 fvdl Exp $ */
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Jason R. Thorpe.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _I386_PCI_PCHBVAR_H_
-#define _I386_PCI_PCHBVAR_H_
-
-#include <sys/timeout.h>
-
-struct pchb_softc {
- struct device sc_dev;
-
- bus_space_tag_t sc_st;
- bus_space_handle_t sc_sh;
-
-#if 0
- struct callout sc_rnd_ch;
- rndsource_element_t sc_rnd_source;
-#endif
-
- int sc_rnd_i;
- u_int32_t sc_rnd_ax;
-};
-
-void pchb_attach_rnd(struct pchb_softc *, struct pci_attach_args *);
-
-#endif /* _I386_PCI_PCHBVAR_H_ */