Module Name:    src
Committed By:   jmcneill
Date:           Sat Feb 19 13:52:29 UTC 2011

Modified Files:
        src/sys/arch/i386/conf: ALL GENERIC
        src/sys/arch/i386/i386: autoconf.c
        src/sys/arch/x86/conf: files.x86
        src/sys/arch/x86/include: cpu.h cpuvar.h via_padlock.h
        src/sys/arch/x86/x86: cpu.c identcpu.c via_padlock.c

Log Message:
modularize VIA PadLock support
 - retire options VIA_PADLOCK, replace with 'padlock0 at cpu0'
 - driver supports attach & detach
 - support building as a module


To generate a diff of this commit:
cvs rdiff -u -r1.288 -r1.289 src/sys/arch/i386/conf/ALL
cvs rdiff -u -r1.1017 -r1.1018 src/sys/arch/i386/conf/GENERIC
cvs rdiff -u -r1.95 -r1.96 src/sys/arch/i386/i386/autoconf.c
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/x86/conf/files.x86
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/x86/include/cpuvar.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/x86/include/via_padlock.h
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/x86/x86/identcpu.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/x86/x86/via_padlock.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/i386/conf/ALL
diff -u src/sys/arch/i386/conf/ALL:1.288 src/sys/arch/i386/conf/ALL:1.289
--- src/sys/arch/i386/conf/ALL:1.288	Wed Feb 16 07:30:27 2011
+++ src/sys/arch/i386/conf/ALL	Sat Feb 19 13:52:27 2011
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.288 2011/02/16 07:30:27 jruoho Exp $
+# $NetBSD: ALL,v 1.289 2011/02/19 13:52:27 jmcneill Exp $
 # From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
 #
 # ALL machine description file
@@ -17,7 +17,7 @@
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident 		"ALL-$Revision: 1.288 $"
+#ident 		"ALL-$Revision: 1.289 $"
 
 maxusers	64		# estimated number of users
 
@@ -40,7 +40,7 @@
 options 	POWERNOW_K8
 
 # VIA PadLock
-options 	VIA_PADLOCK
+padlock0	at cpu0
 
 # Intel(R) On Demand Clock Modulation (aka ODCM)
 options 	INTEL_ONDEMAND_CLOCKMOD

Index: src/sys/arch/i386/conf/GENERIC
diff -u src/sys/arch/i386/conf/GENERIC:1.1017 src/sys/arch/i386/conf/GENERIC:1.1018
--- src/sys/arch/i386/conf/GENERIC:1.1017	Sat Feb 19 00:13:55 2011
+++ src/sys/arch/i386/conf/GENERIC	Sat Feb 19 13:52:27 2011
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.1017 2011/02/19 00:13:55 jmcneill Exp $
+# $NetBSD: GENERIC,v 1.1018 2011/02/19 13:52:27 jmcneill Exp $
 #
 # GENERIC machine description file
 #
@@ -22,7 +22,7 @@
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident 		"GENERIC-$Revision: 1.1017 $"
+#ident 		"GENERIC-$Revision: 1.1018 $"
 
 maxusers	64		# estimated number of users
 
@@ -48,7 +48,7 @@
 options 	POWERNOW_K8
 
 # VIA PadLock
-#options 	VIA_PADLOCK
+#padlock0	at cpu0
 
 # Intel(R) On Demand Clock Modulation (aka ODCM)
 #options 	INTEL_ONDEMAND_CLOCKMOD

Index: src/sys/arch/i386/i386/autoconf.c
diff -u src/sys/arch/i386/i386/autoconf.c:1.95 src/sys/arch/i386/i386/autoconf.c:1.96
--- src/sys/arch/i386/i386/autoconf.c:1.95	Sat Nov 21 03:11:00 2009
+++ src/sys/arch/i386/i386/autoconf.c	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.95 2009/11/21 03:11:00 rmind Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.96 2011/02/19 13:52:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.95 2009/11/21 03:11:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.96 2011/02/19 13:52:28 jmcneill Exp $");
 
 #include "opt_compat_oldboot.h"
 #include "opt_intrdebug.h"
@@ -94,8 +94,6 @@
 #include <machine/kvm86.h>
 #endif
 
-#include "opt_viapadlock.h"
-
 /*
  * Determine i/o configuration for a machine.
  */
