Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/crypto/amcc/crypto4xx_sa.c
15111 views
1
/**
2
* AMCC SoC PPC4xx Crypto Driver
3
*
4
* Copyright (c) 2008 Applied Micro Circuits Corporation.
5
* All rights reserved. James Hsiao <[email protected]>
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
* associate 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
37
u32 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
60
u32 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
87
u32 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
98
u32 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
110