On Fri, 19 Sep 2008 16:46:43 -0700
"Loc Ho" <[EMAIL PROTECTED]> wrote:
> arch/powerpc/boot/dts/kilauea.dts | 10 +
powerpc dts patches are reviewed on linuxppc-dev list. For ppc4xx, it
looks like new bindings are accompanied with a patch to
Documentation/powerpc/booting-without-of.txt.
> diff --git a/arch/powerpc/boot/dts/kilauea.dts
> b/arch/powerpc/boot/dts/kilauea.dts
> + CRYPTO: [EMAIL PROTECTED] {
> + device_type = "crypto";
device_type is deprecated, remove.
> + compatible = "crypto4xx-crypto",
> "amcc,crypto4xx-crypto";
compatible values should always contain the vendor prefix. is crypto
occuring twice for a reason? how about just a single entry:
"amcc,ppc4xx-crypto"?
> @@ -342,5 +351,6 @@
> 0x0 0x0 0x0 0x3 &UIC2 0xd 0x4 /* swizzled int C
> */
> 0x0 0x0 0x0 0x4 &UIC2 0xe 0x4 /* swizzled int D
> */>;
> };
> +
whitespace change not necessary
> +config CRYPTO_DEV_PPC4XX
> + tristate "Driver AMCC PPC4XX crypto accelerator"
> + select CRYPTO_HASH
> + select CRYPTO_ALGAPI
> + select CRYPTO_BLKCIPHER
this looks like an ABLKCIPHER driver (BLKCIPHER depends on
ABLKCIPHER). plus, shouldn't this depend on PPC and 4xx too?
> diff --git a/drivers/crypto/amcc/crypto4xx_alg.c
> b/drivers/crypto/amcc/crypto4xx_alg.c
> +#include <crypto/internal/hash.h>
does something need to move up to include/crypto/hash.h?
> + /* Application only provided ptr for the rctx
> + * we alloc memory for it. And along we alloc memory for the sa in it */
please see Documentation/CodingStyle for how to format comments.
> + ctx->use_rctx = 1;
> + rc = crypto4xx_alloc_sa_rctx(ctx, rctx);
> + if (rc)
> + goto err_nomem;
> + sa = (struct dynamic_sa_ctl *)(rctx->sa_out);
> + offset = get_dynamic_sa_offset_iv_field(rctx);
where is offset being used?
> + /* copy req->iv to state_record->iv */
> + if (req->info)
> + crypto4xx_memcpy_le(rctx->state_record, req->info,
> + get_dynamic_sa_iv_size(rctx));
> + else
> + memset(rctx->state_record, 0, get_dynamic_sa_iv_size(rctx));
> + sa->sa_command_0.bf.dir = CRYPTO_OUTBOUND;
> + rctx->hash_final = 0;
> + rctx->is_hash = 0;
> + rctx->pd_ctl = 0x1;
> + rctx->direction = CRYPTO_OUTBOUND;
> + return crypto4xx_setup_crypto(&req->base);
> +
> +err_nomem:
> + return -ENOMEM;
not much going on here; doing the return straight up instead of the
goto indirection is easier to read.
> +static inline int crypto4xx_decrypt(struct ablkcipher_request *req)
> +{
> + struct crypto4xx_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
> + struct crypto4xx_ctx *rctx = ablkcipher_request_ctx(req);
> + struct dynamic_sa_ctl *sa = NULL;
> + int rc;
> + u32 offset;
> +
> + /* Application only provided ptr for the rctx
> + * we alloc memory for it. And along we alloc memory for the sa in it*/
> + ctx->use_rctx = 1;
> + rc = crypto4xx_alloc_sa_rctx(ctx, rctx);
> + if (rc != 0)
> + goto err_nomem;
same here (and other places).
> + sa = (struct dynamic_sa_ctl *)(rctx->sa_in);
> + offset = get_dynamic_sa_offset_iv_field(rctx);
again, can't see offset being used here.
> + /* copy req->iv to state_record->iv */
> + if (req->info)
> + crypto4xx_memcpy_le(rctx->state_record, req->info,
> + get_dynamic_sa_iv_size(rctx));
> + else
> + memset(rctx->state_record, 0, get_dynamic_sa_iv_size(rctx));
> + sa->sa_command_0.bf.dir = CRYPTO_INBOUND;
> + rctx->hash_final = 0;
> + rctx->is_hash = 0;
> + rctx->pd_ctl = 1;
> + rctx->direction = CRYPTO_INBOUND;
> +
> + return crypto4xx_setup_crypto(&req->base);
> +
> +err_nomem:
> + return -ENOMEM;
> +}
> +/**
> + * Support Crypto Algorithms
> + */
> +struct crypto_alg crypto4xx_basic_alg[] = {
> +
> + /* Crypto AES modes */
> + {.cra_name = "cbc(aes)",
> + .cra_driver_name = "cbc-aes",
"cbc-aes-ppc4xx"?
> + .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
> + .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
> + .cra_blocksize = 16, /* 128-bits block */
> + .cra_ctxsize = sizeof(struct crypto4xx_ctx),
> + .cra_alignmask = 0,
> + .cra_type = &crypto_ablkcipher_type,
> + .cra_module = THIS_MODULE,
> + .cra_u = {.ablkcipher = {
> + .min_keysize = 16, /* AES min key size is 128-bits */
> + .max_keysize = 32, /* AES max key size is 256-bits */
> + .ivsize = 16, /* IV size is 16 bytes */
> + .setkey = crypto4xx_setkey_aes_cbc,
> + .encrypt = crypto4xx_encrypt,
> + .decrypt = crypto4xx_decrypt,
> + } }
> + },
> + /* Hash SHA1, SHA2 */
> + {.cra_name = "sha1",
> + .cra_driver_name = "sha1",
-ppc4xx.
> + .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
> + .cra_flags = CRYPTO_ALG_TYPE_AHASH | CRYPTO_ALG_ASYNC,
> + .cra_blocksize = 64, /* SHA1 block size is 512-bits */
> + .cra_ctxsize = sizeof(struct crypto4xx_ctx),
> + .cra_alignmask = 0,
> + .cra_type = &crypto_ahash_type,
> + .cra_init = crypto4xx_sha1_alg_init,
> + .cra_module = THIS_MODULE,
> + .cra_u = {.ahash = {
> + .digestsize = 20, /* Disgest is 160-bits */
> + .init = crypto4xx_hash_init,
> + .update = crypto4xx_hash_update,
> + .final = crypto4xx_hash_final,
> + .digest = crypto4xx_hash_digest,
> + } }
> + },
> + /* Terminator */
> + {.cra_name = "" }
save space and use ARRAY_SIZE
> diff --git a/drivers/crypto/amcc/crypto4xx_core.c
> b/drivers/crypto/amcc/crypto4xx_core.c
> +struct crypto4xx_core_device lsec_core;
this is global, and it thus doesn't handle > 1 device. shouldn't this
be the device's private data pointed to by its struct device?
> +/**
> + * PPC4XX Crypto Engine Initialization Routine
> + */
> +int32_t crypto4xx_init(struct crypto4xx_device *dev)
this (and the others) should be static, no?
> +#ifdef CONFIG_USING_PD_DONE_INT
this is not being defined anywhere; remove?
> +void crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size)
> +{
> + ctx->sa_in = pci_alloc_consistent(NULL, size * 4,
dma_alloc_consistent?
> +void ppc4xx_fill_one_page(dma_addr_t addr, u32 length,
> + u32 idx, u32 *next_sd,
> + u32 *offset, u32 *nbytes)
> +{
> + struct crypto4xx_device *dev = &(lsec_core.dev);
> + u32 len;
> +
> + if (length > dev->scatter_buffer_size) {
> + memcpy(phys_to_virt(addr),
> + dev->scatter_buffer_va +
> + idx*dev->scatter_buffer_size + (*offset),
> + dev->scatter_buffer_size);
> + *offset = 0;
> + length -= dev->scatter_buffer_size;
> + *nbytes -= dev->scatter_buffer_size;
> + if (idx == PPC4XX_LAST_SD)
> + idx = 0;
> + else
> + idx++;
> + *next_sd = idx;
> + ppc4xx_fill_one_page(addr + dev->scatter_buffer_size, length,
> + idx, next_sd, offset, nbytes);
doesn't recursing like this create an opportunity to unnecessarily
overflow the stack?
> + } else {
> + struct ahash_request *ahash_req;
> + ahash_req = ahash_request_cast(req);
> + if (ctx->use_rctx) {
> + rctx = ahash_request_ctx(ahash_req);
> + return crypto4xx_build_pd(dev, req, pd_entry, rctx,
> + ahash_req->src,
> + (struct scatterlist *)
> + ahash_req->result,
> + ahash_req->nbytes,
> + AHASH);
> + } else {
> + return crypto4xx_build_pd(dev, req, pd_entry, ctx,
> + ahash_req->src,
> + (struct scatterlist *)
> + ahash_req->result,
> + ahash_req->nbytes,
> + AHASH);
bad alignment
> + /* include address for kasumi that is eip06*/
where in the code does this comment apply?
> + rc = of_address_to_resource(ofdev->node, 0, &res);
> + if (rc)
> + return -ENODEV;
> +
> + lsec_core.ce_phy_address = res.start;
> + lsec_core.ce_base = ioremap(lsec_core.ce_phy_address, 0x80400);
0x80400 should be obtained from device tree. use of_iomap?
> +
> + /* need to setup pdr, rdr, gdr and sdr */
> + rc = crypto4xx_start_device(&lsec_core.dev);
> + if (rc)
> + goto err_register_intr;
> +
> + /* Register security algorithms with Linux CryptoAPI */
> + rc = crypto4xx_register_alg(&lsec_core.dev, crypto4xx_basic_alg);
> + if (rc)
> + goto err_register_alg;
> +
> + CRYPTUTL_PRINTK(KERN_INFO, "Loaded AMCC PPC4XX crypto "
> + "accelerator driver v%s\n", PPC4XX_SEC_VERSION_STR);
> +
> + return rc;
> +
> +err_register_intr:
> +err_register_alg:
use a single err_register label?
> diff --git a/drivers/crypto/amcc/crypto4xx_core.h
> b/drivers/crypto/amcc/crypto4xx_core.h
> +/**
> + * Debugging Macro
> + *
> + */
> +#define PPC4XX_SEC_DEBUG
> +#define PFX "CRYPTO4XX: "
> +
> +#if !defined(PPC4XX_SEC_DEBUG)
> +# define CRYPTUTL_PRINTK(ll, fmt, ...)
> +#else
> +# define CRYPTUTL_PRINTK(ll, fmt, ...) \
> + do { \
> + printk(ll PFX fmt "\n", ##__VA_ARGS__); \
> +} while (0);
> +#endif
there already exists a debug print infrastructure for device drivers,
e.g. dev_err, dev_dbg, dev_info..
> +#define PPC4XX_INT_DESCR_CNT 4
> +#define PPC4XX_INT_TIMEOUT_CNT 0
> +/* FIXme arbitory number*/
?
> +#define PPC4XX_INT_CFG 1
> +
> +#ifdef CONFIG_405EX
> +#define SDR0_SRST0 0x00000200
> +#define SRST0_CRYP 0x00000008
> +#else
> +#define SDR0_SRST0 0x00000201
> +#define SRST0_CRYP 0x08000000
> +#endif
4xx should be multiplatform-capable these days (if not, it will be).
The driver should be able to figure out whether it's running on a 405EX
dynamically.
> +struct crypto4xx_device;
> +extern struct crypto4xx_core_device lsec_core;
> +extern struct crypto_alg crypto4xx_basic_alg[];
> +extern u32 crypto4xx_write32(u32 reg, u32 val);
> +extern u32 crypto4xx_read32(u32 reg, u32 *val);
> +extern u32 crypto4xx_get_pd_from_pdr(struct crypto4xx_device *dev);
> +extern u32 crypto4xx_put_pd_to_pdr(struct crypto4xx_device *dev, u32 idx);
> +
> +extern struct ce_pd *crypto4xx_get_pdp(struct crypto4xx_device *dev,
> + dma_addr_t *pd_dma, u32 idx);
> +extern struct ce_gd *crypto4xx_get_gdp(struct crypto4xx_device *dev,
> + dma_addr_t *gd_dma, u32 idx);
> +extern struct ce_sd *crypto4xx_get_sdp(struct crypto4xx_device *dev,
> + dma_addr_t *sd_dma, u32 idx);
> +extern void crypto4xx_alloc_sa(struct crypto4xx_ctx *ctx, u32 size);
> +extern u32 crypto4xx_alloc_sa_rctx(struct crypto4xx_ctx *ctx,
> + struct crypto4xx_ctx *rctx);
> +
> +
> +extern struct crypto4xx_ctx *crypto4xx_alloc_ctx
> + (struct crypto4xx_ctx *ctx);
> +
> +extern void crypto4xx_free_ctx(struct crypto4xx_ctx *ctx);
> +extern u32 crypto4xx_build_pdr(struct crypto4xx_device *dev);
> +extern u32 crypto4xx_build_gdr(struct crypto4xx_device *dev);
> +extern u32 crypto4xx_build_sdr(struct crypto4xx_device *dev);
> +
> +extern u32 crypto4xx_pd_done(struct crypto4xx_core_device *lsec, u32 idx);
> +
> +extern u32 crypto4xx_start_device(struct crypto4xx_device *dev);
> +
> +extern u32 crypto4xx_stop_all(void);
> +extern u32 crypto4xx_config_clear(void);
> +
> +extern void crypto4xx_free_sa(struct crypto4xx_ctx *ctx);
> +extern u32 crypto4xx_alloc_state_record(struct crypto4xx_ctx *ctx);
> +extern void crypto4xx_free_state_record(struct crypto4xx_ctx *ctx);
> +
> +extern u32 get_dynamic_sa_offset_state_ptr_field(struct crypto4xx_ctx *ctx);
> +extern u32 get_dynamic_sa_offset_iv_field(struct crypto4xx_ctx *ctx);
> +extern void dump_dynamic_sa_iv_field(struct crypto4xx_ctx *ctx);
> +extern u32 get_dynamic_sa_iv_size(struct crypto4xx_ctx *ctx);
> +
> +
> +extern void crypto4xx_memcpy_be(unsigned int *dst,
> + const unsigned char *buf, int len);
> +extern void crypto4xx_memcpy_le(unsigned int *dst,
> + const unsigned char *buf, int len);
> +extern int crypto4xx_setup_crypto(struct crypto_async_request *req);
> +
> +extern u32 crypto4xx_check_pd_done(struct crypto4xx_device *dev);
> +extern void crypto4xx_alg_exit(struct crypto_tfm *tfm);
> +extern void crypto4xx_free_sa_rctx(struct crypto4xx_ctx *rctx);
> +extern int crypto4xx_handle_req(struct crypto_async_request *req);
> +extern u32 crypto4xx_build_pd(struct crypto4xx_device *dev,
> + struct crypto_async_request *req,
> + u32 pd_entry,
> + struct crypto4xx_ctx *ctx,
> + struct scatterlist *src,
> + struct scatterlist *dst,
> + u16 datalen,
> + u8 type);
please only use declarations if you have a cyclic dependency in a c file.
also, and probably most importantly, I didn't see any locking code in
this driver - how do you enforce mutually exclusive access to the
device?
Kim
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html