Skip to content

Commit

Permalink
ASoc: TAS2781: replace beXX_to_cpup with get_unaligned_beXX for poten…
Browse files Browse the repository at this point in the history
…tially broken alignment

[ Upstream commit 1cc509e ]

Use get_unaligned_be16 instead of be16_to_cpup and get_unaligned_be32
instead of be32_to_cpup for potentially broken alignment.

Signed-off-by: Shenghao Ding <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Mark Brown <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Shenghao-Ding authored and gregkh committed Sep 12, 2024
1 parent 8fecb75 commit 4b83b20
Showing 1 changed file with 35 additions and 36 deletions.
71 changes: 35 additions & 36 deletions sound/soc/codecs/tas2781-fmwlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
#include <sound/soc.h>
#include <sound/tlv.h>
#include <sound/tas2781.h>

#include <asm/unaligned.h>

#define ERROR_PRAM_CRCCHK 0x0000000
#define ERROR_YRAM_CRCCHK 0x0000001
Expand Down Expand Up @@ -125,8 +125,7 @@ static struct tasdevice_config_info *tasdevice_add_config(
/* convert data[offset], data[offset + 1], data[offset + 2] and
* data[offset + 3] into host
*/
cfg_info->nblocks =
be32_to_cpup((__be32 *)&config_data[config_offset]);
cfg_info->nblocks = get_unaligned_be32(&config_data[config_offset]);
config_offset += 4;

/* Several kinds of dsp/algorithm firmwares can run on tas2781,
Expand Down Expand Up @@ -170,14 +169,14 @@ static struct tasdevice_config_info *tasdevice_add_config(

}
bk_da[i]->yram_checksum =
be16_to_cpup((__be16 *)&config_data[config_offset]);
get_unaligned_be16(&config_data[config_offset]);
config_offset += 2;
bk_da[i]->block_size =
be32_to_cpup((__be32 *)&config_data[config_offset]);
get_unaligned_be32(&config_data[config_offset]);
config_offset += 4;

bk_da[i]->n_subblks =
be32_to_cpup((__be32 *)&config_data[config_offset]);
get_unaligned_be32(&config_data[config_offset]);

config_offset += 4;

Expand Down Expand Up @@ -227,7 +226,7 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
}
buf = (unsigned char *)fmw->data;

fw_hdr->img_sz = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->img_sz = get_unaligned_be32(&buf[offset]);
offset += 4;
if (fw_hdr->img_sz != fmw->size) {
dev_err(tas_priv->dev,
Expand All @@ -238,9 +237,9 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
goto out;
}

fw_hdr->checksum = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->checksum = get_unaligned_be32(&buf[offset]);
offset += 4;
fw_hdr->binary_version_num = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->binary_version_num = get_unaligned_be32(&buf[offset]);
if (fw_hdr->binary_version_num < 0x103) {
dev_err(tas_priv->dev, "File version 0x%04x is too low",
fw_hdr->binary_version_num);
Expand All @@ -249,7 +248,7 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
goto out;
}
offset += 4;
fw_hdr->drv_fw_version = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->drv_fw_version = get_unaligned_be32(&buf[offset]);
offset += 8;
fw_hdr->plat_type = buf[offset];
offset += 1;
Expand Down Expand Up @@ -277,11 +276,11 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
for (i = 0; i < TASDEVICE_DEVICE_SUM; i++, offset++)
fw_hdr->devs[i] = buf[offset];

fw_hdr->nconfig = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->nconfig = get_unaligned_be32(&buf[offset]);
offset += 4;

for (i = 0; i < TASDEVICE_CONFIG_SUM; i++) {
fw_hdr->config_size[i] = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->config_size[i] = get_unaligned_be32(&buf[offset]);
offset += 4;
total_config_sz += fw_hdr->config_size[i];
}
Expand Down Expand Up @@ -330,7 +329,7 @@ static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
/* convert data[offset], data[offset + 1], data[offset + 2] and
* data[offset + 3] into host
*/
block->type = be32_to_cpup((__be32 *)&data[offset]);
block->type = get_unaligned_be32(&data[offset]);
offset += 4;

block->is_pchksum_present = data[offset];
Expand All @@ -345,10 +344,10 @@ static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
block->ychksum = data[offset];
offset++;

block->blk_size = be32_to_cpup((__be32 *)&data[offset]);
block->blk_size = get_unaligned_be32(&data[offset]);
offset += 4;

block->nr_subblocks = be32_to_cpup((__be32 *)&data[offset]);
block->nr_subblocks = get_unaligned_be32(&data[offset]);
offset += 4;

if (offset + block->blk_size > fmw->size) {
Expand Down Expand Up @@ -381,7 +380,7 @@ static int fw_parse_data_kernel(struct tasdevice_fw *tas_fmw,
offset = -EINVAL;
goto out;
}
img_data->nr_blk = be32_to_cpup((__be32 *)&data[offset]);
img_data->nr_blk = get_unaligned_be32(&data[offset]);
offset += 4;

img_data->dev_blks = kcalloc(img_data->nr_blk,
Expand Down Expand Up @@ -477,14 +476,14 @@ static int fw_parse_variable_header_kernel(
offset = -EINVAL;
goto out;
}
fw_hdr->device_family = be16_to_cpup((__be16 *)&buf[offset]);
fw_hdr->device_family = get_unaligned_be16(&buf[offset]);
if (fw_hdr->device_family != 0) {
dev_err(tas_priv->dev, "%s:not TAS device\n", __func__);
offset = -EINVAL;
goto out;
}
offset += 2;
fw_hdr->device = be16_to_cpup((__be16 *)&buf[offset]);
fw_hdr->device = get_unaligned_be16(&buf[offset]);
if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE ||
fw_hdr->device == 6) {
dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device);
Expand All @@ -502,7 +501,7 @@ static int fw_parse_variable_header_kernel(
goto out;
}

tas_fmw->nr_programs = be32_to_cpup((__be32 *)&buf[offset]);
tas_fmw->nr_programs = get_unaligned_be32(&buf[offset]);
offset += 4;

if (tas_fmw->nr_programs == 0 || tas_fmw->nr_programs >
Expand All @@ -521,14 +520,14 @@ static int fw_parse_variable_header_kernel(

for (i = 0; i < tas_fmw->nr_programs; i++) {
program = &(tas_fmw->programs[i]);
program->prog_size = be32_to_cpup((__be32 *)&buf[offset]);
program->prog_size = get_unaligned_be32(&buf[offset]);
offset += 4;
}

/* Skip the unused prog_size */
offset += 4 * (TASDEVICE_MAXPROGRAM_NUM_KERNEL - tas_fmw->nr_programs);

tas_fmw->nr_configurations = be32_to_cpup((__be32 *)&buf[offset]);
tas_fmw->nr_configurations = get_unaligned_be32(&buf[offset]);
offset += 4;

/* The max number of config in firmware greater than 4 pieces of
Expand Down Expand Up @@ -560,7 +559,7 @@ static int fw_parse_variable_header_kernel(

for (i = 0; i < tas_fmw->nr_programs; i++) {
config = &(tas_fmw->configs[i]);
config->cfg_size = be32_to_cpup((__be32 *)&buf[offset]);
config->cfg_size = get_unaligned_be32(&buf[offset]);
offset += 4;
}

Expand Down Expand Up @@ -598,7 +597,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
switch (subblk_typ) {
case TASDEVICE_CMD_SING_W: {
int i;
unsigned short len = be16_to_cpup((__be16 *)&data[2]);
unsigned short len = get_unaligned_be16(&data[2]);

subblk_offset += 2;
if (subblk_offset + 4 * len > sublocksize) {
Expand All @@ -624,7 +623,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
}
break;
case TASDEVICE_CMD_BURST: {
unsigned short len = be16_to_cpup((__be16 *)&data[2]);
unsigned short len = get_unaligned_be16(&data[2]);

subblk_offset += 2;
if (subblk_offset + 4 + len > sublocksize) {
Expand Down Expand Up @@ -665,7 +664,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
is_err = true;
break;
}
sleep_time = be16_to_cpup((__be16 *)&data[2]) * 1000;
sleep_time = get_unaligned_be16(&data[2]) * 1000;
usleep_range(sleep_time, sleep_time + 50);
subblk_offset += 2;
}
Expand Down Expand Up @@ -940,15 +939,15 @@ static int fw_parse_variable_hdr(struct tasdevice_priv

offset += len;

fw_hdr->device_family = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->device_family = get_unaligned_be32(&buf[offset]);
if (fw_hdr->device_family != 0) {
dev_err(tas_priv->dev, "%s: not TAS device\n", __func__);
offset = -EINVAL;
goto out;
}
offset += 4;

fw_hdr->device = be32_to_cpup((__be32 *)&buf[offset]);
fw_hdr->device = get_unaligned_be32(&buf[offset]);
if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE ||
fw_hdr->device == 6) {
dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device);
Expand Down Expand Up @@ -993,7 +992,7 @@ static int fw_parse_block_data(struct tasdevice_fw *tas_fmw,
offset = -EINVAL;
goto out;
}
block->type = be32_to_cpup((__be32 *)&data[offset]);
block->type = get_unaligned_be32(&data[offset]);
offset += 4;

if (tas_fmw->fw_hdr.fixed_hdr.drv_ver >= PPC_DRIVER_CRCCHK) {
Expand All @@ -1018,7 +1017,7 @@ static int fw_parse_block_data(struct tasdevice_fw *tas_fmw,
block->is_ychksum_present = 0;
}

block->nr_cmds = be32_to_cpup((__be32 *)&data[offset]);
block->nr_cmds = get_unaligned_be32(&data[offset]);
offset += 4;

n = block->nr_cmds * 4;
Expand Down Expand Up @@ -1069,7 +1068,7 @@ static int fw_parse_data(struct tasdevice_fw *tas_fmw,
goto out;
}
offset += n;
img_data->nr_blk = be16_to_cpup((__be16 *)&data[offset]);
img_data->nr_blk = get_unaligned_be16(&data[offset]);
offset += 2;

img_data->dev_blks = kcalloc(img_data->nr_blk,
Expand Down Expand Up @@ -1106,7 +1105,7 @@ static int fw_parse_program_data(struct tasdevice_priv *tas_priv,
offset = -EINVAL;
goto out;
}
tas_fmw->nr_programs = be16_to_cpup((__be16 *)&buf[offset]);
tas_fmw->nr_programs = get_unaligned_be16(&buf[offset]);
offset += 2;

if (tas_fmw->nr_programs == 0) {
Expand Down Expand Up @@ -1173,7 +1172,7 @@ static int fw_parse_configuration_data(
offset = -EINVAL;
goto out;
}
tas_fmw->nr_configurations = be16_to_cpup((__be16 *)&data[offset]);
tas_fmw->nr_configurations = get_unaligned_be16(&data[offset]);
offset += 2;

if (tas_fmw->nr_configurations == 0) {
Expand Down Expand Up @@ -1805,7 +1804,7 @@ static int fw_parse_header(struct tasdevice_priv *tas_priv,
/* Convert data[offset], data[offset + 1], data[offset + 2] and
* data[offset + 3] into host
*/
fw_fixed_hdr->fwsize = be32_to_cpup((__be32 *)&buf[offset]);
fw_fixed_hdr->fwsize = get_unaligned_be32(&buf[offset]);
offset += 4;
if (fw_fixed_hdr->fwsize != fmw->size) {
dev_err(tas_priv->dev, "File size not match, %lu %u",
Expand All @@ -1814,9 +1813,9 @@ static int fw_parse_header(struct tasdevice_priv *tas_priv,
goto out;
}
offset += 4;
fw_fixed_hdr->ppcver = be32_to_cpup((__be32 *)&buf[offset]);
fw_fixed_hdr->ppcver = get_unaligned_be32(&buf[offset]);
offset += 8;
fw_fixed_hdr->drv_ver = be32_to_cpup((__be32 *)&buf[offset]);
fw_fixed_hdr->drv_ver = get_unaligned_be32(&buf[offset]);
offset += 72;

out:
Expand Down Expand Up @@ -1858,7 +1857,7 @@ static int fw_parse_calibration_data(struct tasdevice_priv *tas_priv,
offset = -EINVAL;
goto out;
}
tas_fmw->nr_calibrations = be16_to_cpup((__be16 *)&data[offset]);
tas_fmw->nr_calibrations = get_unaligned_be16(&data[offset]);
offset += 2;

if (tas_fmw->nr_calibrations != 1) {
Expand Down

0 comments on commit 4b83b20

Please sign in to comment.