@@ -140,8 +138,4 @@
 #if NLAPIC > 0
 	lapic_tpr = 0;
 #endif
-
-#if defined(VIA_PADLOCK)
-	via_padlock_attach();
-#endif
 }

Index: src/sys/arch/x86/conf/files.x86
diff -u src/sys/arch/x86/conf/files.x86:1.57 src/sys/arch/x86/conf/files.x86:1.58
--- src/sys/arch/x86/conf/files.x86:1.57	Sat Feb  5 14:00:34 2011
+++ src/sys/arch/x86/conf/files.x86	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: files.x86,v 1.57 2011/02/05 14:00:34 yamt Exp $
+#	$NetBSD: files.x86,v 1.58 2011/02/19 13:52:28 jmcneill Exp $
 
 # options for MP configuration through the MP spec
 defflag opt_mpbios.h MPBIOS MPVERBOSE MPDEBUG MPBIOS_SCANPCI
@@ -29,24 +29,25 @@
 # VIA C7 Temperature sensor
 defflag	opt_via_c7temp.h	VIA_C7TEMP: sysmon_envsys
 
-# VIA PadLock support
-defflag	opt_viapadlock.h	VIA_PADLOCK:	opencrypto
-file	arch/x86/x86/via_padlock.c	via_padlock
-
 # To be able to test for NetBSD/xen in shared files
 defflag	opt_xen.h		DO_NOT_DEFINE
 
 define  cpubus { [apid = -1] }
+define	cpufeaturebus {}
 define  ioapicbus { [apid = -1] }
 define  ipmibus {}
 
 #
 # CPUs
 #
-device	cpu
+device	cpu: cpufeaturebus
 attach	cpu at cpubus
 file 	arch/x86/x86/cpu.c 		cpu
 
+device	padlock: opencrypto
+attach	padlock at cpufeaturebus
+file	arch/x86/x86/via_padlock.c	padlock
+
 file	arch/x86/x86/apic.c		ioapic | lapic
 file	arch/x86/x86/bus_dma.c
 file	arch/x86/x86/bus_space.c

Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.26 src/sys/arch/x86/include/cpu.h:1.27
--- src/sys/arch/x86/include/cpu.h:1.26	Wed Dec 22 04:15:01 2010
+++ src/sys/arch/x86/include/cpu.h	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.26 2010/12/22 04:15:01 christos Exp $	*/
+/*	$NetBSD: cpu.h,v 1.27 2011/02/19 13:52:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -180,7 +180,7 @@
 
 	struct evcnt ci_ipi_events[X86_NIPI];
 
-	struct via_padlock	ci_vp;	/* VIA PadLock private storage */
+	device_t	ci_padlock;	/* VIA PadLock private storage */
 
 	struct i386tss	ci_tss;		/* Per-cpu TSS; shared among LWPs */
 	char		ci_iomap[IOMAPSIZE]; /* I/O Bitmap */

Index: src/sys/arch/x86/include/cpuvar.h
diff -u src/sys/arch/x86/include/cpuvar.h:1.38 src/sys/arch/x86/include/cpuvar.h:1.39
--- src/sys/arch/x86/include/cpuvar.h:1.38	Fri Aug 20 06:34:32 2010
+++ src/sys/arch/x86/include/cpuvar.h	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/* 	$NetBSD: cpuvar.h,v 1.38 2010/08/20 06:34:32 jruoho Exp $ */
+/* 	$NetBSD: cpuvar.h,v 1.39 2011/02/19 13:52:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc.
@@ -85,6 +85,11 @@
 	const struct cpu_functions *cpu_func;
 };
 
+struct cpufeature_attach_args {
+	struct cpu_info *ci;
+	const char *name;
+};
+
 #ifdef _KERNEL
 
 #if defined(_KERNEL_OPT)

Index: src/sys/arch/x86/include/via_padlock.h
diff -u src/sys/arch/x86/include/via_padlock.h:1.5 src/sys/arch/x86/include/via_padlock.h:1.6
--- src/sys/arch/x86/include/via_padlock.h:1.5	Wed Apr  1 21:15:45 2009
+++ src/sys/arch/x86/include/via_padlock.h	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: via_padlock.h,v 1.5 2009/04/01 21:15:45 drochner Exp $	*/
+/*	$NetBSD: via_padlock.h,v 1.6 2011/02/19 13:52:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2003 Jason Wright
@@ -53,6 +53,8 @@
 };
 
 struct via_padlock_softc {
+	device_t	sc_dev;
+
 	uint32_t	op_cw[4];	/* 128 bit aligned */
 	uint8_t	op_iv[16];	/* 128 bit aligned */
 	void		*op_buf;
