svn commit: r209379 -
user/jmallett/octeon/sys/mips/cavium/cryptocteon
Juli Mallett
jmallett at FreeBSD.org
Mon Jun 21 00:49:24 UTC 2010
Author: jmallett
Date: Mon Jun 21 00:49:23 2010
New Revision: 209379
URL: http://svn.freebsd.org/changeset/base/209379
Log:
o) Add a device attachment.
o) Move some globals into device softc.
o) Make compile.
o) Some cosmetic cleanups.
Modified:
user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c
user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c
user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h
Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c Sun Jun 20 23:45:19 2010 (r209378)
+++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c Mon Jun 21 00:49:23 2010 (r209379)
@@ -65,8 +65,6 @@ __FBSDID("$FreeBSD$");
struct octeon_cop2_state {
};
-#define dprintf printf
-
static inline unsigned long octeon_crypto_enable(struct octeon_cop2_state *state)
{
return (0);
Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c Sun Jun 20 23:45:19 2010 (r209378)
+++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c Mon Jun 21 00:49:23 2010 (r209379)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/malloc.h>
@@ -40,70 +41,62 @@ __FBSDID("$FreeBSD$");
#include <contrib/octeon-sdk/cvmx.h>
-struct {
- softc_device_decl sc_dev;
-} octo_softc;
-
-struct octo_sess {
- int octo_encalg;
- #define MAX_CIPHER_KEYLEN 64
- char octo_enckey[MAX_CIPHER_KEYLEN];
- int octo_encklen;
-
- int octo_macalg;
- #define MAX_HASH_KEYLEN 64
- char octo_mackey[MAX_HASH_KEYLEN];
- int octo_macklen;
- int octo_mackey_set;
-
- int octo_mlen;
- int octo_ivsize;
-
- int (*octo_encrypt)(struct octo_sess *od,
- const uint8_t *buf, int buflen,
- int auth_off, int auth_len,
- int crypt_off, int crypt_len,
- int icv_off, uint8_t *ivp);
- int (*octo_decrypt)(struct octo_sess *od,
- const uint8_t *buf, int buflen,
- int auth_off, int auth_len,
- int crypt_off, int crypt_len,
- int icv_off, uint8_t *ivp);
+#include <mips/cavium/cryptocteon/cryptocteonvar.h>
- uint64_t octo_hminner[3];
- uint64_t octo_hmouter[3];
+#include "cryptodev_if.h"
+
+struct cryptocteon_softc {
+ int32_t sc_cid; /* opencrypto id */
+ struct octo_sess **sc_sessions;
+ uint32_t sc_sesnum;
};
-int32_t octo_id = -1;
-#if 0
-module_param(octo_id, int, 0444);
-MODULE_PARM_DESC(octo_id, "Read-Only OCF ID for cryptocteon driver");
-#endif
+static void cryptocteon_identify(driver_t *, device_t);
+static int cryptocteon_probe(device_t);
+static int cryptocteon_attach(device_t);
+
+static int cryptocteon_process(device_t, struct cryptop *, int);
+static int cryptocteon_newsession(device_t, u_int32_t *, struct cryptoini *);
+static int cryptocteon_freesession(device_t, u_int64_t);
-static struct octo_sess **octo_sessions = NULL;
-static u_int32_t octo_sesnum = 0;
+int cryptocteon_debug = 0;
+TUNABLE_INT("hw.cryptocteon.debug", &cryptocteon_debug);
-static int octo_process(device_t, struct cryptop *, int);
-static int octo_newsession(device_t, u_int32_t *, struct cryptoini *);
-static int octo_freesession(device_t, u_int64_t);
+static void
+cryptocteon_identify(driver_t *drv, device_t parent)
+{
+ if (octeon_has_feature(OCTEON_FEATURE_CRYPTO))
+ BUS_ADD_CHILD(parent, 0, "cryptocteon", 0);
+}
-static device_method_t octo_methods = {
- /* crypto device methods */
- DEVMETHOD(cryptodev_newsession, octo_newsession),
- DEVMETHOD(cryptodev_freesession,octo_freesession),
- DEVMETHOD(cryptodev_process, octo_process),
-};
+static int
+cryptocteon_probe(device_t dev)
+{
+ device_set_desc(dev, "Octeon Secure Coprocessor");
+ return (0);
+}
-int octo_debug = 0;
-#if 0
-module_param(octo_debug, int, 0644);
-MODULE_PARM_DESC(octo_debug, "Enable debug");
-#endif
+static int
+cryptocteon_attach(device_t dev)
+{
+ struct cryptocteon_softc *sc;
-#define dprintf printf
+ sc = device_get_softc(dev);
-#include "cavium_crypto.c"
+ sc->sc_cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SYNC);
+ if (sc->sc_cid < 0) {
+ device_printf(dev, "crypto_get_driverid ret %d\n", sc->sc_cid);
+ return (ENXIO);
+ }
+ crypto_register(sc->sc_cid, CRYPTO_MD5_HMAC, 0, 0);
+ crypto_register(sc->sc_cid, CRYPTO_SHA1_HMAC, 0, 0);
+ crypto_register(sc->sc_cid, CRYPTO_DES_CBC, 0, 0);
+ crypto_register(sc->sc_cid, CRYPTO_3DES_CBC, 0, 0);
+ crypto_register(sc->sc_cid, CRYPTO_AES_CBC, 0, 0);
+
+ return (0);
+}
/*
* Generate a new octo session. We artifically limit it to a single
@@ -111,17 +104,17 @@ MODULE_PARM_DESC(octo_debug, "Enable deb
* do not expect more than this anyway.
*/
static int
-octo_newsession(device_t dev, u_int32_t *sid, struct cryptoini *cri)
+cryptocteon_newsession(device_t dev, u_int32_t *sid, struct cryptoini *cri)
{
struct cryptoini *c, *encini = NULL, *macini = NULL;
+ struct cryptocteon_softc *sc;
struct octo_sess **ocd;
int i;
- dprintf("%s()\n", __FUNCTION__);
- if (sid == NULL || cri == NULL) {
- dprintf("%s,%d - EINVAL\n", __FILE__, __LINE__);
- return EINVAL;
- }
+ sc = device_get_softc(dev);
+
+ if (sid == NULL || cri == NULL || sc == NULL)
+ return (EINVAL);
/*
* To keep it simple, we only handle hash, cipher or hash/cipher in a
@@ -131,17 +124,17 @@ octo_newsession(device_t dev, u_int32_t
*/
for (i = 0, c = cri; c && i < 2; i++) {
if (c->cri_alg == CRYPTO_MD5_HMAC ||
- c->cri_alg == CRYPTO_SHA1_HMAC ||
- c->cri_alg == CRYPTO_NULL_HMAC) {
+ c->cri_alg == CRYPTO_SHA1_HMAC ||
+ c->cri_alg == CRYPTO_NULL_HMAC) {
if (macini) {
break;
}
macini = c;
}
if (c->cri_alg == CRYPTO_DES_CBC ||
- c->cri_alg == CRYPTO_3DES_CBC ||
- c->cri_alg == CRYPTO_AES_CBC ||
- c->cri_alg == CRYPTO_NULL_CBC) {
+ c->cri_alg == CRYPTO_3DES_CBC ||
+ c->cri_alg == CRYPTO_AES_CBC ||
+ c->cri_alg == CRYPTO_NULL_CBC) {
if (encini) {
break;
}
@@ -164,49 +157,49 @@ octo_newsession(device_t dev, u_int32_t
* So we have something we can do, lets setup the session
*/
- if (octo_sessions) {
- for (i = 1; i < octo_sesnum; i++)
- if (octo_sessions[i] == NULL)
+ if (sc->sc_sessions) {
+ for (i = 1; i < sc->sc_sesnum; i++)
+ if (sc->sc_sessions[i] == NULL)
break;
} else
i = 1; /* NB: to silence compiler warning */
- if (octo_sessions == NULL || i == octo_sesnum) {
- if (octo_sessions == NULL) {
- i = 1; /* We leave octo_sessions[0] empty */
- octo_sesnum = CRYPTO_SW_SESSIONS;
+ if (sc->sc_sessions == NULL || i == sc->sc_sesnum) {
+ if (sc->sc_sessions == NULL) {
+ i = 1; /* We leave sc->sc_sessions[0] empty */
+ sc->sc_sesnum = CRYPTO_SW_SESSIONS;
} else
- octo_sesnum *= 2;
+ sc->sc_sesnum *= 2;
- ocd = kmalloc(octo_sesnum * sizeof(struct octo_sess *), SLAB_ATOMIC);
+ ocd = malloc(sc->sc_sesnum * sizeof(struct octo_sess *),
+ M_DEVBUF, M_NOWAIT);
if (ocd == NULL) {
/* Reset session number */
- if (octo_sesnum == CRYPTO_SW_SESSIONS)
- octo_sesnum = 0;
+ if (sc->sc_sesnum == CRYPTO_SW_SESSIONS)
+ sc->sc_sesnum = 0;
else
- octo_sesnum /= 2;
+ sc->sc_sesnum /= 2;
dprintf("%s,%d: ENOBUFS\n", __FILE__, __LINE__);
return ENOBUFS;
}
- memset(ocd, 0, octo_sesnum * sizeof(struct octo_sess *));
+ memset(ocd, 0, sc->sc_sesnum * sizeof(struct octo_sess *));
/* Copy existing sessions */
- if (octo_sessions) {
- memcpy(ocd, octo_sessions,
- (octo_sesnum / 2) * sizeof(struct octo_sess *));
- kfree(octo_sessions);
+ if (sc->sc_sessions) {
+ memcpy(ocd, sc->sc_sessions,
+ (sc->sc_sesnum / 2) * sizeof(struct octo_sess *));
+ free(sc->sc_sessions, M_DEVBUF);
}
- octo_sessions = ocd;
+ sc->sc_sessions = ocd;
}
- ocd = &octo_sessions[i];
+ ocd = &sc->sc_sessions[i];
*sid = i;
-
- *ocd = (struct octo_sess *) kmalloc(sizeof(struct octo_sess), SLAB_ATOMIC);
+ *ocd = malloc(sizeof(struct octo_sess), M_DEVBUF, M_NOWAIT);
if (*ocd == NULL) {
- octo_freesession(NULL, i);
+ cryptocteon_freesession(NULL, i);
dprintf("%s,%d: ENOBUFS\n", __FILE__, __LINE__);
return ENOBUFS;
}
@@ -257,7 +250,7 @@ octo_newsession(device_t dev, u_int32_t
(*ocd)->octo_decrypt = octo_des_cbc_decrypt;
break;
default:
- octo_freesession(NULL, i);
+ cryptocteon_freesession(NULL, i);
dprintf("%s,%d: EINVALn", __FILE__, __LINE__);
return EINVAL;
}
@@ -282,7 +275,7 @@ octo_newsession(device_t dev, u_int32_t
(*ocd)->octo_decrypt = octo_aes_cbc_decrypt;
break;
default:
- octo_freesession(NULL, i);
+ cryptocteon_freesession(NULL, i);
dprintf("%s,%d: EINVALn", __FILE__, __LINE__);
return EINVAL;
}
@@ -300,7 +293,7 @@ octo_newsession(device_t dev, u_int32_t
(*ocd)->octo_hmouter);
break;
default:
- octo_freesession(NULL, i);
+ cryptocteon_freesession(NULL, i);
dprintf("%s,%d: EINVALn", __FILE__, __LINE__);
return EINVAL;
}
@@ -315,24 +308,27 @@ octo_newsession(device_t dev, u_int32_t
* Free a session.
*/
static int
-octo_freesession(device_t dev, u_int64_t tid)
+cryptocteon_freesession(device_t dev, u_int64_t tid)
{
+ struct cryptocteon_softc *sc;
u_int32_t sid = CRYPTO_SESID2LID(tid);
- dprintf("%s()\n", __FUNCTION__);
- if (sid > octo_sesnum || octo_sessions == NULL ||
- octo_sessions[sid] == NULL) {
- dprintf("%s,%d: EINVAL\n", __FILE__, __LINE__);
- return(EINVAL);
- }
+ sc = device_get_softc(dev);
+
+ if (sc == NULL)
+ return (EINVAL);
+
+ if (sid > sc->sc_sesnum || sc->sc_sessions == NULL ||
+ sc->sc_sessions[sid] == NULL)
+ return (EINVAL);
/* Silently accept and return */
if (sid == 0)
return(0);
- if (octo_sessions[sid])
- kfree(octo_sessions[sid]);
- octo_sessions[sid] = NULL;
+ if (sc->sc_sessions[sid])
+ free(sc->sc_sessions[sid], M_DEVBUF);
+ sc->sc_sessions[sid] = NULL;
return 0;
}
@@ -340,24 +336,25 @@ octo_freesession(device_t dev, u_int64_t
* Process a request.
*/
static int
-octo_process(device_t dev, struct cryptop *crp, int hint)
+cryptocteon_process(device_t dev, struct cryptop *crp, int hint)
{
struct cryptodesc *crd;
struct octo_sess *od;
u_int32_t lid;
+#if 0
struct mbuf *m = NULL;
struct uio *uiop = NULL;
+#endif
struct cryptodesc *enccrd = NULL, *maccrd = NULL;
unsigned char *ivp = NULL;
unsigned char iv_data[HASH_MAX_LEN];
int auth_off = 0, auth_len = 0, crypt_off = 0, crypt_len = 0, icv_off = 0;
+ struct cryptocteon_softc *sc;
- dprintf("%s()\n", __FUNCTION__);
- /* Sanity check */
- if (crp == NULL) {
- dprintf("%s,%d: EINVAL\n", __FILE__, __LINE__);
+ sc = device_get_softc(dev);
+
+ if (sc == NULL || crp == NULL)
return EINVAL;
- }
crp->crp_etype = 0;
@@ -368,13 +365,13 @@ octo_process(device_t dev, struct crypto
}
lid = crp->crp_sid & 0xffffffff;
- if (lid >= octo_sesnum || lid == 0 || octo_sessions == NULL ||
- octo_sessions[lid] == NULL) {
+ if (lid >= sc->sc_sesnum || lid == 0 || sc->sc_sessions == NULL ||
+ sc->sc_sessions[lid] == NULL) {
crp->crp_etype = ENOENT;
dprintf("%s,%d: ENOENT\n", __FILE__, __LINE__);
goto done;
}
- od = octo_sessions[lid];
+ od = sc->sc_sessions[lid];
#if 0
/*
@@ -439,7 +436,6 @@ octo_process(device_t dev, struct crypto
icv_off = maccrd->crd_inject;
}
-
#if 0
/*
* setup the SG list to cover the buffer
@@ -525,37 +521,25 @@ done:
crypto_done(crp);
return 0;
}
-#if 0
-static int
-cryptocteon_init(void)
-{
- dprintf("%s(%p)\n", __FUNCTION__, cryptocteon_init);
- softc_device_init(&octo_softc, "cryptocteon", 0, octo_methods);
+static device_method_t cryptocteon_methods[] = {
+ /* device methods */
+ DEVMETHOD(device_identify, cryptocteon_identify),
+ DEVMETHOD(device_probe, cryptocteon_probe),
+ DEVMETHOD(device_attach, cryptocteon_attach),
- octo_id = crypto_get_driverid(softc_get_device(&octo_softc),
- CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SYNC);
- if (octo_id < 0) {
- printf("Cryptocteon device cannot initialize!");
- return -ENODEV;
- }
-
- crypto_register(octo_id, CRYPTO_MD5_HMAC, 0,0);
- crypto_register(octo_id, CRYPTO_SHA1_HMAC, 0,0);
- //crypto_register(octo_id, CRYPTO_MD5, 0,0);
- //crypto_register(octo_id, CRYPTO_SHA1, 0,0);
- crypto_register(octo_id, CRYPTO_DES_CBC, 0,0);
- crypto_register(octo_id, CRYPTO_3DES_CBC, 0,0);
- crypto_register(octo_id, CRYPTO_AES_CBC, 0,0);
+ /* crypto device methods */
+ DEVMETHOD(cryptodev_newsession, cryptocteon_newsession),
+ DEVMETHOD(cryptodev_freesession,cryptocteon_freesession),
+ DEVMETHOD(cryptodev_process, cryptocteon_process),
- return(0);
-}
+ { 0, 0 }
+};
-static void
-cryptocteon_exit(void)
-{
- dprintf("%s()\n", __FUNCTION__);
- crypto_unregister_all(octo_id);
- octo_id = -1;
-}
-#endif
+static driver_t cryptocteon_driver = {
+ "cryptocteon",
+ cryptocteon_methods,
+ sizeof (struct cryptocteon_softc),
+};
+static devclass_t cryptocteon_devclass;
+DRIVER_MODULE(cryptocteon, nexus, cryptocteon_driver, cryptocteon_devclass, 0, 0);
Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h Sun Jun 20 23:45:19 2010 (r209378)
+++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h Mon Jun 21 00:49:23 2010 (r209379)
@@ -57,6 +57,14 @@ struct octo_sess {
uint64_t octo_hmouter[3];
};
+#define dprintf(fmt, ...) \
+ do { \
+ if (cryptocteon_debug) \
+ printf("%s: " fmt, __func__, ## __VA_ARGS__); \
+ } while (0)
+
+extern int cryptocteon_debug;
+
void octo_calc_hash(uint8_t, unsigned char *, uint64_t *, uint64_t *);
/* XXX Actually just hashing functions, not encryption. */
More information about the svn-src-user
mailing list