linux/drivers/crypto/amcc/crypto4xx_sa.c
<<
>>
Prefs
   1/**
   2 * AMCC SoC PPC4xx Crypto Driver
   3 *
   4 * Copyright (c) 2008 Applied Micro Circuits Corporation.
   5 * All rights reserved. James Hsiao <jhsiao@amcc.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * @file crypto4xx_sa.c
  18 *
  19 * This file implements the security context
  20 * assoicate format.
  21 */
  22#include <linux/kernel.h>
  23#include <linux/module.h>
  24#include <linux/moduleparam.h>
  25#include <linux/mod_devicetable.h>
  26#include <linux/interrupt.h>
  27#include <linux/spinlock_types.h>
  28#include <linux/highmem.h>
  29#include <linux/scatterlist.h>
  30#include <linux/crypto.h>
  31#include <crypto/algapi.h>
  32#include <crypto/des.h>
  33#include "crypto4xx_reg_def.h"
  34#include "crypto4xx_sa.h"
  35#include "crypto4xx_core.h"
  36
  37u32 get_dynamic_sa_offset_iv_field(struct crypto4xx_ctx *ctx)
  38{
  39        u32 offset;
  40        union dynamic_sa_contents cts;
  41
  42        if (ctx->direction == DIR_INBOUND)
  43                cts.w = ((struct dynamic_sa_ctl *)(ctx->sa_in))->sa_contents;
  44        else
  45                cts.w = ((struct dynamic_sa_ctl *)(ctx->sa_out))->sa_contents;
  46        offset = cts.bf.key_size
  47                + cts.bf.inner_size
  48                + cts.bf.outer_size
  49                + cts.bf.spi
  50                + cts.bf.seq_num0
  51                + cts.bf.seq_num1
  52                + cts.bf.seq_num_mask0
  53                + cts.bf.seq_num_mask1
  54                + cts.bf.seq_num_mask2
  55                + cts.bf.seq_num_mask3;
  56
  57        return sizeof(struct dynamic_sa_ctl) + offset * 4;
  58}
  59
  60u32 get_dynamic_sa_offset_state_ptr_field(struct crypto4xx_ctx *ctx)
  61{
  62        u32 offset;
  63        union dynamic_sa_contents cts;
  64
  65        if (ctx->direction == DIR_INBOUND)
  66                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents;
  67        else
  68                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents;
  69        offset = cts.bf.key_size
  70                + cts.bf.inner_size
  71                + cts.bf.outer_size
  72                + cts.bf.spi
  73                + cts.bf.seq_num0
  74                + cts.bf.seq_num1
  75                + cts.bf.seq_num_mask0
  76                + cts.bf.seq_num_mask1
  77                + cts.bf.seq_num_mask2
  78                + cts.bf.seq_num_mask3
  79                + cts.bf.iv0
  80                + cts.bf.iv1
  81                + cts.bf.iv2
  82                + cts.bf.iv3;
  83
  84        return sizeof(struct dynamic_sa_ctl) + offset * 4;
  85}
  86
  87u32 get_dynamic_sa_iv_size(struct crypto4xx_ctx *ctx)
  88{
  89        union dynamic_sa_contents cts;
  90
  91        if (ctx->direction == DIR_INBOUND)
  92                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents;
  93        else
  94                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents;
  95        return (cts.bf.iv0 + cts.bf.iv1 + cts.bf.iv2 + cts.bf.iv3) * 4;
  96}
  97
  98u32 get_dynamic_sa_offset_key_field(struct crypto4xx_ctx *ctx)
  99{
 100        union dynamic_sa_contents cts;
 101
 102        if (ctx->direction == DIR_INBOUND)
 103                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_in)->sa_contents;
 104        else
 105                cts.w = ((struct dynamic_sa_ctl *) ctx->sa_out)->sa_contents;
 106
 107        return sizeof(struct dynamic_sa_ctl);
 108}
 109