Commit bd52f1c2 authored by Cristian Stoica's avatar Cristian Stoica Committed by Herbert Xu

crypto: caam - fix offset field in hw sg entries

The offset field is 13 bits wide; make sure we don't overwrite more than
that in the caam hardware scatter gather structure.
Signed-off-by: default avatarCristian Stoica <cristian.stoica@freescale.com>
Signed-off-by: default avatarHoria Geantă <horia.geanta@nxp.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent d54fc90c
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#define SEC4_SG_BPID_MASK 0x000000ff #define SEC4_SG_BPID_MASK 0x000000ff
#define SEC4_SG_BPID_SHIFT 16 #define SEC4_SG_BPID_SHIFT 16
#define SEC4_SG_LEN_MASK 0x3fffffff /* Excludes EXT and FINAL */ #define SEC4_SG_LEN_MASK 0x3fffffff /* Excludes EXT and FINAL */
#define SEC4_SG_OFFS_MASK 0x00001fff #define SEC4_SG_OFFSET_MASK 0x00001fff
struct sec4_sg_entry { struct sec4_sg_entry {
#ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX #ifdef CONFIG_CRYPTO_DEV_FSL_CAAM_IMX
......
...@@ -11,12 +11,12 @@ struct sec4_sg_entry; ...@@ -11,12 +11,12 @@ struct sec4_sg_entry;
* convert single dma address to h/w link table format * convert single dma address to h/w link table format
*/ */
static inline void dma_to_sec4_sg_one(struct sec4_sg_entry *sec4_sg_ptr, static inline void dma_to_sec4_sg_one(struct sec4_sg_entry *sec4_sg_ptr,
dma_addr_t dma, u32 len, u32 offset) dma_addr_t dma, u32 len, u16 offset)
{ {
sec4_sg_ptr->ptr = dma; sec4_sg_ptr->ptr = dma;
sec4_sg_ptr->len = len; sec4_sg_ptr->len = len;
sec4_sg_ptr->buf_pool_id = 0; sec4_sg_ptr->buf_pool_id = 0;
sec4_sg_ptr->offset = offset; sec4_sg_ptr->offset = offset & SEC4_SG_OFFSET_MASK;
#ifdef DEBUG #ifdef DEBUG
print_hex_dump(KERN_ERR, "sec4_sg_ptr@: ", print_hex_dump(KERN_ERR, "sec4_sg_ptr@: ",
DUMP_PREFIX_ADDRESS, 16, 4, sec4_sg_ptr, DUMP_PREFIX_ADDRESS, 16, 4, sec4_sg_ptr,
...@@ -30,7 +30,7 @@ static inline void dma_to_sec4_sg_one(struct sec4_sg_entry *sec4_sg_ptr, ...@@ -30,7 +30,7 @@ static inline void dma_to_sec4_sg_one(struct sec4_sg_entry *sec4_sg_ptr,
*/ */
static inline struct sec4_sg_entry * static inline struct sec4_sg_entry *
sg_to_sec4_sg(struct scatterlist *sg, int sg_count, sg_to_sec4_sg(struct scatterlist *sg, int sg_count,
struct sec4_sg_entry *sec4_sg_ptr, u32 offset) struct sec4_sg_entry *sec4_sg_ptr, u16 offset)
{ {
while (sg_count) { while (sg_count) {
dma_to_sec4_sg_one(sec4_sg_ptr, sg_dma_address(sg), dma_to_sec4_sg_one(sec4_sg_ptr, sg_dma_address(sg),
...@@ -48,7 +48,7 @@ sg_to_sec4_sg(struct scatterlist *sg, int sg_count, ...@@ -48,7 +48,7 @@ sg_to_sec4_sg(struct scatterlist *sg, int sg_count,
*/ */
static inline void sg_to_sec4_sg_last(struct scatterlist *sg, int sg_count, static inline void sg_to_sec4_sg_last(struct scatterlist *sg, int sg_count,
struct sec4_sg_entry *sec4_sg_ptr, struct sec4_sg_entry *sec4_sg_ptr,
u32 offset) u16 offset)
{ {
sec4_sg_ptr = sg_to_sec4_sg(sg, sg_count, sec4_sg_ptr, offset); sec4_sg_ptr = sg_to_sec4_sg(sg, sg_count, sec4_sg_ptr, offset);
sec4_sg_ptr->len |= SEC4_SG_LEN_FIN; sec4_sg_ptr->len |= SEC4_SG_LEN_FIN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment