drivers/firmware/meson/meson_sm.c:168:34: sparse: sparse: incorrect type in argument 2 (different address spaces)

From: kernel test robot
Date: Thu Jun 11 2020 - 13:27:47 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: b29482fde649c72441d5478a4ea2c52c56d97a5e
commit: 8cde3c2153e8f57be884c0e73f18bc4de150e870 firmware: meson_sm: Rework driver as a proper platform driver
date: 8 months ago
config: arm64-randconfig-s031-20200611 (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.1-250-g42323db3-dirty
git checkout 8cde3c2153e8f57be884c0e73f18bc4de150e870
# save the attached .config to linux build tree
make W=1 C=1 ARCH=arm64 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)

drivers/firmware/meson/meson_sm.c:83:24: sparse: sparse: Using plain integer as NULL pointer
>> drivers/firmware/meson/meson_sm.c:168:34: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void const *q @@ got void [noderef] <asn:2> *sm_shmem_out_base @@
drivers/firmware/meson/meson_sm.c:168:34: sparse: expected void const *q
>> drivers/firmware/meson/meson_sm.c:168:34: sparse: got void [noderef] <asn:2> *sm_shmem_out_base
>> drivers/firmware/meson/meson_sm.c:204:18: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *p @@ got void [noderef] <asn:2> *sm_shmem_in_base @@
drivers/firmware/meson/meson_sm.c:204:18: sparse: expected void *p
>> drivers/firmware/meson/meson_sm.c:204:18: sparse: got void [noderef] <asn:2> *sm_shmem_in_base

vim +168 drivers/firmware/meson/meson_sm.c

76
77 static void __iomem *meson_sm_map_shmem(u32 cmd_shmem, unsigned int size)
78 {
79 u32 sm_phy_base;
80
81 sm_phy_base = __meson_sm_call(cmd_shmem, 0, 0, 0, 0, 0);
82 if (!sm_phy_base)
> 83 return 0;
84
85 return ioremap_cache(sm_phy_base, size);
86 }
87
88 /**
89 * meson_sm_call - generic SMC32 call to the secure-monitor
90 *
91 * @fw: Pointer to secure-monitor firmware
92 * @cmd_index: Index of the SMC32 function ID
93 * @ret: Returned value
94 * @arg0: SMC32 Argument 0
95 * @arg1: SMC32 Argument 1
96 * @arg2: SMC32 Argument 2
97 * @arg3: SMC32 Argument 3
98 * @arg4: SMC32 Argument 4
99 *
100 * Return: 0 on success, a negative value on error
101 */
102 int meson_sm_call(struct meson_sm_firmware *fw, unsigned int cmd_index,
103 u32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4)
104 {
105 u32 cmd, lret;
106
107 if (!fw->chip)
108 return -ENOENT;
109
110 cmd = meson_sm_get_cmd(fw->chip, cmd_index);
111 if (!cmd)
112 return -EINVAL;
113
114 lret = __meson_sm_call(cmd, arg0, arg1, arg2, arg3, arg4);
115
116 if (ret)
117 *ret = lret;
118
119 return 0;
120 }
121 EXPORT_SYMBOL(meson_sm_call);
122
123 /**
124 * meson_sm_call_read - retrieve data from secure-monitor
125 *
126 * @fw: Pointer to secure-monitor firmware
127 * @buffer: Buffer to store the retrieved data
128 * @bsize: Size of the buffer
129 * @cmd_index: Index of the SMC32 function ID
130 * @arg0: SMC32 Argument 0
131 * @arg1: SMC32 Argument 1
132 * @arg2: SMC32 Argument 2
133 * @arg3: SMC32 Argument 3
134 * @arg4: SMC32 Argument 4
135 *
136 * Return: size of read data on success, a negative value on error
137 * When 0 is returned there is no guarantee about the amount of
138 * data read and bsize bytes are copied in buffer.
139 */
140 int meson_sm_call_read(struct meson_sm_firmware *fw, void *buffer,
141 unsigned int bsize, unsigned int cmd_index, u32 arg0,
142 u32 arg1, u32 arg2, u32 arg3, u32 arg4)
143 {
144 u32 size;
145 int ret;
146
147 if (!fw->chip)
148 return -ENOENT;
149
150 if (!fw->chip->cmd_shmem_out_base)
151 return -EINVAL;
152
153 if (bsize > fw->chip->shmem_size)
154 return -EINVAL;
155
156 if (meson_sm_call(fw, cmd_index, &size, arg0, arg1, arg2, arg3, arg4) < 0)
157 return -EINVAL;
158
159 if (size > bsize)
160 return -EINVAL;
161
162 ret = size;
163
164 if (!size)
165 size = bsize;
166
167 if (buffer)
> 168 memcpy(buffer, fw->sm_shmem_out_base, size);
169
170 return ret;
171 }
172 EXPORT_SYMBOL(meson_sm_call_read);
173
174 /**
175 * meson_sm_call_write - send data to secure-monitor
176 *
177 * @fw: Pointer to secure-monitor firmware
178 * @buffer: Buffer containing data to send
179 * @size: Size of the data to send
180 * @cmd_index: Index of the SMC32 function ID
181 * @arg0: SMC32 Argument 0
182 * @arg1: SMC32 Argument 1
183 * @arg2: SMC32 Argument 2
184 * @arg3: SMC32 Argument 3
185 * @arg4: SMC32 Argument 4
186 *
187 * Return: size of sent data on success, a negative value on error
188 */
189 int meson_sm_call_write(struct meson_sm_firmware *fw, void *buffer,
190 unsigned int size, unsigned int cmd_index, u32 arg0,
191 u32 arg1, u32 arg2, u32 arg3, u32 arg4)
192 {
193 u32 written;
194
195 if (!fw->chip)
196 return -ENOENT;
197
198 if (size > fw->chip->shmem_size)
199 return -EINVAL;
200
201 if (!fw->chip->cmd_shmem_in_base)
202 return -EINVAL;
203
> 204 memcpy(fw->sm_shmem_in_base, buffer, size);
205
206 if (meson_sm_call(fw, cmd_index, &written, arg0, arg1, arg2, arg3, arg4) < 0)
207 return -EINVAL;
208
209 if (!written)
210 return -EINVAL;
211
212 return written;
213 }
214 EXPORT_SYMBOL(meson_sm_call_write);
215

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip