tree: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git master
head: 504582e8e40b90b8f8c58783e2d1e4f6a2b71a3a
commit: a92a00f809503c6db9dac518951e060ab3d6f6ee [65/78] crypto: hisilicon - misc fix about sgl
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout a92a00f809503c6db9dac518951e060ab3d6f6ee
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=riscv
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>
All warnings (new ones prefixed by >>):
In file included from include/linux/byteorder/little_endian.h:5:0,
from arch/riscv/include/uapi/asm/byteorder.h:10,
from include/asm-generic/bitops/le.h:6,
from arch/riscv/include/asm/bitops.h:202,
from include/linux/bitops.h:19,
from include/linux/kernel.h:12,
from include/linux/list.h:9,
from include/linux/kobject.h:19,
from include/linux/device.h:16,
from include/linux/dma-mapping.h:7,
from drivers/crypto//hisilicon/sgl.c:3:
drivers/crypto//hisilicon/sgl.c: In function 'sg_map_to_hw_sg':
drivers/crypto//hisilicon/sgl.c:168:33: error: 'struct scatterlist' has no member named 'dma_length'; did you mean 'length'?
hw_sge->len = cpu_to_le32(sgl->dma_length);
^
include/uapi/linux/byteorder/little_endian.h:33:51: note: in definition of macro '__cpu_to_le32'
#define __cpu_to_le32(x) ((__force __le32)(__u32)(x))
^
>> drivers/crypto//hisilicon/sgl.c:168:16: note: in expansion of macro 'cpu_to_le32'
hw_sge->len = cpu_to_le32(sgl->dma_length);
^~~~~~~~~~~
vim +/cpu_to_le32 +168 drivers/crypto//hisilicon/sgl.c
> 3 #include <linux/dma-mapping.h>
4 #include <linux/module.h>
5 #include <linux/slab.h>
6 #include "qm.h"
7
8 #define HISI_ACC_SGL_SGE_NR_MIN 1
9 #define HISI_ACC_SGL_NR_MAX 256
10 #define HISI_ACC_SGL_ALIGN_SIZE 64
11 #define HISI_ACC_MEM_BLOCK_NR 5
12
13 struct acc_hw_sge {
14 dma_addr_t buf;
15 void *page_ctrl;
16 __le32 len;
17 __le32 pad;
18 __le32 pad0;
19 __le32 pad1;
20 };
21
22 /* use default sgl head size 64B */
23 struct hisi_acc_hw_sgl {
24 dma_addr_t next_dma;
25 __le16 entry_sum_in_chain;
26 __le16 entry_sum_in_sgl;
27 __le16 entry_length_in_sgl;
28 __le16 pad0;
29 __le64 pad1[5];
30 struct hisi_acc_hw_sgl *next;
31 struct acc_hw_sge sge_entries[];
32 } __aligned(1);
33
34 struct hisi_acc_sgl_pool {
35 struct mem_block {
36 struct hisi_acc_hw_sgl *sgl;
37 dma_addr_t sgl_dma;
38 size_t size;
39 } mem_block[HISI_ACC_MEM_BLOCK_NR];
40 u32 sgl_num_per_block;
41 u32 block_num;
42 u32 count;
43 u32 sge_nr;
44 size_t sgl_size;
45 };
46
47 /**
48 * hisi_acc_create_sgl_pool() - Create a hw sgl pool.
49 * @dev: The device which hw sgl pool belongs to.
50 * @count: Count of hisi_acc_hw_sgl in pool.
51 * @sge_nr: The count of sge in hw_sgl
52 *
53 * This function creates a hw sgl pool, after this user can get hw sgl memory
54 * from it.
55 */
56 struct hisi_acc_sgl_pool *hisi_acc_create_sgl_pool(struct device *dev,
57 u32 count, u32 sge_nr)
58 {
59 u32 sgl_size, block_size, sgl_num_per_block, block_num, remain_sgl = 0;
60 struct hisi_acc_sgl_pool *pool;
61 struct mem_block *block;
62 u32 i, j;
63
64 if (!dev || !count || !sge_nr || sge_nr > HISI_ACC_SGL_SGE_NR_MAX)
65 return ERR_PTR(-EINVAL);
66
67 sgl_size = sizeof(struct acc_hw_sge) * sge_nr +
68 sizeof(struct hisi_acc_hw_sgl);
69 block_size = PAGE_SIZE * (1 << (MAX_ORDER - 1));
70 sgl_num_per_block = block_size / sgl_size;
71 block_num = count / sgl_num_per_block;
72 remain_sgl = count % sgl_num_per_block;
73
74 if ((!remain_sgl && block_num > HISI_ACC_MEM_BLOCK_NR) ||
75 (remain_sgl > 0 && block_num > HISI_ACC_MEM_BLOCK_NR - 1))
76 return ERR_PTR(-EINVAL);
77
78 pool = kzalloc(sizeof(*pool), GFP_KERNEL);
79 if (!pool)
80 return ERR_PTR(-ENOMEM);
81 block = pool->mem_block;
82
83 for (i = 0; i < block_num; i++) {
84 block[i].sgl = dma_alloc_coherent(dev, block_size,
85 &block[i].sgl_dma,
86 GFP_KERNEL);
87 if (!block[i].sgl)
88 goto err_free_mem;
89
90 block[i].size = block_size;
91 }
92
93 if (remain_sgl > 0) {
94 block[i].sgl = dma_alloc_coherent(dev, remain_sgl * sgl_size,
95 &block[i].sgl_dma,
96 GFP_KERNEL);
97 if (!block[i].sgl)
98 goto err_free_mem;
99
100 block[i].size = remain_sgl * sgl_size;
101 }
102
103 pool->sgl_num_per_block = sgl_num_per_block;
104 pool->block_num = remain_sgl ? block_num + 1 : block_num;
105 pool->count = count;
106 pool->sgl_size = sgl_size;
107 pool->sge_nr = sge_nr;
108
109 return pool;
110
111 err_free_mem:
112 for (j = 0; j < i; j++) {
113 dma_free_coherent(dev, block_size, block[j].sgl,
114 block[j].sgl_dma);
115 memset(block + j, 0, sizeof(*block));
116 }
117 kfree(pool);
118 return ERR_PTR(-ENOMEM);
119 }
120 EXPORT_SYMBOL_GPL(hisi_acc_create_sgl_pool);
121
122 /**
123 * hisi_acc_free_sgl_pool() - Free a hw sgl pool.
124 * @dev: The device which hw sgl pool belongs to.
125 * @pool: Pointer of pool.
126 *
127 * This function frees memory of a hw sgl pool.
128 */
129 void hisi_acc_free_sgl_pool(struct device *dev, struct hisi_acc_sgl_pool *pool)
130 {
131 struct mem_block *block;
132 int i;
133
134 if (!dev || !pool)
135 return;
136
137 block = pool->mem_block;
138
139 for (i = 0; i < pool->block_num; i++)
140 dma_free_coherent(dev, block[i].size, block[i].sgl,
141 block[i].sgl_dma);
142
143 kfree(pool);
144 }
145 EXPORT_SYMBOL_GPL(hisi_acc_free_sgl_pool);
146
147 static struct hisi_acc_hw_sgl *acc_get_sgl(struct hisi_acc_sgl_pool *pool,
148 u32 index, dma_addr_t *hw_sgl_dma)
149 {
150 struct mem_block *block;
151 u32 block_index, offset;
152
153 if (!pool || !hw_sgl_dma || index >= pool->count)
154 return ERR_PTR(-EINVAL);
155
156 block = pool->mem_block;
157 block_index = index / pool->sgl_num_per_block;
158 offset = index % pool->sgl_num_per_block;
159
160 *hw_sgl_dma = block[block_index].sgl_dma + pool->sgl_size * offset;
161 return (void *)block[block_index].sgl + pool->sgl_size * offset;
162 }
163
164 static void sg_map_to_hw_sg(struct scatterlist *sgl,
165 struct acc_hw_sge *hw_sge)
166 {
167 hw_sge->buf = sgl->dma_address;
> 168 hw_sge->len = cpu_to_le32(sgl->dma_length);
169 }
170
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
On 2019/10/10 22:25, kbuild test robot wrote:
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git master
> head: 504582e8e40b90b8f8c58783e2d1e4f6a2b71a3a
> commit: a92a00f809503c6db9dac518951e060ab3d6f6ee [65/78] crypto: hisilicon - misc fix about sgl
> config: riscv-allyesconfig (attached as .config)
> compiler: riscv64-linux-gcc (GCC) 7.4.0
> reproduce:
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> git checkout a92a00f809503c6db9dac518951e060ab3d6f6ee
> # save the attached .config to linux build tree
> GCC_VERSION=7.4.0 make.cross ARCH=riscv
>
> If you fix the issue, kindly add following tag
> Reported-by: kbuild test robot <[email protected]>
>
> All warnings (new ones prefixed by >>):
>
> In file included from include/linux/byteorder/little_endian.h:5:0,
> from arch/riscv/include/uapi/asm/byteorder.h:10,
> from include/asm-generic/bitops/le.h:6,
> from arch/riscv/include/asm/bitops.h:202,
> from include/linux/bitops.h:19,
> from include/linux/kernel.h:12,
> from include/linux/list.h:9,
> from include/linux/kobject.h:19,
> from include/linux/device.h:16,
> from include/linux/dma-mapping.h:7,
> from drivers/crypto//hisilicon/sgl.c:3:
> drivers/crypto//hisilicon/sgl.c: In function 'sg_map_to_hw_sg':
> drivers/crypto//hisilicon/sgl.c:168:33: error: 'struct scatterlist' has no member named 'dma_length'; did you mean 'length'?
> hw_sge->len = cpu_to_le32(sgl->dma_length);
need select NEED_SG_DMA_LENGTH, will fix this.
> ^
> include/uapi/linux/byteorder/little_endian.h:33:51: note: in definition of macro '__cpu_to_le32'
> #define __cpu_to_le32(x) ((__force __le32)(__u32)(x))
> ^
>>> drivers/crypto//hisilicon/sgl.c:168:16: note: in expansion of macro 'cpu_to_le32'
> hw_sge->len = cpu_to_le32(sgl->dma_length);
> ^~~~~~~~~~~
>
> vim +/cpu_to_le32 +168 drivers/crypto//hisilicon/sgl.c
>
> > 3 #include <linux/dma-mapping.h>
> 4 #include <linux/module.h>
> 5 #include <linux/slab.h>
> 6 #include "qm.h"
> 7
> 8 #define HISI_ACC_SGL_SGE_NR_MIN 1
> 9 #define HISI_ACC_SGL_NR_MAX 256
> 10 #define HISI_ACC_SGL_ALIGN_SIZE 64
> 11 #define HISI_ACC_MEM_BLOCK_NR 5
> 12
> 13 struct acc_hw_sge {
> 14 dma_addr_t buf;
> 15 void *page_ctrl;
> 16 __le32 len;
> 17 __le32 pad;
> 18 __le32 pad0;
> 19 __le32 pad1;
> 20 };
> 21
> 22 /* use default sgl head size 64B */
> 23 struct hisi_acc_hw_sgl {
> 24 dma_addr_t next_dma;
> 25 __le16 entry_sum_in_chain;
> 26 __le16 entry_sum_in_sgl;
> 27 __le16 entry_length_in_sgl;
> 28 __le16 pad0;
> 29 __le64 pad1[5];
> 30 struct hisi_acc_hw_sgl *next;
> 31 struct acc_hw_sge sge_entries[];
> 32 } __aligned(1);
> 33
> 34 struct hisi_acc_sgl_pool {
> 35 struct mem_block {
> 36 struct hisi_acc_hw_sgl *sgl;
> 37 dma_addr_t sgl_dma;
> 38 size_t size;
> 39 } mem_block[HISI_ACC_MEM_BLOCK_NR];
> 40 u32 sgl_num_per_block;
> 41 u32 block_num;
> 42 u32 count;
> 43 u32 sge_nr;
> 44 size_t sgl_size;
> 45 };
> 46
> 47 /**
> 48 * hisi_acc_create_sgl_pool() - Create a hw sgl pool.
> 49 * @dev: The device which hw sgl pool belongs to.
> 50 * @count: Count of hisi_acc_hw_sgl in pool.
> 51 * @sge_nr: The count of sge in hw_sgl
> 52 *
> 53 * This function creates a hw sgl pool, after this user can get hw sgl memory
> 54 * from it.
> 55 */
> 56 struct hisi_acc_sgl_pool *hisi_acc_create_sgl_pool(struct device *dev,
> 57 u32 count, u32 sge_nr)
> 58 {
> 59 u32 sgl_size, block_size, sgl_num_per_block, block_num, remain_sgl = 0;
> 60 struct hisi_acc_sgl_pool *pool;
> 61 struct mem_block *block;
> 62 u32 i, j;
> 63
> 64 if (!dev || !count || !sge_nr || sge_nr > HISI_ACC_SGL_SGE_NR_MAX)
> 65 return ERR_PTR(-EINVAL);
> 66
> 67 sgl_size = sizeof(struct acc_hw_sge) * sge_nr +
> 68 sizeof(struct hisi_acc_hw_sgl);
> 69 block_size = PAGE_SIZE * (1 << (MAX_ORDER - 1));
> 70 sgl_num_per_block = block_size / sgl_size;
> 71 block_num = count / sgl_num_per_block;
> 72 remain_sgl = count % sgl_num_per_block;
> 73
> 74 if ((!remain_sgl && block_num > HISI_ACC_MEM_BLOCK_NR) ||
> 75 (remain_sgl > 0 && block_num > HISI_ACC_MEM_BLOCK_NR - 1))
> 76 return ERR_PTR(-EINVAL);
> 77
> 78 pool = kzalloc(sizeof(*pool), GFP_KERNEL);
> 79 if (!pool)
> 80 return ERR_PTR(-ENOMEM);
> 81 block = pool->mem_block;
> 82
> 83 for (i = 0; i < block_num; i++) {
> 84 block[i].sgl = dma_alloc_coherent(dev, block_size,
> 85 &block[i].sgl_dma,
> 86 GFP_KERNEL);
> 87 if (!block[i].sgl)
> 88 goto err_free_mem;
> 89
> 90 block[i].size = block_size;
> 91 }
> 92
> 93 if (remain_sgl > 0) {
> 94 block[i].sgl = dma_alloc_coherent(dev, remain_sgl * sgl_size,
> 95 &block[i].sgl_dma,
> 96 GFP_KERNEL);
> 97 if (!block[i].sgl)
> 98 goto err_free_mem;
> 99
> 100 block[i].size = remain_sgl * sgl_size;
> 101 }
> 102
> 103 pool->sgl_num_per_block = sgl_num_per_block;
> 104 pool->block_num = remain_sgl ? block_num + 1 : block_num;
> 105 pool->count = count;
> 106 pool->sgl_size = sgl_size;
> 107 pool->sge_nr = sge_nr;
> 108
> 109 return pool;
> 110
> 111 err_free_mem:
> 112 for (j = 0; j < i; j++) {
> 113 dma_free_coherent(dev, block_size, block[j].sgl,
> 114 block[j].sgl_dma);
> 115 memset(block + j, 0, sizeof(*block));
> 116 }
> 117 kfree(pool);
> 118 return ERR_PTR(-ENOMEM);
> 119 }
> 120 EXPORT_SYMBOL_GPL(hisi_acc_create_sgl_pool);
> 121
> 122 /**
> 123 * hisi_acc_free_sgl_pool() - Free a hw sgl pool.
> 124 * @dev: The device which hw sgl pool belongs to.
> 125 * @pool: Pointer of pool.
> 126 *
> 127 * This function frees memory of a hw sgl pool.
> 128 */
> 129 void hisi_acc_free_sgl_pool(struct device *dev, struct hisi_acc_sgl_pool *pool)
> 130 {
> 131 struct mem_block *block;
> 132 int i;
> 133
> 134 if (!dev || !pool)
> 135 return;
> 136
> 137 block = pool->mem_block;
> 138
> 139 for (i = 0; i < pool->block_num; i++)
> 140 dma_free_coherent(dev, block[i].size, block[i].sgl,
> 141 block[i].sgl_dma);
> 142
> 143 kfree(pool);
> 144 }
> 145 EXPORT_SYMBOL_GPL(hisi_acc_free_sgl_pool);
> 146
> 147 static struct hisi_acc_hw_sgl *acc_get_sgl(struct hisi_acc_sgl_pool *pool,
> 148 u32 index, dma_addr_t *hw_sgl_dma)
> 149 {
> 150 struct mem_block *block;
> 151 u32 block_index, offset;
> 152
> 153 if (!pool || !hw_sgl_dma || index >= pool->count)
> 154 return ERR_PTR(-EINVAL);
> 155
> 156 block = pool->mem_block;
> 157 block_index = index / pool->sgl_num_per_block;
> 158 offset = index % pool->sgl_num_per_block;
> 159
> 160 *hw_sgl_dma = block[block_index].sgl_dma + pool->sgl_size * offset;
> 161 return (void *)block[block_index].sgl + pool->sgl_size * offset;
> 162 }
> 163
> 164 static void sg_map_to_hw_sg(struct scatterlist *sgl,
> 165 struct acc_hw_sge *hw_sge)
> 166 {
> 167 hw_sge->buf = sgl->dma_address;
> > 168 hw_sge->len = cpu_to_le32(sgl->dma_length);
> 169 }
> 170
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
>