volume: don't modify read-only mailbox data

Fix a case of dropping the `const` modifier and overwriting read-only
data in the mailbox in volume_set_config().

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
Guennadi Liakhovetski 2022-10-25 15:19:22 +02:00 committed by Liam Girdwood
parent 10f6dd0d7b
commit eb712a40db
1 changed files with 14 additions and 14 deletions

View File

@ -919,7 +919,7 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id,
struct vol_data *cd = module_get_private_data(mod); struct vol_data *cd = module_get_private_data(mod);
struct module_data *md = &mod->priv; struct module_data *md = &mod->priv;
struct comp_dev *dev = mod->dev; struct comp_dev *dev = mod->dev;
struct ipc4_peak_volume_config *cdata; struct ipc4_peak_volume_config cdata;
int i, ret; int i, ret;
comp_dbg(dev, "volume_set_config()"); comp_dbg(dev, "volume_set_config()");
@ -936,19 +936,19 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id,
md->state < MODULE_INITIALIZED) md->state < MODULE_INITIALIZED)
return 0; return 0;
cdata = (struct ipc4_peak_volume_config *)ASSUME_ALIGNED(fragment, 8); cdata = *(const struct ipc4_peak_volume_config *)fragment;
cdata->target_volume = convert_volume_ipc4_to_ipc3(dev, cdata->target_volume); cdata.target_volume = convert_volume_ipc4_to_ipc3(dev, cdata.target_volume);
init_ramp(cd, cdata->curve_duration, cdata->target_volume); init_ramp(cd, cdata.curve_duration, cdata.target_volume);
cd->ramp_finished = true; cd->ramp_finished = true;
switch (config_id) { switch (config_id) {
case IPC4_VOLUME: case IPC4_VOLUME:
if (cdata->channel_id == IPC4_ALL_CHANNELS_MASK) { if (cdata.channel_id == IPC4_ALL_CHANNELS_MASK) {
for (i = 0; i < mod->priv.cfg.base_cfg.audio_fmt.channels_count; i++) { for (i = 0; i < mod->priv.cfg.base_cfg.audio_fmt.channels_count; i++) {
set_volume_ipc4(cd, i, cdata->target_volume, set_volume_ipc4(cd, i, cdata.target_volume,
cdata->curve_type, cdata.curve_type,
cdata->curve_duration); cdata.curve_duration);
cd->volume[i] = cd->vol_min; cd->volume[i] = cd->vol_min;
volume_set_chan(mod, i, cd->tvolume[i], true); volume_set_chan(mod, i, cd->tvolume[i], true);
@ -956,14 +956,14 @@ static int volume_set_config(struct processing_module *mod, uint32_t config_id,
cd->ramp_finished = false; cd->ramp_finished = false;
} }
} else { } else {
set_volume_ipc4(cd, cdata->channel_id, cdata->target_volume, set_volume_ipc4(cd, cdata.channel_id, cdata.target_volume,
cdata->curve_type, cdata.curve_type,
cdata->curve_duration); cdata.curve_duration);
cd->volume[cdata->channel_id] = cd->vol_min; cd->volume[cdata.channel_id] = cd->vol_min;
volume_set_chan(mod, cdata->channel_id, cd->tvolume[cdata->channel_id], volume_set_chan(mod, cdata.channel_id, cd->tvolume[cdata.channel_id],
true); true);
if (cd->volume[cdata->channel_id] != cd->tvolume[cdata->channel_id]) if (cd->volume[cdata.channel_id] != cd->tvolume[cdata.channel_id])
cd->ramp_finished = false; cd->ramp_finished = false;
} }