@@ -60,9 +62,11 @@
 	int			sc_rnd_hz;
 	struct callout		sc_rnd_co;
 	rndsource_element_t	sc_rnd_source;
+	bool			sc_rnd_attached;
 
 	/* normal softc stuff */
 	int32_t		sc_cid;
+	bool		sc_cid_attached;
 	int		sc_nsessions;
 	struct via_padlock_session *sc_sessions;
 };
@@ -72,8 +76,6 @@
 
 #define VIAC3_RNG_BUFSIZ	16
 
-void    via_padlock_attach(void);
-
 #endif /* _KERNEL */
 
 #if defined(_KERNEL) || defined(_KMEMUSER)

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.80 src/sys/arch/x86/x86/cpu.c:1.81
--- src/sys/arch/x86/x86/cpu.c:1.80	Wed Feb  2 12:26:42 2011
+++ src/sys/arch/x86/x86/cpu.c	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.80 2011/02/02 12:26:42 bouyer Exp $	*/
+/*	$NetBSD: cpu.c,v 1.81 2011/02/19 13:52:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.80 2011/02/02 12:26:42 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.81 2011/02/19 13:52:28 jmcneill Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -119,6 +119,9 @@
 
 int     cpu_match(device_t, cfdata_t, void *);
 void    cpu_attach(device_t, device_t, void *);
+int	cpu_rescan(device_t, const char *, const int *);
+void	cpu_childdetached(device_t, device_t);
+
 
 static bool	cpu_suspend(device_t, const pmf_qual_t *);
 static bool	cpu_resume(device_t, const pmf_qual_t *);
@@ -136,8 +139,8 @@
 					    mp_cpu_start_cleanup };
 
 
-CFATTACH_DECL_NEW(cpu, sizeof(struct cpu_softc),
-    cpu_match, cpu_attach, NULL, NULL);
+CFATTACH_DECL2_NEW(cpu, sizeof(struct cpu_softc),
+    cpu_match, cpu_attach, NULL, NULL, cpu_rescan, cpu_childdetached);
 
 /*
  * Statically-allocated CPU info for the primary CPU (or the only
@@ -445,6 +448,39 @@
 #endif
 		);
 	}
+
+	cpu_rescan(self, NULL, NULL);
+}
+
+int
+cpu_rescan(device_t self, const char *ifattr, const int *locators)
+{
+	struct cpufeature_attach_args cfaa;
+	struct cpu_softc *sc = device_private(self);
+	struct cpu_info *ci = sc->sc_info;
+
+	memset(&cfaa, 0, sizeof(cfaa));
+	cfaa.ci = ci;
+
+	if (ifattr_match(ifattr, "cpufeaturebus")) {
+		if (ci->ci_padlock == NULL) {
+			cfaa.name = "padlock";
+			ci->ci_padlock = config_found_ia(self,
+			    "cpufeaturebus", &cfaa, NULL);
+		}
+	}
+
+	return 0;
+}
+
+void
+cpu_childdetached(device_t self, device_t child)
+{
+	struct cpu_softc *sc = device_private(self);
+	struct cpu_info *ci = sc->sc_info;
+
+	if (ci->ci_padlock == child)
+		ci->ci_padlock = NULL;
 }
 
 /*

Index: src/sys/arch/x86/x86/identcpu.c
diff -u src/sys/arch/x86/x86/identcpu.c:1.22 src/sys/arch/x86/x86/identcpu.c:1.23
--- src/sys/arch/x86/x86/identcpu.c:1.22	Thu Jan 27 18:44:40 2011
+++ src/sys/arch/x86/x86/identcpu.c	Sat Feb 19 13:52:28 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: identcpu.c,v 1.22 2011/01/27 18:44:40 bouyer Exp $	*/
+/*	$NetBSD: identcpu.c,v 1.23 2011/02/19 13:52:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.22 2011/01/27 18:44:40 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: identcpu.c,v 1.23 2011/02/19 13:52:28 jmcneill Exp $");
 
 #include "opt_enhanced_speedstep.h"
 #include "opt_intel_odcm.h"
@@ -436,7 +436,7 @@
 		    if (lfunc & CPUID_VIA_HAS_RNG) {
 		    	if (!(lfunc & CPUID_VIA_DO_RNG)) {
 			    rng_enable++;
-			    ci->ci_feat_val[4] |= CPUID_VIA_HAS_RNG;
+			    ci->ci_feat_val[4] |= CPUID_VIA_DO_RNG;
 			}
 		    }
 		    /* Check for and enable ACE (AES-CBC) */

