From d00146fd8aa8d319f5618f59b61d39ccac64f776 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Thu, 17 Jan 2019 16:32:16 +0200 Subject: [PATCH] ASoC: SOF: Allow block ops from multiple bars This allows for example loading firmware that uses different memory zones for data/text sections. Signed-off-by: Daniel Baluta --- sound/soc/sof/hw-spi.c | 8 ++++---- sound/soc/sof/intel/bdw.c | 3 ++- sound/soc/sof/intel/byt.c | 3 ++- sound/soc/sof/intel/hda-ipc.c | 3 ++- sound/soc/sof/intel/hda.c | 11 ++++++----- sound/soc/sof/intel/hsw.c | 3 ++- sound/soc/sof/ipc.c | 8 ++++---- sound/soc/sof/loader.c | 9 +++++---- sound/soc/sof/ops.h | 8 ++++---- sound/soc/sof/sof-priv.h | 8 ++++---- sound/soc/sof/utils.c | 8 ++++---- 11 files changed, 39 insertions(+), 33 deletions(-) diff --git a/sound/soc/sof/hw-spi.c b/sound/soc/sof/hw-spi.c index 920540356e6e77..02dab65b2cbe1f 100644 --- a/sound/soc/sof/hw-spi.c +++ b/sound/soc/sof/hw-spi.c @@ -36,8 +36,8 @@ * Memory copy. */ -static void spi_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest, - size_t size) +static void spi_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, + void *dest, size_t size) { u8 *buf; int ret; @@ -62,8 +62,8 @@ static void spi_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest, } } -static void spi_block_write(struct snd_sof_dev *sdev, u32 offset, void *src, - size_t size) +static void spi_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, + void *src, size_t size) { int ret; u8 *buf; diff --git a/sound/soc/sof/intel/bdw.c b/sound/soc/sof/intel/bdw.c index 25e28bbef43590..f6eb51605f7a6d 100644 --- a/sound/soc/sof/intel/bdw.c +++ b/sound/soc/sof/intel/bdw.c @@ -423,7 +423,8 @@ static int bdw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) return 0; /* copy data from the DSP FW ready offset */ - sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready)); + sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready, + sizeof(*fw_ready)); snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset, fw_ready->dspbox_size, diff --git a/sound/soc/sof/intel/byt.c b/sound/soc/sof/intel/byt.c index 4d0d11a10f3dc3..a6a2dfecf820ce 100644 --- a/sound/soc/sof/intel/byt.c +++ b/sound/soc/sof/intel/byt.c @@ -204,7 +204,8 @@ static int byt_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) return 0; /* copy data from the DSP FW ready offset */ - sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready)); + sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready, + sizeof(*fw_ready)); snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset, fw_ready->dspbox_size, diff --git a/sound/soc/sof/intel/hda-ipc.c b/sound/soc/sof/intel/hda-ipc.c index 5673905046cf3f..9ddfa9e1f96868 100644 --- a/sound/soc/sof/intel/hda-ipc.c +++ b/sound/soc/sof/intel/hda-ipc.c @@ -370,7 +370,8 @@ int hda_dsp_ipc_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) return 0; /* copy data from the DSP FW ready offset */ - sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready)); + sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready, + sizeof(*fw_ready)); /* make sure ABI version is compatible */ ret = snd_sof_ipc_valid(sdev); diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c index d62ea91d3f583a..007db62cebb2e5 100644 --- a/sound/soc/sof/intel/hda.c +++ b/sound/soc/sof/intel/hda.c @@ -105,15 +105,16 @@ static void hda_dsp_get_registers(struct snd_sof_dev *sdev, u32 *stack, size_t stack_words) { /* first read registers */ - sof_block_read(sdev, sdev->dsp_oops_offset, xoops, sizeof(*xoops)); + sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset, xoops, + sizeof(*xoops)); /* then get panic info */ - sof_block_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops), - panic_info, sizeof(*panic_info)); + sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset + + sizeof(*xoops), panic_info, sizeof(*panic_info)); /* then get the stack */ - sof_block_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops) + - sizeof(*panic_info), stack, + sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset + + sizeof(*xoops) + sizeof(*panic_info), stack, stack_words * sizeof(u32)); } diff --git a/sound/soc/sof/intel/hsw.c b/sound/soc/sof/intel/hsw.c index cbffbdcf932c3e..d1c3ed9b0247d7 100644 --- a/sound/soc/sof/intel/hsw.c +++ b/sound/soc/sof/intel/hsw.c @@ -424,7 +424,8 @@ static int hsw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id) return 0; /* copy data from the DSP FW ready offset */ - sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready)); + sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready, + sizeof(*fw_ready)); snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset, fw_ready->dspbox_size, diff --git a/sound/soc/sof/ipc.c b/sound/soc/sof/ipc.c index 60bfa6a76ddc02..b2c073945423b4 100644 --- a/sound/soc/sof/ipc.c +++ b/sound/soc/sof/ipc.c @@ -627,8 +627,8 @@ int snd_sof_ipc_set_comp_data(struct snd_sof_ipc *ipc, /* read firmware volume */ if (scontrol->readback_offset != 0) { /* we can read value header via mmaped region */ - snd_sof_dsp_block_write(sdev, scontrol->readback_offset, - cdata->chanv, + snd_sof_dsp_block_write(sdev, sdev->mmio_bar, + scontrol->readback_offset, cdata->chanv, sizeof(struct sof_ipc_ctrl_value_chan) * cdata->num_elems); @@ -669,8 +669,8 @@ int snd_sof_ipc_get_comp_data(struct snd_sof_ipc *ipc, /* read firmware byte counters */ if (scontrol->readback_offset != 0) { /* we can read values via mmaped region */ - snd_sof_dsp_block_read(sdev, scontrol->readback_offset, - cdata->chanv, + snd_sof_dsp_block_read(sdev, sdev->mmio_bar, + scontrol->readback_offset, cdata->chanv, sizeof(struct sof_ipc_ctrl_value_chan) * cdata->num_elems); diff --git a/sound/soc/sof/loader.c b/sound/soc/sof/loader.c index 3362861f2795e8..6710dc00fe9e22 100644 --- a/sound/soc/sof/loader.c +++ b/sound/soc/sof/loader.c @@ -45,13 +45,14 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 offset) return -ENOMEM; /* get first header */ - snd_sof_dsp_block_read(sdev, offset, ext_data, sizeof(*ext_hdr)); + snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset, ext_data, + sizeof(*ext_hdr)); ext_hdr = (struct sof_ipc_ext_data_hdr *)ext_data; while (ext_hdr->hdr.cmd == SOF_IPC_FW_READY) { /* read in ext structure */ offset += sizeof(*ext_hdr); - snd_sof_dsp_block_read(sdev, offset, + snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset, ext_data + sizeof(*ext_hdr), ext_hdr->hdr.size - sizeof(*ext_hdr)); @@ -77,7 +78,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 offset) /* move to next header */ offset += ext_hdr->hdr.size; - snd_sof_dsp_block_read(sdev, offset, ext_data, + snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset, ext_data, sizeof(*ext_hdr)); ext_hdr = (struct sof_ipc_ext_data_hdr *)ext_data; } @@ -146,7 +147,7 @@ int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev, block->size); return -EINVAL; } - snd_sof_dsp_block_write(sdev, offset, + snd_sof_dsp_block_write(sdev, sdev->mmio_bar, offset, (void *)block + sizeof(*block), block->size); diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h index 68c340a3f3a153..2ae15025ed693c 100644 --- a/sound/soc/sof/ops.h +++ b/sound/soc/sof/ops.h @@ -182,18 +182,18 @@ static inline u64 snd_sof_dsp_read64(struct snd_sof_dev *sdev, u32 bar, } /* block IO */ -static inline void snd_sof_dsp_block_read(struct snd_sof_dev *sdev, +static inline void snd_sof_dsp_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest, size_t bytes) { if (sof_ops(sdev)->block_read) - sof_ops(sdev)->block_read(sdev, offset, dest, bytes); + sof_ops(sdev)->block_read(sdev, bar, offset, dest, bytes); } -static inline void snd_sof_dsp_block_write(struct snd_sof_dev *sdev, +static inline void snd_sof_dsp_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src, size_t bytes) { if (sof_ops(sdev)->block_write) - sof_ops(sdev)->block_write(sdev, offset, src, bytes); + sof_ops(sdev)->block_write(sdev, bar, offset, src, bytes); } /* mailbox */ diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h index 6c6f563f429643..212b79594486af 100644 --- a/sound/soc/sof/sof-priv.h +++ b/sound/soc/sof/sof-priv.h @@ -102,9 +102,9 @@ struct snd_sof_dsp_ops { u64 (*read64)(struct snd_sof_dev *sof_dev, void __iomem *addr); /* memcpy IO */ - void (*block_read)(struct snd_sof_dev *sof_dev, + void (*block_read)(struct snd_sof_dev *sof_dev, u32 bar, u32 offset, void *dest, size_t size); - void (*block_write)(struct snd_sof_dev *sof_dev, + void (*block_write)(struct snd_sof_dev *sof_dev, u32 bar, u32 offset, void *src, size_t size); /* doorbell */ @@ -558,9 +558,9 @@ void sof_mailbox_write(struct snd_sof_dev *sdev, u32 offset, void *message, size_t bytes); void sof_mailbox_read(struct snd_sof_dev *sdev, u32 offset, void *message, size_t bytes); -void sof_block_write(struct snd_sof_dev *sdev, u32 offset, void *src, +void sof_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src, size_t size); -void sof_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest, +void sof_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest, size_t size); #endif diff --git a/sound/soc/sof/utils.c b/sound/soc/sof/utils.c index 863c5a1f186250..484f57e1554a49 100644 --- a/sound/soc/sof/utils.c +++ b/sound/soc/sof/utils.c @@ -121,10 +121,10 @@ EXPORT_SYMBOL(sof_mailbox_read); * Memory copy. */ -void sof_block_write(struct snd_sof_dev *sdev, u32 offset, void *src, +void sof_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src, size_t size) { - void __iomem *dest = sdev->bar[sdev->mmio_bar] + offset; + void __iomem *dest = sdev->bar[bar] + offset; const u8 *src_byte = src; u32 affected_mask; u32 tmp = 0; @@ -152,10 +152,10 @@ void sof_block_write(struct snd_sof_dev *sdev, u32 offset, void *src, } EXPORT_SYMBOL(sof_block_write); -void sof_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest, +void sof_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest, size_t size) { - void __iomem *src = sdev->bar[sdev->mmio_bar] + offset; + void __iomem *src = sdev->bar[bar] + offset; memcpy_fromio(dest, src, size); }