1049359d655277c382683a6030ae0bac485568ffcJames Hsiao/** 2049359d655277c382683a6030ae0bac485568ffcJames Hsiao * AMCC SoC PPC4xx Crypto Driver 3049359d655277c382683a6030ae0bac485568ffcJames Hsiao * 4049359d655277c382683a6030ae0bac485568ffcJames Hsiao * Copyright (c) 2008 Applied Micro Circuits Corporation. 5049359d655277c382683a6030ae0bac485568ffcJames Hsiao * All rights reserved. James Hsiao <jhsiao@amcc.com> 6049359d655277c382683a6030ae0bac485568ffcJames Hsiao * 7049359d655277c382683a6030ae0bac485568ffcJames Hsiao * This program is free software; you can redistribute it and/or modify 8049359d655277c382683a6030ae0bac485568ffcJames Hsiao * it under the terms of the GNU General Public License as published by 9049359d655277c382683a6030ae0bac485568ffcJames Hsiao * the Free Software Foundation; either version 2 of the License, or 10049359d655277c382683a6030ae0bac485568ffcJames Hsiao * (at your option) any later version. 11049359d655277c382683a6030ae0bac485568ffcJames Hsiao * 12049359d655277c382683a6030ae0bac485568ffcJames Hsiao * This program is distributed in the hope that it will be useful, 13049359d655277c382683a6030ae0bac485568ffcJames Hsiao * but WITHOUT ANY WARRANTY; without even the implied warranty of 14049359d655277c382683a6030ae0bac485568ffcJames Hsiao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15049359d655277c382683a6030ae0bac485568ffcJames Hsiao * GNU General Public License for more details. 16049359d655277c382683a6030ae0bac485568ffcJames Hsiao * 17049359d655277c382683a6030ae0bac485568ffcJames Hsiao * @file crypto4xx_sa.c 18049359d655277c382683a6030ae0bac485568ffcJames Hsiao * 19049359d655277c382683a6030ae0bac485568ffcJames Hsiao * This file implements the security context 2025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * associate format. 21049359d655277c382683a6030ae0bac485568ffcJames Hsiao */ 22049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/kernel.h> 23049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/module.h> 24049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/moduleparam.h> 25049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/mod_devicetable.h> 26049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/interrupt.h> 27049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/spinlock_types.h> 28049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/highmem.h> 29049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/scatterlist.h> 30049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <linux/crypto.h> 31049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <crypto/algapi.h> 32049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include <crypto/des.h> 33049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include "crypto4xx_reg_def.h" 34049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include "crypto4xx_sa.h" 35049359d655277c382683a6030ae0bac485568ffcJames Hsiao#include "crypto4xx_core.h" 36049359d655277c382683a6030ae0bac485568ffcJames Hsiao 37049359d655277c382683a6030ae0bac485568ffcJames Hsiaou32 get_dynamic_sa_offset_iv_field(struct crypto4xx_ctx *ctx) 38049359d655277c382683a6030ae0bac485568ffcJames Hsiao{ 39049359d655277c382683a6030ae0bac485568ffcJames Hsiao u32 offset; 40049359d655277c382683a6030ae0bac485568ffcJames Hsiao union dynamic_sa_contents cts; 41049359d655277c382683a6030ae0bac485568ffcJames Hsiao 42049359d655277c382683a6030ae0bac485568ffcJames Hsiao if (ctx->direction == DIR_INBOUND) 43049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *)(ctx->sa_in))->sa_contents; 44049359d655277c382683a6030ae0bac485568ffcJames Hsiao else 45049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *)(ctx->sa_out))->sa_contents; 46049359d655277c382683a6030ae0bac485568ffcJames Hsiao offset = cts.bf.key_size 47049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.inner_size 48049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.outer_size 49049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.spi 50049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num0 51049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num1 52049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask0 53049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask1 54049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask2 55049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask3; 56049359d655277c382683a6030ae0bac485568ffcJames Hsiao 57049359d655277c382683a6030ae0bac485568ffcJames Hsiao return sizeof(struct dynamic_sa_ctl) + offset * 4; 58049359d655277c382683a6030ae0bac485568ffcJames Hsiao} 59049359d655277c382683a6030ae0bac485568ffcJames Hsiao 60049359d655277c382683a6030ae0bac485568ffcJames Hsiaou32 get_dynamic_sa_offset_state_ptr_field(struct crypto4xx_ctx *ctx) 61049359d655277c382683a6030ae0bac485568ffcJames Hsiao{ 62049359d655277c382683a6030ae0bac485568ffcJames Hsiao u32 offset; 63049359d655277c382683a6030ae0bac485568ffcJames Hsiao union dynamic_sa_contents cts; 64049359d655277c382683a6030ae0bac485568ffcJames Hsiao 65049359d655277c382683a6030ae0bac485568ffcJames Hsiao if (ctx->direction == DIR_INBOUND) 66049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents; 67049359d655277c382683a6030ae0bac485568ffcJames Hsiao else 68049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents; 69049359d655277c382683a6030ae0bac485568ffcJames Hsiao offset = cts.bf.key_size 70049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.inner_size 71049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.outer_size 72049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.spi 73049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num0 74049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num1 75049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask0 76049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask1 77049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask2 78049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.seq_num_mask3 79049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.iv0 80049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.iv1 81049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.iv2 82049359d655277c382683a6030ae0bac485568ffcJames Hsiao + cts.bf.iv3; 83049359d655277c382683a6030ae0bac485568ffcJames Hsiao 84049359d655277c382683a6030ae0bac485568ffcJames Hsiao return sizeof(struct dynamic_sa_ctl) + offset * 4; 85049359d655277c382683a6030ae0bac485568ffcJames Hsiao} 86049359d655277c382683a6030ae0bac485568ffcJames Hsiao 87049359d655277c382683a6030ae0bac485568ffcJames Hsiaou32 get_dynamic_sa_iv_size(struct crypto4xx_ctx *ctx) 88049359d655277c382683a6030ae0bac485568ffcJames Hsiao{ 89049359d655277c382683a6030ae0bac485568ffcJames Hsiao union dynamic_sa_contents cts; 90049359d655277c382683a6030ae0bac485568ffcJames Hsiao 91049359d655277c382683a6030ae0bac485568ffcJames Hsiao if (ctx->direction == DIR_INBOUND) 92049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents; 93049359d655277c382683a6030ae0bac485568ffcJames Hsiao else 94049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents; 95049359d655277c382683a6030ae0bac485568ffcJames Hsiao return (cts.bf.iv0 + cts.bf.iv1 + cts.bf.iv2 + cts.bf.iv3) * 4; 96049359d655277c382683a6030ae0bac485568ffcJames Hsiao} 97049359d655277c382683a6030ae0bac485568ffcJames Hsiao 98049359d655277c382683a6030ae0bac485568ffcJames Hsiaou32 get_dynamic_sa_offset_key_field(struct crypto4xx_ctx *ctx) 99049359d655277c382683a6030ae0bac485568ffcJames Hsiao{ 100049359d655277c382683a6030ae0bac485568ffcJames Hsiao union dynamic_sa_contents cts; 101049359d655277c382683a6030ae0bac485568ffcJames Hsiao 102049359d655277c382683a6030ae0bac485568ffcJames Hsiao if (ctx->direction == DIR_INBOUND) 103049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents; 104049359d655277c382683a6030ae0bac485568ffcJames Hsiao else 105049359d655277c382683a6030ae0bac485568ffcJames Hsiao cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents; 106049359d655277c382683a6030ae0bac485568ffcJames Hsiao 107049359d655277c382683a6030ae0bac485568ffcJames Hsiao return sizeof(struct dynamic_sa_ctl); 108049359d655277c382683a6030ae0bac485568ffcJames Hsiao} 109