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
>