1ef0a6e20SPawel Jakub Dawidek /*- 2ec7993f8SPawel Jakub Dawidek * Copyright (c) 2005-2008 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3ef0a6e20SPawel Jakub Dawidek * All rights reserved. 4ef0a6e20SPawel Jakub Dawidek * 5ef0a6e20SPawel Jakub Dawidek * Redistribution and use in source and binary forms, with or without 6ef0a6e20SPawel Jakub Dawidek * modification, are permitted provided that the following conditions 7ef0a6e20SPawel Jakub Dawidek * are met: 8ef0a6e20SPawel Jakub Dawidek * 1. Redistributions of source code must retain the above copyright 9ef0a6e20SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer. 10ef0a6e20SPawel Jakub Dawidek * 2. Redistributions in binary form must reproduce the above copyright 11ef0a6e20SPawel Jakub Dawidek * notice, this list of conditions and the following disclaimer in the 12ef0a6e20SPawel Jakub Dawidek * documentation and/or other materials provided with the distribution. 13ef0a6e20SPawel Jakub Dawidek * 14ef0a6e20SPawel Jakub Dawidek * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15ef0a6e20SPawel Jakub Dawidek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16ef0a6e20SPawel Jakub Dawidek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17ef0a6e20SPawel Jakub Dawidek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18ef0a6e20SPawel Jakub Dawidek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19ef0a6e20SPawel Jakub Dawidek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20ef0a6e20SPawel Jakub Dawidek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21ef0a6e20SPawel Jakub Dawidek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22ef0a6e20SPawel Jakub Dawidek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23ef0a6e20SPawel Jakub Dawidek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24ef0a6e20SPawel Jakub Dawidek * SUCH DAMAGE. 25ef0a6e20SPawel Jakub Dawidek */ 26ef0a6e20SPawel Jakub Dawidek 27ef0a6e20SPawel Jakub Dawidek #include <sys/cdefs.h> 28ef0a6e20SPawel Jakub Dawidek __FBSDID("$FreeBSD$"); 29ef0a6e20SPawel Jakub Dawidek 30ef0a6e20SPawel Jakub Dawidek #include <sys/param.h> 31ef0a6e20SPawel Jakub Dawidek #include <sys/systm.h> 32ef0a6e20SPawel Jakub Dawidek #include <sys/kernel.h> 33ef0a6e20SPawel Jakub Dawidek #include <sys/module.h> 34ef0a6e20SPawel Jakub Dawidek #include <sys/lock.h> 3548aadb63SPawel Jakub Dawidek #include <sys/rwlock.h> 36ef0a6e20SPawel Jakub Dawidek #include <sys/malloc.h> 37ef0a6e20SPawel Jakub Dawidek #include <sys/libkern.h> 382b375b4eSYoshihiro Takahashi #if defined(__amd64__) || defined(__i386__) 39ef0a6e20SPawel Jakub Dawidek #include <machine/cpufunc.h> 40ef0a6e20SPawel Jakub Dawidek #include <machine/cputypes.h> 414fd58e10SMichael Reifenberger #include <machine/md_var.h> 424fd58e10SMichael Reifenberger #include <machine/specialreg.h> 43ef0a6e20SPawel Jakub Dawidek #endif 44ef0a6e20SPawel Jakub Dawidek 45ef0a6e20SPawel Jakub Dawidek #include <opencrypto/cryptodev.h> 46ef0a6e20SPawel Jakub Dawidek 475333bd47SPawel Jakub Dawidek #include <crypto/via/padlock.h> 48ef0a6e20SPawel Jakub Dawidek 496810ad6fSSam Leffler #include <sys/kobj.h> 506810ad6fSSam Leffler #include <sys/bus.h> 516810ad6fSSam Leffler #include "cryptodev_if.h" 526810ad6fSSam Leffler 535333bd47SPawel Jakub Dawidek /* 545333bd47SPawel Jakub Dawidek * Technical documentation about the PadLock engine can be found here: 555333bd47SPawel Jakub Dawidek * 565333bd47SPawel Jakub Dawidek * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/programming_guide.pdf 575333bd47SPawel Jakub Dawidek */ 58ef0a6e20SPawel Jakub Dawidek 59ef0a6e20SPawel Jakub Dawidek struct padlock_softc { 60ef0a6e20SPawel Jakub Dawidek int32_t sc_cid; 61ef0a6e20SPawel Jakub Dawidek }; 62ef0a6e20SPawel Jakub Dawidek 631b0909d5SConrad Meyer static int padlock_newsession(device_t, crypto_session_t cses, struct cryptoini *cri); 641b0909d5SConrad Meyer static void padlock_freesession(device_t, crypto_session_t cses); 65ec7993f8SPawel Jakub Dawidek static void padlock_freesession_one(struct padlock_softc *sc, 661b0909d5SConrad Meyer struct padlock_session *ses); 676810ad6fSSam Leffler static int padlock_process(device_t, struct cryptop *crp, int hint __unused); 68ef0a6e20SPawel Jakub Dawidek 695333bd47SPawel Jakub Dawidek MALLOC_DEFINE(M_PADLOCK, "padlock_data", "PadLock Data"); 70ef0a6e20SPawel Jakub Dawidek 716810ad6fSSam Leffler static void 72a4958494SWarner Losh padlock_identify(driver_t *drv, device_t parent) 73ef0a6e20SPawel Jakub Dawidek { 746810ad6fSSam Leffler /* NB: order 10 is so we get attached after h/w devices */ 756810ad6fSSam Leffler if (device_find_child(parent, "padlock", -1) == NULL && 766810ad6fSSam Leffler BUS_ADD_CHILD(parent, 10, "padlock", -1) == 0) 776810ad6fSSam Leffler panic("padlock: could not attach"); 786810ad6fSSam Leffler } 796810ad6fSSam Leffler 806810ad6fSSam Leffler static int 816810ad6fSSam Leffler padlock_probe(device_t dev) 826810ad6fSSam Leffler { 835333bd47SPawel Jakub Dawidek char capp[256]; 845333bd47SPawel Jakub Dawidek 852b375b4eSYoshihiro Takahashi #if defined(__amd64__) || defined(__i386__) 865333bd47SPawel Jakub Dawidek /* If there is no AES support, we has nothing to do here. */ 874fd58e10SMichael Reifenberger if (!(via_feature_xcrypt & VIA_HAS_AES)) { 886810ad6fSSam Leffler device_printf(dev, "No ACE support.\n"); 89ef0a6e20SPawel Jakub Dawidek return (EINVAL); 905333bd47SPawel Jakub Dawidek } 915333bd47SPawel Jakub Dawidek strlcpy(capp, "AES-CBC", sizeof(capp)); 925333bd47SPawel Jakub Dawidek #if 0 935333bd47SPawel Jakub Dawidek strlcat(capp, ",AES-EBC", sizeof(capp)); 945333bd47SPawel Jakub Dawidek strlcat(capp, ",AES-CFB", sizeof(capp)); 955333bd47SPawel Jakub Dawidek strlcat(capp, ",AES-OFB", sizeof(capp)); 965333bd47SPawel Jakub Dawidek #endif 975333bd47SPawel Jakub Dawidek if (via_feature_xcrypt & VIA_HAS_SHA) { 985333bd47SPawel Jakub Dawidek strlcat(capp, ",SHA1", sizeof(capp)); 995333bd47SPawel Jakub Dawidek strlcat(capp, ",SHA256", sizeof(capp)); 1005333bd47SPawel Jakub Dawidek } 1015333bd47SPawel Jakub Dawidek #if 0 1025333bd47SPawel Jakub Dawidek if (via_feature_xcrypt & VIA_HAS_AESCTR) 1035333bd47SPawel Jakub Dawidek strlcat(capp, ",AES-CTR", sizeof(capp)); 1045333bd47SPawel Jakub Dawidek if (via_feature_xcrypt & VIA_HAS_MM) 1055333bd47SPawel Jakub Dawidek strlcat(capp, ",RSA", sizeof(capp)); 1065333bd47SPawel Jakub Dawidek #endif 1076810ad6fSSam Leffler device_set_desc_copy(dev, capp); 1086810ad6fSSam Leffler return (0); 109ef0a6e20SPawel Jakub Dawidek #else 110ef0a6e20SPawel Jakub Dawidek return (EINVAL); 111ef0a6e20SPawel Jakub Dawidek #endif 1126810ad6fSSam Leffler } 113ef0a6e20SPawel Jakub Dawidek 1146810ad6fSSam Leffler static int 1156810ad6fSSam Leffler padlock_attach(device_t dev) 1166810ad6fSSam Leffler { 1176810ad6fSSam Leffler struct padlock_softc *sc = device_get_softc(dev); 1186810ad6fSSam Leffler 1191b0909d5SConrad Meyer sc->sc_cid = crypto_get_driverid(dev, sizeof(struct padlock_session), 1201b0909d5SConrad Meyer CRYPTOCAP_F_HARDWARE); 121ef0a6e20SPawel Jakub Dawidek if (sc->sc_cid < 0) { 1226810ad6fSSam Leffler device_printf(dev, "Could not get crypto driver id.\n"); 123ef0a6e20SPawel Jakub Dawidek return (ENOMEM); 124ef0a6e20SPawel Jakub Dawidek } 125ef0a6e20SPawel Jakub Dawidek 1266810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_AES_CBC, 0, 0); 1276810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_MD5_HMAC, 0, 0); 1286810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_SHA1_HMAC, 0, 0); 1296810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_RIPEMD160_HMAC, 0, 0); 1306810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_SHA2_256_HMAC, 0, 0); 1316810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_SHA2_384_HMAC, 0, 0); 1326810ad6fSSam Leffler crypto_register(sc->sc_cid, CRYPTO_SHA2_512_HMAC, 0, 0); 133ef0a6e20SPawel Jakub Dawidek return (0); 134ef0a6e20SPawel Jakub Dawidek } 135ef0a6e20SPawel Jakub Dawidek 136ef0a6e20SPawel Jakub Dawidek static int 1376810ad6fSSam Leffler padlock_detach(device_t dev) 138ef0a6e20SPawel Jakub Dawidek { 1396810ad6fSSam Leffler struct padlock_softc *sc = device_get_softc(dev); 140ef0a6e20SPawel Jakub Dawidek 141ef0a6e20SPawel Jakub Dawidek crypto_unregister_all(sc->sc_cid); 142ef0a6e20SPawel Jakub Dawidek return (0); 143ef0a6e20SPawel Jakub Dawidek } 144ef0a6e20SPawel Jakub Dawidek 145ef0a6e20SPawel Jakub Dawidek static int 1461b0909d5SConrad Meyer padlock_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri) 147ef0a6e20SPawel Jakub Dawidek { 1486810ad6fSSam Leffler struct padlock_softc *sc = device_get_softc(dev); 149ef0a6e20SPawel Jakub Dawidek struct padlock_session *ses = NULL; 15064e18040SPawel Jakub Dawidek struct cryptoini *encini, *macini; 15104c49e68SKonstantin Belousov struct thread *td; 152633034feSKonstantin Belousov int error; 153ef0a6e20SPawel Jakub Dawidek 1541b0909d5SConrad Meyer if (cri == NULL) 15564e18040SPawel Jakub Dawidek return (EINVAL); 15664e18040SPawel Jakub Dawidek 15764e18040SPawel Jakub Dawidek encini = macini = NULL; 15864e18040SPawel Jakub Dawidek for (; cri != NULL; cri = cri->cri_next) { 15964e18040SPawel Jakub Dawidek switch (cri->cri_alg) { 16064e18040SPawel Jakub Dawidek case CRYPTO_NULL_HMAC: 16164e18040SPawel Jakub Dawidek case CRYPTO_MD5_HMAC: 16264e18040SPawel Jakub Dawidek case CRYPTO_SHA1_HMAC: 16364e18040SPawel Jakub Dawidek case CRYPTO_RIPEMD160_HMAC: 16464e18040SPawel Jakub Dawidek case CRYPTO_SHA2_256_HMAC: 16564e18040SPawel Jakub Dawidek case CRYPTO_SHA2_384_HMAC: 16664e18040SPawel Jakub Dawidek case CRYPTO_SHA2_512_HMAC: 16764e18040SPawel Jakub Dawidek if (macini != NULL) 16864e18040SPawel Jakub Dawidek return (EINVAL); 16964e18040SPawel Jakub Dawidek macini = cri; 17064e18040SPawel Jakub Dawidek break; 17164e18040SPawel Jakub Dawidek case CRYPTO_AES_CBC: 17264e18040SPawel Jakub Dawidek if (encini != NULL) 17364e18040SPawel Jakub Dawidek return (EINVAL); 17464e18040SPawel Jakub Dawidek encini = cri; 17564e18040SPawel Jakub Dawidek break; 17664e18040SPawel Jakub Dawidek default: 177ef0a6e20SPawel Jakub Dawidek return (EINVAL); 178ef0a6e20SPawel Jakub Dawidek } 17964e18040SPawel Jakub Dawidek } 18064e18040SPawel Jakub Dawidek 18164e18040SPawel Jakub Dawidek /* 18264e18040SPawel Jakub Dawidek * We only support HMAC algorithms to be able to work with 183b2630c29SGeorge V. Neville-Neil * ipsec(4), so if we are asked only for authentication without 18464e18040SPawel Jakub Dawidek * encryption, don't pretend we can accellerate it. 18564e18040SPawel Jakub Dawidek */ 18664e18040SPawel Jakub Dawidek if (encini == NULL) 18764e18040SPawel Jakub Dawidek return (EINVAL); 188ef0a6e20SPawel Jakub Dawidek 1891b0909d5SConrad Meyer ses = crypto_get_driver_session(cses); 1901b0909d5SConrad Meyer ses->ses_fpu_ctx = fpu_kern_alloc_ctx(FPU_KERN_NORMAL); 191ef0a6e20SPawel Jakub Dawidek 1925333bd47SPawel Jakub Dawidek error = padlock_cipher_setup(ses, encini); 1935333bd47SPawel Jakub Dawidek if (error != 0) { 1941b0909d5SConrad Meyer padlock_freesession_one(sc, ses); 1955333bd47SPawel Jakub Dawidek return (error); 196ef0a6e20SPawel Jakub Dawidek } 197ef0a6e20SPawel Jakub Dawidek 19864e18040SPawel Jakub Dawidek if (macini != NULL) { 19904c49e68SKonstantin Belousov td = curthread; 200849ce31aSConrad Meyer fpu_kern_enter(td, ses->ses_fpu_ctx, FPU_KERN_NORMAL | 201633034feSKonstantin Belousov FPU_KERN_KTHR); 2025333bd47SPawel Jakub Dawidek error = padlock_hash_setup(ses, macini); 2038c6f8f3dSKonstantin Belousov fpu_kern_leave(td, ses->ses_fpu_ctx); 2045333bd47SPawel Jakub Dawidek if (error != 0) { 2051b0909d5SConrad Meyer padlock_freesession_one(sc, ses); 2065333bd47SPawel Jakub Dawidek return (error); 20764e18040SPawel Jakub Dawidek } 208ef0a6e20SPawel Jakub Dawidek } 209ef0a6e20SPawel Jakub Dawidek 210ef0a6e20SPawel Jakub Dawidek return (0); 211ef0a6e20SPawel Jakub Dawidek } 212ef0a6e20SPawel Jakub Dawidek 213ec7993f8SPawel Jakub Dawidek static void 2141b0909d5SConrad Meyer padlock_freesession_one(struct padlock_softc *sc, struct padlock_session *ses) 215ec7993f8SPawel Jakub Dawidek { 216ec7993f8SPawel Jakub Dawidek 217ec7993f8SPawel Jakub Dawidek padlock_hash_free(ses); 2181b0909d5SConrad Meyer fpu_kern_free_ctx(ses->ses_fpu_ctx); 219ec7993f8SPawel Jakub Dawidek } 220ec7993f8SPawel Jakub Dawidek 2211b0909d5SConrad Meyer static void 2221b0909d5SConrad Meyer padlock_freesession(device_t dev, crypto_session_t cses) 223ef0a6e20SPawel Jakub Dawidek { 2246810ad6fSSam Leffler struct padlock_softc *sc = device_get_softc(dev); 225ef0a6e20SPawel Jakub Dawidek struct padlock_session *ses; 226ef0a6e20SPawel Jakub Dawidek 2271b0909d5SConrad Meyer ses = crypto_get_driver_session(cses); 2281b0909d5SConrad Meyer padlock_freesession_one(sc, ses); 229ef0a6e20SPawel Jakub Dawidek } 230ef0a6e20SPawel Jakub Dawidek 231ef0a6e20SPawel Jakub Dawidek static int 2326810ad6fSSam Leffler padlock_process(device_t dev, struct cryptop *crp, int hint __unused) 233ef0a6e20SPawel Jakub Dawidek { 2345333bd47SPawel Jakub Dawidek struct padlock_session *ses = NULL; 23564e18040SPawel Jakub Dawidek struct cryptodesc *crd, *enccrd, *maccrd; 23664e18040SPawel Jakub Dawidek int error = 0; 237ef0a6e20SPawel Jakub Dawidek 238bb348210SPawel Jakub Dawidek enccrd = maccrd = NULL; 239bb348210SPawel Jakub Dawidek 2402bc989beSPhilip Paeps /* Sanity check. */ 2412bc989beSPhilip Paeps if (crp == NULL) 2422bc989beSPhilip Paeps return (EINVAL); 2432bc989beSPhilip Paeps 2442bc989beSPhilip Paeps if (crp->crp_callback == NULL || crp->crp_desc == NULL) { 24564e18040SPawel Jakub Dawidek error = EINVAL; 246ef0a6e20SPawel Jakub Dawidek goto out; 247ef0a6e20SPawel Jakub Dawidek } 24864e18040SPawel Jakub Dawidek 24964e18040SPawel Jakub Dawidek for (crd = crp->crp_desc; crd != NULL; crd = crd->crd_next) { 25064e18040SPawel Jakub Dawidek switch (crd->crd_alg) { 25164e18040SPawel Jakub Dawidek case CRYPTO_NULL_HMAC: 25264e18040SPawel Jakub Dawidek case CRYPTO_MD5_HMAC: 25364e18040SPawel Jakub Dawidek case CRYPTO_SHA1_HMAC: 25464e18040SPawel Jakub Dawidek case CRYPTO_RIPEMD160_HMAC: 25564e18040SPawel Jakub Dawidek case CRYPTO_SHA2_256_HMAC: 25664e18040SPawel Jakub Dawidek case CRYPTO_SHA2_384_HMAC: 25764e18040SPawel Jakub Dawidek case CRYPTO_SHA2_512_HMAC: 25864e18040SPawel Jakub Dawidek if (maccrd != NULL) { 25964e18040SPawel Jakub Dawidek error = EINVAL; 260ef0a6e20SPawel Jakub Dawidek goto out; 261ef0a6e20SPawel Jakub Dawidek } 26264e18040SPawel Jakub Dawidek maccrd = crd; 26364e18040SPawel Jakub Dawidek break; 26464e18040SPawel Jakub Dawidek case CRYPTO_AES_CBC: 26564e18040SPawel Jakub Dawidek if (enccrd != NULL) { 26664e18040SPawel Jakub Dawidek error = EINVAL; 26764e18040SPawel Jakub Dawidek goto out; 26864e18040SPawel Jakub Dawidek } 26964e18040SPawel Jakub Dawidek enccrd = crd; 27064e18040SPawel Jakub Dawidek break; 27164e18040SPawel Jakub Dawidek default: 27264e18040SPawel Jakub Dawidek return (EINVAL); 27364e18040SPawel Jakub Dawidek } 27464e18040SPawel Jakub Dawidek } 27564e18040SPawel Jakub Dawidek if (enccrd == NULL || (enccrd->crd_len % AES_BLOCK_LEN) != 0) { 27664e18040SPawel Jakub Dawidek error = EINVAL; 277eb340a61SPawel Jakub Dawidek goto out; 278eb340a61SPawel Jakub Dawidek } 279ef0a6e20SPawel Jakub Dawidek 2801b0909d5SConrad Meyer ses = crypto_get_driver_session(crp->crp_session); 281ef0a6e20SPawel Jakub Dawidek 28264e18040SPawel Jakub Dawidek /* Perform data authentication if requested before encryption. */ 28364e18040SPawel Jakub Dawidek if (maccrd != NULL && maccrd->crd_next == enccrd) { 2845333bd47SPawel Jakub Dawidek error = padlock_hash_process(ses, maccrd, crp); 28564e18040SPawel Jakub Dawidek if (error != 0) 28664e18040SPawel Jakub Dawidek goto out; 287ef0a6e20SPawel Jakub Dawidek } 288ef0a6e20SPawel Jakub Dawidek 2895333bd47SPawel Jakub Dawidek error = padlock_cipher_process(ses, enccrd, crp); 2905333bd47SPawel Jakub Dawidek if (error != 0) 2915333bd47SPawel Jakub Dawidek goto out; 29264e18040SPawel Jakub Dawidek 29364e18040SPawel Jakub Dawidek /* Perform data authentication if requested after encryption. */ 29464e18040SPawel Jakub Dawidek if (maccrd != NULL && enccrd->crd_next == maccrd) { 2955333bd47SPawel Jakub Dawidek error = padlock_hash_process(ses, maccrd, crp); 29664e18040SPawel Jakub Dawidek if (error != 0) 29764e18040SPawel Jakub Dawidek goto out; 298ef0a6e20SPawel Jakub Dawidek } 299ef0a6e20SPawel Jakub Dawidek 300ef0a6e20SPawel Jakub Dawidek out: 3015333bd47SPawel Jakub Dawidek #if 0 3025333bd47SPawel Jakub Dawidek /* 3035333bd47SPawel Jakub Dawidek * This code is not necessary, because contexts will be freed on next 3045333bd47SPawel Jakub Dawidek * padlock_setup_mackey() call or at padlock_freesession() call. 3055333bd47SPawel Jakub Dawidek */ 3065333bd47SPawel Jakub Dawidek if (ses != NULL && maccrd != NULL && 3075333bd47SPawel Jakub Dawidek (maccrd->crd_flags & CRD_F_KEY_EXPLICIT) != 0) { 3085333bd47SPawel Jakub Dawidek padlock_free_ctx(ses->ses_axf, ses->ses_ictx); 3095333bd47SPawel Jakub Dawidek padlock_free_ctx(ses->ses_axf, ses->ses_octx); 310ef0a6e20SPawel Jakub Dawidek } 3115333bd47SPawel Jakub Dawidek #endif 31264e18040SPawel Jakub Dawidek crp->crp_etype = error; 313ef0a6e20SPawel Jakub Dawidek crypto_done(crp); 31464e18040SPawel Jakub Dawidek return (error); 315ef0a6e20SPawel Jakub Dawidek } 316ef0a6e20SPawel Jakub Dawidek 3176810ad6fSSam Leffler static device_method_t padlock_methods[] = { 3186810ad6fSSam Leffler DEVMETHOD(device_identify, padlock_identify), 3196810ad6fSSam Leffler DEVMETHOD(device_probe, padlock_probe), 3206810ad6fSSam Leffler DEVMETHOD(device_attach, padlock_attach), 3216810ad6fSSam Leffler DEVMETHOD(device_detach, padlock_detach), 322ef0a6e20SPawel Jakub Dawidek 3236810ad6fSSam Leffler DEVMETHOD(cryptodev_newsession, padlock_newsession), 3246810ad6fSSam Leffler DEVMETHOD(cryptodev_freesession,padlock_freesession), 3256810ad6fSSam Leffler DEVMETHOD(cryptodev_process, padlock_process), 326ef0a6e20SPawel Jakub Dawidek 3276810ad6fSSam Leffler {0, 0}, 328ef0a6e20SPawel Jakub Dawidek }; 3296810ad6fSSam Leffler 3306810ad6fSSam Leffler static driver_t padlock_driver = { 3316810ad6fSSam Leffler "padlock", 3326810ad6fSSam Leffler padlock_methods, 3336810ad6fSSam Leffler sizeof(struct padlock_softc), 3346810ad6fSSam Leffler }; 3356810ad6fSSam Leffler static devclass_t padlock_devclass; 3366810ad6fSSam Leffler 3376810ad6fSSam Leffler /* XXX where to attach */ 3386810ad6fSSam Leffler DRIVER_MODULE(padlock, nexus, padlock_driver, padlock_devclass, 0, 0); 339ef0a6e20SPawel Jakub Dawidek MODULE_VERSION(padlock, 1); 340ef0a6e20SPawel Jakub Dawidek MODULE_DEPEND(padlock, crypto, 1, 1, 1); 341