* [broonie-sound:for-next 8/34] drivers/firmware/cirrus/cs_dsp.c:1211:2: warning: Value stored to 'adsp1_sizes' is never read [clang-analyzer-deadcode.DeadStores]
@ 2021-11-21 18:51 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2021-11-21 18:51 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 32845 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: David Rhodes <drhodes@opensource.cirrus.com>
CC: Mark Brown <broonie@kernel.org>
CC: Charles Keepax <ckeepax@opensource.cirrus.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
head: 626a3dfbdb5d11f92e709680135abf272057ef59
commit: bae9e13fc55cbc5ae25409385b2f1ba9187082d0 [8/34] ASoC: cs35l41: DSP Support
:::::: branch date: 3 days ago
:::::: commit date: 6 days ago
config: riscv-randconfig-c006-20211118 (attached as .config)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git/commit/?id=bae9e13fc55cbc5ae25409385b2f1ba9187082d0
git remote add broonie-sound https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
git fetch --no-tags broonie-sound for-next
git checkout bae9e13fc55cbc5ae25409385b2f1ba9187082d0
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
^~~~~~~~~~~~~~~~~~~~~~
sound/soc/img/img-spdif-in.c:742:2: note: Taking false branch
if (IS_ERR(spdif->clk_sys)) {
^
sound/soc/img/img-spdif-in.c:749:7: note: Calling 'pm_runtime_enabled'
if (!pm_runtime_enabled(&pdev->dev)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/pm_runtime.h:174:9: note: Assuming field 'disable_depth' is 0, which participates in a condition later
return !dev->power.disable_depth;
^~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/pm_runtime.h:174:2: note: Returning without writing to 'dev->power.disable_depth', which participates in a condition later
return !dev->power.disable_depth;
^
include/linux/pm_runtime.h:174:2: note: Returning the value 1, which participates in a condition later
return !dev->power.disable_depth;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/img/img-spdif-in.c:749:7: note: Returning from 'pm_runtime_enabled'
if (!pm_runtime_enabled(&pdev->dev)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/img/img-spdif-in.c:749:2: note: Taking false branch
if (!pm_runtime_enabled(&pdev->dev)) {
^
sound/soc/img/img-spdif-in.c:755:6: note: Assuming 'ret' is >= 0
if (ret < 0) {
^~~~~~~
sound/soc/img/img-spdif-in.c:755:2: note: Taking false branch
if (ret < 0) {
^
sound/soc/img/img-spdif-in.c:761:6: note: Calling 'IS_ERR'
if (IS_ERR(rst)) {
^~~~~~~~~~~
include/linux/err.h:36:9: note: Assuming the condition is false
return IS_ERR_VALUE((unsigned long)ptr);
^
include/linux/err.h:22:34: note: expanded from macro 'IS_ERR_VALUE'
#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO)
~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
include/linux/err.h:36:2: note: Returning zero, which participates in a condition later
return IS_ERR_VALUE((unsigned long)ptr);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/img/img-spdif-in.c:761:6: note: Returning from 'IS_ERR'
if (IS_ERR(rst)) {
^~~~~~~~~~~
sound/soc/img/img-spdif-in.c:761:2: note: Taking false branch
if (IS_ERR(rst)) {
^
sound/soc/img/img-spdif-in.c:775:2: note: Loop condition is false. Exiting loop
spin_lock_init(&spdif->lock);
^
include/linux/spinlock.h:329:35: note: expanded from macro 'spin_lock_init'
# define spin_lock_init(lock) \
^
sound/soc/img/img-spdif-in.c:782:2: note: The value -128 is assigned to field 'lock_release'
spdif->lock_release = -128;
^~~~~~~~~~~~~~~~~~~~~~~~~~
sound/soc/img/img-spdif-in.c:786:30: note: The result of the left shift is undefined because the left operand is negative
reg |= (spdif->lock_release << IMG_SPDIF_IN_CTL_LOCKLO_SHIFT) &
~~~~~~~~~~~~~~~~~~~ ^
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
drivers/leds/uleds.c:150:4: warning: Value stored to 'retval' is never read [clang-analyzer-deadcode.DeadStores]
retval = copy_to_user(buffer, &udev->brightness,
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/leds/uleds.c:150:4: note: Value stored to 'retval' is never read
retval = copy_to_user(buffer, &udev->brightness,
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
8 warnings generated.
Suppressed 8 warnings (8 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
8 warnings generated.
Suppressed 8 warnings (8 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
8 warnings generated.
Suppressed 8 warnings (8 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
8 warnings generated.
Suppressed 8 warnings (8 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
>> drivers/firmware/cirrus/cs_dsp.c:1211:2: warning: Value stored to 'adsp1_sizes' is never read [clang-analyzer-deadcode.DeadStores]
adsp1_sizes = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1211:2: note: Value stored to 'adsp1_sizes' is never read
adsp1_sizes = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/firmware/cirrus/cs_dsp.c:1227:2: warning: Value stored to 'adsp2_sizes' is never read [clang-analyzer-deadcode.DeadStores]
adsp2_sizes = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1227:2: note: Value stored to 'adsp2_sizes' is never read
adsp2_sizes = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/firmware/cirrus/cs_dsp.c:1312:2: warning: Value stored to 'footer' is never read [clang-analyzer-deadcode.DeadStores]
footer = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1312:2: note: Value stored to 'footer' is never read
footer = (void *)&firmware->data[pos];
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/list.h:137:13: warning: Use of memory after it is freed [clang-analyzer-unix.Malloc]
__list_del(entry->prev, entry->next);
^
drivers/firmware/cirrus/cs_dsp.c:2280:2: note: Loop condition is false. Execution continues on line 2283
list_for_each_entry(ctl, &dsp->ctl_list, list)
^
include/linux/list.h:630:2: note: expanded from macro 'list_for_each_entry'
for (pos = list_first_entry(head, typeof(*pos), member); \
^
drivers/firmware/cirrus/cs_dsp.c:2283:2: note: Calling 'cs_dsp_free_alg_regions'
cs_dsp_free_alg_regions(dsp);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1592:2: note: Loop condition is true. Entering loop body
while (!list_empty(&dsp->alg_regions)) {
^
drivers/firmware/cirrus/cs_dsp.c:1597:3: note: Memory is released
kfree(alg_region);
^~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1592:2: note: Loop condition is true. Entering loop body
while (!list_empty(&dsp->alg_regions)) {
^
drivers/firmware/cirrus/cs_dsp.c:1596:3: note: Calling 'list_del'
list_del(&alg_region->list);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/list.h:148:2: note: Calling '__list_del_entry'
__list_del_entry(entry);
^~~~~~~~~~~~~~~~~~~~~~~
include/linux/list.h:134:6: note: Assuming the condition is false
if (!__list_del_entry_valid(entry))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/list.h:134:2: note: Taking false branch
if (!__list_del_entry_valid(entry))
^
include/linux/list.h:137:13: note: Use of memory after it is freed
__list_del(entry->prev, entry->next);
^~~~~~~~~~~
include/linux/list.h:149:14: warning: Use of memory after it is freed [clang-analyzer-unix.Malloc]
entry->next = LIST_POISON1;
^
drivers/firmware/cirrus/cs_dsp.c:2280:2: note: Loop condition is false. Execution continues on line 2283
list_for_each_entry(ctl, &dsp->ctl_list, list)
^
include/linux/list.h:630:2: note: expanded from macro 'list_for_each_entry'
for (pos = list_first_entry(head, typeof(*pos), member); \
^
drivers/firmware/cirrus/cs_dsp.c:2283:2: note: Calling 'cs_dsp_free_alg_regions'
cs_dsp_free_alg_regions(dsp);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1592:2: note: Loop condition is true. Entering loop body
while (!list_empty(&dsp->alg_regions)) {
^
drivers/firmware/cirrus/cs_dsp.c:1597:3: note: Memory is released
kfree(alg_region);
^~~~~~~~~~~~~~~~~
drivers/firmware/cirrus/cs_dsp.c:1592:2: note: Loop condition is true. Entering loop body
while (!list_empty(&dsp->alg_regions)) {
^
drivers/firmware/cirrus/cs_dsp.c:1596:3: note: Calling 'list_del'
list_del(&alg_region->list);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/list.h:149:14: note: Use of memory after it is freed
entry->next = LIST_POISON1;
~~~~~~~~~~~ ^
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
drivers/nvme/target/fcloop.c:1226:3: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
ret = -EINVAL;
^ ~~~~~~~
drivers/nvme/target/fcloop.c:1226:3: note: Value stored to 'ret' is never read
ret = -EINVAL;
^ ~~~~~~~
Suppressed 8 warnings (8 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
6 warnings generated.
Suppressed 6 warnings (6 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
5 warnings generated.
Suppressed 5 warnings (5 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
vim +/adsp1_sizes +1211 drivers/firmware/cirrus/cs_dsp.c
f6bc909e7673c3 Simon Trimmer 2021-09-13 1203
f6bc909e7673c3 Simon Trimmer 2021-09-13 1204 static unsigned int cs_dsp_adsp1_parse_sizes(struct cs_dsp *dsp,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1205 const char * const file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1206 unsigned int pos,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1207 const struct firmware *firmware)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1208 {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1209 const struct wmfw_adsp1_sizes *adsp1_sizes;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1210
f6bc909e7673c3 Simon Trimmer 2021-09-13 @1211 adsp1_sizes = (void *)&firmware->data[pos];
f6bc909e7673c3 Simon Trimmer 2021-09-13 1212
f6bc909e7673c3 Simon Trimmer 2021-09-13 1213 cs_dsp_dbg(dsp, "%s: %d DM, %d PM, %d ZM\n", file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1214 le32_to_cpu(adsp1_sizes->dm), le32_to_cpu(adsp1_sizes->pm),
f6bc909e7673c3 Simon Trimmer 2021-09-13 1215 le32_to_cpu(adsp1_sizes->zm));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1216
f6bc909e7673c3 Simon Trimmer 2021-09-13 1217 return pos + sizeof(*adsp1_sizes);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1218 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1219
f6bc909e7673c3 Simon Trimmer 2021-09-13 1220 static unsigned int cs_dsp_adsp2_parse_sizes(struct cs_dsp *dsp,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1221 const char * const file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1222 unsigned int pos,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1223 const struct firmware *firmware)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1224 {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1225 const struct wmfw_adsp2_sizes *adsp2_sizes;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1226
f6bc909e7673c3 Simon Trimmer 2021-09-13 @1227 adsp2_sizes = (void *)&firmware->data[pos];
f6bc909e7673c3 Simon Trimmer 2021-09-13 1228
f6bc909e7673c3 Simon Trimmer 2021-09-13 1229 cs_dsp_dbg(dsp, "%s: %d XM, %d YM %d PM, %d ZM\n", file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1230 le32_to_cpu(adsp2_sizes->xm), le32_to_cpu(adsp2_sizes->ym),
f6bc909e7673c3 Simon Trimmer 2021-09-13 1231 le32_to_cpu(adsp2_sizes->pm), le32_to_cpu(adsp2_sizes->zm));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1232
f6bc909e7673c3 Simon Trimmer 2021-09-13 1233 return pos + sizeof(*adsp2_sizes);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1234 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1235
f6bc909e7673c3 Simon Trimmer 2021-09-13 1236 static bool cs_dsp_validate_version(struct cs_dsp *dsp, unsigned int version)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1237 {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1238 switch (version) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1239 case 0:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1240 cs_dsp_warn(dsp, "Deprecated file format %d\n", version);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1241 return true;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1242 case 1:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1243 case 2:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1244 return true;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1245 default:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1246 return false;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1247 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1248 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1249
f6bc909e7673c3 Simon Trimmer 2021-09-13 1250 static bool cs_dsp_halo_validate_version(struct cs_dsp *dsp, unsigned int version)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1251 {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1252 switch (version) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1253 case 3:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1254 return true;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1255 default:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1256 return false;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1257 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1258 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1259
f6bc909e7673c3 Simon Trimmer 2021-09-13 1260 static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1261 const char *file)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1262 {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1263 LIST_HEAD(buf_list);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1264 struct regmap *regmap = dsp->regmap;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1265 unsigned int pos = 0;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1266 const struct wmfw_header *header;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1267 const struct wmfw_adsp1_sizes *adsp1_sizes;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1268 const struct wmfw_footer *footer;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1269 const struct wmfw_region *region;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1270 const struct cs_dsp_region *mem;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1271 const char *region_name;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1272 char *text = NULL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1273 struct cs_dsp_buf *buf;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1274 unsigned int reg;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1275 int regions = 0;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1276 int ret, offset, type;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1277
f6bc909e7673c3 Simon Trimmer 2021-09-13 1278 ret = -EINVAL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1279
f6bc909e7673c3 Simon Trimmer 2021-09-13 1280 pos = sizeof(*header) + sizeof(*adsp1_sizes) + sizeof(*footer);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1281 if (pos >= firmware->size) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1282 cs_dsp_err(dsp, "%s: file too short, %zu bytes\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1283 file, firmware->size);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1284 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1285 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1286
f6bc909e7673c3 Simon Trimmer 2021-09-13 1287 header = (void *)&firmware->data[0];
f6bc909e7673c3 Simon Trimmer 2021-09-13 1288
f6bc909e7673c3 Simon Trimmer 2021-09-13 1289 if (memcmp(&header->magic[0], "WMFW", 4) != 0) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1290 cs_dsp_err(dsp, "%s: invalid magic\n", file);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1291 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1292 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1293
f6bc909e7673c3 Simon Trimmer 2021-09-13 1294 if (!dsp->ops->validate_version(dsp, header->ver)) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1295 cs_dsp_err(dsp, "%s: unknown file format %d\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1296 file, header->ver);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1297 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1298 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1299
f6bc909e7673c3 Simon Trimmer 2021-09-13 1300 cs_dsp_info(dsp, "Firmware version: %d\n", header->ver);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1301 dsp->fw_ver = header->ver;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1302
f6bc909e7673c3 Simon Trimmer 2021-09-13 1303 if (header->core != dsp->type) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1304 cs_dsp_err(dsp, "%s: invalid core %d != %d\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1305 file, header->core, dsp->type);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1306 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1307 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1308
f6bc909e7673c3 Simon Trimmer 2021-09-13 1309 pos = sizeof(*header);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1310 pos = dsp->ops->parse_sizes(dsp, file, pos, firmware);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1311
f6bc909e7673c3 Simon Trimmer 2021-09-13 @1312 footer = (void *)&firmware->data[pos];
f6bc909e7673c3 Simon Trimmer 2021-09-13 1313 pos += sizeof(*footer);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1314
f6bc909e7673c3 Simon Trimmer 2021-09-13 1315 if (le32_to_cpu(header->len) != pos) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1316 cs_dsp_err(dsp, "%s: unexpected header length %d\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1317 file, le32_to_cpu(header->len));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1318 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1319 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1320
f6bc909e7673c3 Simon Trimmer 2021-09-13 1321 cs_dsp_dbg(dsp, "%s: timestamp %llu\n", file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1322 le64_to_cpu(footer->timestamp));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1323
f6bc909e7673c3 Simon Trimmer 2021-09-13 1324 while (pos < firmware->size &&
f6bc909e7673c3 Simon Trimmer 2021-09-13 1325 sizeof(*region) < firmware->size - pos) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1326 region = (void *)&(firmware->data[pos]);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1327 region_name = "Unknown";
f6bc909e7673c3 Simon Trimmer 2021-09-13 1328 reg = 0;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1329 text = NULL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1330 offset = le32_to_cpu(region->offset) & 0xffffff;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1331 type = be32_to_cpu(region->type) & 0xff;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1332
f6bc909e7673c3 Simon Trimmer 2021-09-13 1333 switch (type) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1334 case WMFW_NAME_TEXT:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1335 region_name = "Firmware name";
f6bc909e7673c3 Simon Trimmer 2021-09-13 1336 text = kzalloc(le32_to_cpu(region->len) + 1,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1337 GFP_KERNEL);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1338 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1339 case WMFW_ALGORITHM_DATA:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1340 region_name = "Algorithm";
f6bc909e7673c3 Simon Trimmer 2021-09-13 1341 ret = cs_dsp_parse_coeff(dsp, region);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1342 if (ret != 0)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1343 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1344 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1345 case WMFW_INFO_TEXT:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1346 region_name = "Information";
f6bc909e7673c3 Simon Trimmer 2021-09-13 1347 text = kzalloc(le32_to_cpu(region->len) + 1,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1348 GFP_KERNEL);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1349 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1350 case WMFW_ABSOLUTE:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1351 region_name = "Absolute";
f6bc909e7673c3 Simon Trimmer 2021-09-13 1352 reg = offset;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1353 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1354 case WMFW_ADSP1_PM:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1355 case WMFW_ADSP1_DM:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1356 case WMFW_ADSP2_XM:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1357 case WMFW_ADSP2_YM:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1358 case WMFW_ADSP1_ZM:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1359 case WMFW_HALO_PM_PACKED:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1360 case WMFW_HALO_XM_PACKED:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1361 case WMFW_HALO_YM_PACKED:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1362 mem = cs_dsp_find_region(dsp, type);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1363 if (!mem) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1364 cs_dsp_err(dsp, "No region of type: %x\n", type);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1365 ret = -EINVAL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1366 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1367 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1368
f6bc909e7673c3 Simon Trimmer 2021-09-13 1369 region_name = cs_dsp_mem_region_name(type);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1370 reg = dsp->ops->region_to_reg(mem, offset);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1371 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1372 default:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1373 cs_dsp_warn(dsp,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1374 "%s.%d: Unknown region type %x at %d(%x)\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1375 file, regions, type, pos, pos);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1376 break;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1377 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1378
f6bc909e7673c3 Simon Trimmer 2021-09-13 1379 cs_dsp_dbg(dsp, "%s.%d: %d bytes at %d in %s\n", file,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1380 regions, le32_to_cpu(region->len), offset,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1381 region_name);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1382
f6bc909e7673c3 Simon Trimmer 2021-09-13 1383 if (le32_to_cpu(region->len) >
f6bc909e7673c3 Simon Trimmer 2021-09-13 1384 firmware->size - pos - sizeof(*region)) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1385 cs_dsp_err(dsp,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1386 "%s.%d: %s region len %d bytes exceeds file length %zu\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1387 file, regions, region_name,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1388 le32_to_cpu(region->len), firmware->size);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1389 ret = -EINVAL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1390 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1391 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1392
f6bc909e7673c3 Simon Trimmer 2021-09-13 1393 if (text) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1394 memcpy(text, region->data, le32_to_cpu(region->len));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1395 cs_dsp_info(dsp, "%s: %s\n", file, text);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1396 kfree(text);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1397 text = NULL;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1398 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1399
f6bc909e7673c3 Simon Trimmer 2021-09-13 1400 if (reg) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1401 buf = cs_dsp_buf_alloc(region->data,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1402 le32_to_cpu(region->len),
f6bc909e7673c3 Simon Trimmer 2021-09-13 1403 &buf_list);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1404 if (!buf) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1405 cs_dsp_err(dsp, "Out of memory\n");
f6bc909e7673c3 Simon Trimmer 2021-09-13 1406 ret = -ENOMEM;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1407 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1408 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1409
f6bc909e7673c3 Simon Trimmer 2021-09-13 1410 ret = regmap_raw_write_async(regmap, reg, buf->buf,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1411 le32_to_cpu(region->len));
f6bc909e7673c3 Simon Trimmer 2021-09-13 1412 if (ret != 0) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1413 cs_dsp_err(dsp,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1414 "%s.%d: Failed to write %d bytes at %d in %s: %d\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1415 file, regions,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1416 le32_to_cpu(region->len), offset,
f6bc909e7673c3 Simon Trimmer 2021-09-13 1417 region_name, ret);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1418 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1419 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1420 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1421
f6bc909e7673c3 Simon Trimmer 2021-09-13 1422 pos += le32_to_cpu(region->len) + sizeof(*region);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1423 regions++;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1424 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1425
f6bc909e7673c3 Simon Trimmer 2021-09-13 1426 ret = regmap_async_complete(regmap);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1427 if (ret != 0) {
f6bc909e7673c3 Simon Trimmer 2021-09-13 1428 cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1429 goto out_fw;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1430 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1431
f6bc909e7673c3 Simon Trimmer 2021-09-13 1432 if (pos > firmware->size)
f6bc909e7673c3 Simon Trimmer 2021-09-13 1433 cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
f6bc909e7673c3 Simon Trimmer 2021-09-13 1434 file, regions, pos - firmware->size);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1435
f6bc909e7673c3 Simon Trimmer 2021-09-13 1436 cs_dsp_debugfs_save_wmfwname(dsp, file);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1437
f6bc909e7673c3 Simon Trimmer 2021-09-13 1438 out_fw:
f6bc909e7673c3 Simon Trimmer 2021-09-13 1439 regmap_async_complete(regmap);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1440 cs_dsp_buf_free(&buf_list);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1441 kfree(text);
f6bc909e7673c3 Simon Trimmer 2021-09-13 1442
f6bc909e7673c3 Simon Trimmer 2021-09-13 1443 return ret;
f6bc909e7673c3 Simon Trimmer 2021-09-13 1444 }
f6bc909e7673c3 Simon Trimmer 2021-09-13 1445
:::::: The code at line 1211 was first introduced by commit
:::::: f6bc909e7673c30abcbdb329e7d0aa2e83c103d7 firmware: cs_dsp: add driver to support firmware loading on Cirrus Logic DSPs
:::::: TO: Simon Trimmer <simont@opensource.cirrus.com>
:::::: CC: Mark Brown <broonie@kernel.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33293 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-11-21 18:51 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-21 18:51 [broonie-sound:for-next 8/34] drivers/firmware/cirrus/cs_dsp.c:1211:2: warning: Value stored to 'adsp1_sizes' is never read [clang-analyzer-deadcode.DeadStores] kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.