Index: src/sys/arch/x86/x86/via_padlock.c
diff -u src/sys/arch/x86/x86/via_padlock.c:1.13 src/sys/arch/x86/x86/via_padlock.c:1.14
--- src/sys/arch/x86/x86/via_padlock.c:1.13	Thu Apr 22 21:47:32 2010
+++ src/sys/arch/x86/x86/via_padlock.c	Sat Feb 19 13:52:28 2011
@@ -1,5 +1,5 @@
 /*	$OpenBSD: via.c,v 1.8 2006/11/17 07:47:56 tom Exp $	*/
-/*	$NetBSD: via_padlock.c,v 1.13 2010/04/22 21:47:32 jym Exp $ */
+/*	$NetBSD: via_padlock.c,v 1.14 2011/02/19 13:52:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2003 Jason Wright
@@ -20,20 +20,21 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: via_padlock.c,v 1.13 2010/04/22 21:47:32 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: via_padlock.c,v 1.14 2011/02/19 13:52:28 jmcneill Exp $");
 
-#include "rnd.h"
-
-#if NRND == 0
-#error padlock requires rnd pseudo-devices
+#ifdef _KERNEL_OPT
+# include "rnd.h"
+# if NRND == 0
+#  error padlock requires rnd pseudo-devices
+# endif
 #endif
 
-#include "opt_viapadlock.h"
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/signalvar.h>
 #include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/module.h>
 #include <sys/rnd.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
@@ -52,9 +53,21 @@
 
 #include <opencrypto/cryptosoft_xform.c>
 
-#ifdef VIA_PADLOCK
+#include <x86/via_padlock.h>
 
-char	xxx_via_buffer[1024];
+static int	via_padlock_match(device_t, cfdata_t, void *);
+static void	via_padlock_attach(device_t, device_t, void *);
+static int	via_padlock_detach(device_t, int);
+static void	via_padlock_attach_intr(device_t);
+
+CFATTACH_DECL_NEW(
+    padlock,
+    sizeof(struct via_padlock_softc),
+    via_padlock_match,
+    via_padlock_attach,
+    via_padlock_detach,
+    NULL
+);
 
 int	via_padlock_crypto_newsession(void *, uint32_t *, struct cryptoini *);
 int	via_padlock_crypto_process(void *, struct cryptop *, int);
@@ -69,7 +82,7 @@
 static void
 via_c3_rnd(void *arg)
 {
-	struct via_padlock_softc *vp_sc = arg;
+	struct via_padlock_softc *sc = arg;
 
 	unsigned int rv, creg0, len = VIAC3_RNG_BUFSIZ;
 	static uint32_t buffer[VIAC3_RNG_BUFSIZ + 2];	/* XXX 2? */
@@ -101,29 +114,31 @@
 	lcr0(creg0);
 	x86_enable_intr();
 	kpreempt_enable();
-	rnd_add_data(&vp_sc->sc_rnd_source, buffer, len * sizeof(int),
+	rnd_add_data(&sc->sc_rnd_source, buffer, len * sizeof(int),
 		     len * sizeof(int));
-	callout_reset(&vp_sc->sc_rnd_co, vp_sc->sc_rnd_hz, via_c3_rnd, vp_sc);
+	callout_reset(&sc->sc_rnd_co, sc->sc_rnd_hz, via_c3_rnd, sc);
 }	
 
 static void
