Skip to content

Commit 3d04158

Browse files
montjoieherbertx
authored andcommitted
crypto: amlogic - enable working on big endian kernel
On big endian kernel, the GXL crypto driver does not works. This patch do the necessary modification to permit it to work on BE kernel (removing bitfield and adds some cpu_to_le32). Fixes: 48fe583 ("crypto: amlogic - Add crypto accelerator for amlogic GXL") Signed-off-by: Corentin Labbe <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 93c7f4d commit 3d04158

File tree

2 files changed

+34
-43
lines changed

2 files changed

+34
-43
lines changed

drivers/crypto/amlogic/amlogic-gxl-cipher.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ static int meson_cipher(struct skcipher_request *areq)
101101
unsigned int keyivlen, ivsize, offset, tloffset;
102102
dma_addr_t phykeyiv;
103103
void *backup_iv = NULL, *bkeyiv;
104+
__le32 v;
104105

105106
algt = container_of(alg, struct meson_alg_template, alg.skcipher);
106107

@@ -165,11 +166,11 @@ static int meson_cipher(struct skcipher_request *areq)
165166
desc = &mc->chanlist[flow].tl[tloffset];
166167
memset(desc, 0, sizeof(struct meson_desc));
167168
todo = min(keyivlen - eat, 16u);
168-
desc->t_src = phykeyiv + i * 16;
169-
desc->t_dst = i * 16;
170-
desc->len = 16;
171-
desc->mode = MODE_KEY;
172-
desc->owner = 1;
169+
desc->t_src = cpu_to_le32(phykeyiv + i * 16);
170+
desc->t_dst = cpu_to_le32(i * 16);
171+
v = (MODE_KEY << 20) | DESC_OWN | 16;
172+
desc->t_status = cpu_to_le32(v);
173+
173174
eat += todo;
174175
i++;
175176
tloffset++;
@@ -208,18 +209,17 @@ static int meson_cipher(struct skcipher_request *areq)
208209
desc = &mc->chanlist[flow].tl[tloffset];
209210
memset(desc, 0, sizeof(struct meson_desc));
210211

211-
desc->t_src = sg_dma_address(src_sg);
212-
desc->t_dst = sg_dma_address(dst_sg);
212+
desc->t_src = cpu_to_le32(sg_dma_address(src_sg));
213+
desc->t_dst = cpu_to_le32(sg_dma_address(dst_sg));
213214
todo = min(len, sg_dma_len(src_sg));
214-
desc->owner = 1;
215-
desc->len = todo;
216-
desc->mode = op->keymode;
217-
desc->op_mode = algt->blockmode;
218-
desc->enc = rctx->op_dir;
215+
v = (op->keymode << 20) | DESC_OWN | todo | (algt->blockmode << 26);
216+
if (rctx->op_dir)
217+
v |= DESC_ENCRYPTION;
219218
len -= todo;
220219

221220
if (!sg_next(src_sg))
222-
desc->eoc = 1;
221+
v |= DESC_LAST;
222+
desc->t_status = cpu_to_le32(v);
223223
tloffset++;
224224
src_sg = sg_next(src_sg);
225225
dst_sg = sg_next(dst_sg);

drivers/crypto/amlogic/amlogic-gxl.h

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,43 +26,34 @@
2626

2727
#define MAXDESC 64
2828

29+
#define DESC_LAST BIT(18)
30+
#define DESC_ENCRYPTION BIT(28)
31+
#define DESC_OWN BIT(31)
32+
2933
/*
3034
* struct meson_desc - Descriptor for DMA operations
3135
* Note that without datasheet, some are unknown
32-
* @len: length of data to operate
33-
* @irq: Ignored by hardware
34-
* @eoc: End of descriptor
35-
* @loop: Unknown
36-
* @mode: Type of algorithm (AES, SHA)
37-
* @begin: Unknown
38-
* @end: Unknown
39-
* @op_mode: Blockmode (CBC, ECB)
40-
* @block: Unknown
41-
* @error: Unknown
42-
* @owner: owner of the descriptor, 1 own by HW
36+
* @t_status: Descriptor of the cipher operation (see description below)
4337
* @t_src: Physical address of data to read
4438
* @t_dst: Physical address of data to write
39+
* t_status is segmented like this:
40+
* @len: 0-16 length of data to operate
41+
* @irq: 17 Ignored by hardware
42+
* @eoc: 18 End means the descriptor is the last
43+
* @loop: 19 Unknown
44+
* @mode: 20-23 Type of algorithm (AES, SHA)
45+
* @begin: 24 Unknown
46+
* @end: 25 Unknown
47+
* @op_mode: 26-27 Blockmode (CBC, ECB)
48+
* @enc: 28 0 means decryption, 1 is for encryption
49+
* @block: 29 Unknown
50+
* @error: 30 Unknown
51+
* @owner: 31 owner of the descriptor, 1 own by HW
4552
*/
4653
struct meson_desc {
47-
union {
48-
u32 t_status;
49-
struct {
50-
u32 len:17;
51-
u32 irq:1;
52-
u32 eoc:1;
53-
u32 loop:1;
54-
u32 mode:4;
55-
u32 begin:1;
56-
u32 end:1;
57-
u32 op_mode:2;
58-
u32 enc:1;
59-
u32 block:1;
60-
u32 error:1;
61-
u32 owner:1;
62-
};
63-
};
64-
u32 t_src;
65-
u32 t_dst;
54+
__le32 t_status;
55+
__le32 t_src;
56+
__le32 t_dst;
6657
};
6758

6859
/*

0 commit comments

Comments
 (0)