-via_c3_rnd_init(struct via_padlock_softc *const vp_sc)
+via_c3_rnd_init(struct via_padlock_softc *sc)
 {
+	sc->sc_rnd_attached = true;
+
 	if (hz >= 100) {
-	    vp_sc->sc_rnd_hz = 10 * hz / 100;
+	    sc->sc_rnd_hz = 10 * hz / 100;
 	} else {
-	    vp_sc->sc_rnd_hz = 10;
+	    sc->sc_rnd_hz = 10;
 	}
 	/* See hifn7751.c re use of RND_FLAG_NO_ESTIMATE */
-	rnd_attach_source(&vp_sc->sc_rnd_source, "padlock",
+	rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev),
 			  RND_TYPE_RNG, RND_FLAG_NO_ESTIMATE);
-	callout_init(&vp_sc->sc_rnd_co, 0);
+	callout_init(&sc->sc_rnd_co, 0);
 	/* Call once to prime the pool early and set callout. */
-	via_c3_rnd(vp_sc);
+	via_c3_rnd(sc);
 }
 
 static void
-via_c3_ace_init(struct via_padlock_softc *const vp_sc)
+via_c3_ace_init(struct via_padlock_softc *sc)
 {
 	/*
 	 * There is no reason to call into the kernel to use this
@@ -133,13 +148,15 @@
 	 * confusing (however, consider that crypto via unprivileged
 	 * instructions _is_ "just software" in some sense).
 	 */
-	vp_sc->sc_cid = crypto_get_driverid(CRYPTOCAP_F_SOFTWARE);
-	if (vp_sc->sc_cid < 0) {
-		printf("PadLock: Could not get a crypto driver ID\n");
-		free(vp_sc, M_DEVBUF);
+	sc->sc_cid = crypto_get_driverid(CRYPTOCAP_F_SOFTWARE);
+	if (sc->sc_cid < 0) {
+		aprint_error_dev(sc->sc_dev,
+		    "could not get a crypto driver ID\n");
 		return;
 	}
 
+	sc->sc_cid_attached = true;
+
 	/*
 	 * Ask the opencrypto subsystem to register ourselves. Although
 	 * we don't support hardware offloading for various HMAC algorithms,
@@ -160,9 +177,9 @@
 	 * XXX from _us_!
 	 */
 #define REGISTER(alg) \
-	crypto_register(vp_sc->sc_cid, alg, 0, 0, \
+	crypto_register(sc->sc_cid, alg, 0, 0, \
 	    via_padlock_crypto_newsession, via_padlock_crypto_freesession, \
-	    via_padlock_crypto_process, vp_sc);
+	    via_padlock_crypto_process, sc);
 
 	REGISTER(CRYPTO_AES_CBC);
 	REGISTER(CRYPTO_MD5_HMAC_96);
@@ -174,36 +191,6 @@
 	REGISTER(CRYPTO_SHA2_HMAC);
 }
 
-void
-via_padlock_attach(void)
-{
-	struct via_padlock_softc *vp_sc;
-
-	printf("%s", xxx_via_buffer);
-
-	if (!((cpu_feature[4] & CPUID_VIA_HAS_ACE) ||
-	      (cpu_feature[4] & CPUID_VIA_HAS_RNG))) {
-		printf("PadLock: Nothing (%08x ! %08X ! %08X)\n",
-			cpu_feature[4], CPUID_VIA_HAS_ACE,
-			CPUID_VIA_HAS_RNG);
-		return;		/* Nothing to see here, move along. */
-	}
-
-	if ((vp_sc = malloc(sizeof(*vp_sc), M_DEVBUF, M_NOWAIT)) == NULL)
-		return;
-	memset(vp_sc, 0, sizeof(*vp_sc));
-
-	if (cpu_feature[4] & CPUID_VIA_HAS_RNG) {
-		via_c3_rnd_init(vp_sc);
-		printf("PadLock: RNG attached\n");
-	}
-
-	if (cpu_feature[4] & CPUID_VIA_HAS_ACE) {
-		via_c3_ace_init(vp_sc);
-		printf("PadLock: AES-CBC attached\n");
-	}
-}
-
 int
 via_padlock_crypto_newsession(void *arg, uint32_t *sidp, struct cryptoini *cri)
 {
@@ -271,12 +258,8 @@
 				C3_CRYPT_CWLO_KEYGEN_SW |
 				C3_CRYPT_CWLO_NORMAL;
 
-#ifdef __NetBSD__
 			rnd_extract_data(ses->ses_iv, sizeof(ses->ses_iv),
 			    RND_EXTRACT_ANY);
-#else
-			get_random_bytes(ses->ses_iv, sizeof(ses->ses_iv));
-#endif
 			ses->ses_klen = c->cri_klen;
 			ses->ses_cw0 = cw0;
 
@@ -382,7 +365,7 @@
 {
 	struct via_padlock_softc *sc = arg;
 	struct swcr_data *swd;
-	struct auth_hash *axf;
+	const struct auth_hash *axf;
 	int sesn;
 	uint32_t sid = ((uint32_t)tid) & 0xffffffff;
 
@@ -597,4 +580,106 @@
 	return (err);
 }
 
-#endif /* VIA_PADLOCK */
+static int
+via_padlock_match(device_t parent, cfdata_t cf, void *opaque)
+{
+	struct cpufeature_attach_args *cfaa = opaque;
+	struct cpu_info *ci = cfaa->ci;
+
+	if (strcmp(cfaa->name, "padlock") != 0)
+		return 0;
+	if ((cpu_feature[4] & (CPUID_VIA_HAS_ACE|CPUID_VIA_HAS_RNG)) == 0)
+		return 0;
+	if ((ci->ci_flags & (CPUF_BSP|CPUF_SP|CPUF_PRIMARY)) == 0)
+		return 0;
+	return 1;
+}
+
+static void
+via_padlock_attach(device_t parent, device_t self, void *opaque)
+{
+	struct via_padlock_softc *sc = device_private(self);
+
+	sc->sc_dev = self;
+
+	aprint_naive("\n");
+	aprint_normal(": VIA PadLock\n");
+
+	pmf_device_register(self, NULL, NULL);
+
+	config_interrupts(self, via_padlock_attach_intr);
+}
+
+static void
+via_padlock_attach_intr(device_t self)
+{
+	struct via_padlock_softc *sc = device_private(self);
+
+	aprint_normal("%s:", device_xname(self));
+	if (cpu_feature[4] & CPUID_VIA_HAS_RNG) {
+		via_c3_rnd_init(sc);
+		aprint_normal(" RNG");
+	}
+	if (cpu_feature[4] & CPUID_VIA_HAS_ACE) {
+		via_c3_ace_init(sc);
+		aprint_normal(" ACE");
+	}
+	aprint_normal("\n");
+}
+
+static int
+via_padlock_detach(device_t self, int flags)
+{
+	struct via_padlock_softc *sc = device_private(self);
+
+	if (sc->sc_rnd_attached) {
+		callout_stop(&sc->sc_rnd_co);
+		callout_destroy(&sc->sc_rnd_co);
+		rnd_detach_source(&sc->sc_rnd_source);
+		sc->sc_rnd_attached = false;
+	}
+	if (sc->sc_cid_attached) {
+		crypto_unregister(sc->sc_cid, CRYPTO_AES_CBC);
+		crypto_unregister(sc->sc_cid, CRYPTO_MD5_HMAC_96);
+		crypto_unregister(sc->sc_cid, CRYPTO_MD5_HMAC);
+		crypto_unregister(sc->sc_cid, CRYPTO_SHA1_HMAC_96);
+		crypto_unregister(sc->sc_cid, CRYPTO_SHA1_HMAC);
+		crypto_unregister(sc->sc_cid, CRYPTO_RIPEMD160_HMAC_96);
+		crypto_unregister(sc->sc_cid, CRYPTO_RIPEMD160_HMAC);
+		crypto_unregister(sc->sc_cid, CRYPTO_SHA2_HMAC);
+		sc->sc_cid_attached = false;
+	}
+
+	pmf_device_deregister(self);
+
+	return 0;
+}
+
+MODULE(MODULE_CLASS_DRIVER, padlock, NULL);
+
+#ifdef _MODULE
+#include "ioconf.c"
+#endif
+
+static int
+padlock_modcmd(modcmd_t cmd, void *opaque)
+{
+	int error = 0;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+#ifdef _MODULE
+		error = config_init_component(cfdriver_ioconf_padlock,
+		    cfattach_ioconf_padlock, cfdata_ioconf_padlock);
+#endif
+		return error;
+	case MODULE_CMD_FINI:
+#ifdef _MODULE
+		error = config_fini_component(cfdriver_ioconf_padlock,
+		    cfattach_ioconf_padlock, cfdata_ioconf_padlock);
+#endif
+		return error;
+	default:
+		return ENOTTY;
+	}
+}

Reply via email to