Skip to content

Commit d00146f

Browse files
committed
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 <daniel.baluta@nxp.com>
1 parent 6262b88 commit d00146f

File tree

11 files changed

+39
-33
lines changed

11 files changed

+39
-33
lines changed

sound/soc/sof/hw-spi.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
* Memory copy.
3737
*/
3838

39-
static void spi_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest,
40-
size_t size)
39+
static void spi_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset,
40+
void *dest, size_t size)
4141
{
4242
u8 *buf;
4343
int ret;
@@ -62,8 +62,8 @@ static void spi_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest,
6262
}
6363
}
6464

65-
static void spi_block_write(struct snd_sof_dev *sdev, u32 offset, void *src,
66-
size_t size)
65+
static void spi_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset,
66+
void *src, size_t size)
6767
{
6868
int ret;
6969
u8 *buf;

sound/soc/sof/intel/bdw.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,8 @@ static int bdw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
423423
return 0;
424424

425425
/* copy data from the DSP FW ready offset */
426-
sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready));
426+
sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready,
427+
sizeof(*fw_ready));
427428

428429
snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset,
429430
fw_ready->dspbox_size,

sound/soc/sof/intel/byt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,8 @@ static int byt_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
204204
return 0;
205205

206206
/* copy data from the DSP FW ready offset */
207-
sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready));
207+
sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready,
208+
sizeof(*fw_ready));
208209

209210
snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset,
210211
fw_ready->dspbox_size,

sound/soc/sof/intel/hda-ipc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,8 @@ int hda_dsp_ipc_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
370370
return 0;
371371

372372
/* copy data from the DSP FW ready offset */
373-
sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready));
373+
sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready,
374+
sizeof(*fw_ready));
374375

375376
/* make sure ABI version is compatible */
376377
ret = snd_sof_ipc_valid(sdev);

sound/soc/sof/intel/hda.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,16 @@ static void hda_dsp_get_registers(struct snd_sof_dev *sdev,
105105
u32 *stack, size_t stack_words)
106106
{
107107
/* first read registers */
108-
sof_block_read(sdev, sdev->dsp_oops_offset, xoops, sizeof(*xoops));
108+
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset, xoops,
109+
sizeof(*xoops));
109110

110111
/* then get panic info */
111-
sof_block_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops),
112-
panic_info, sizeof(*panic_info));
112+
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset +
113+
sizeof(*xoops), panic_info, sizeof(*panic_info));
113114

114115
/* then get the stack */
115-
sof_block_read(sdev, sdev->dsp_oops_offset + sizeof(*xoops) +
116-
sizeof(*panic_info), stack,
116+
sof_block_read(sdev, sdev->mmio_bar, sdev->dsp_oops_offset +
117+
sizeof(*xoops) + sizeof(*panic_info), stack,
117118
stack_words * sizeof(u32));
118119
}
119120

sound/soc/sof/intel/hsw.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,8 @@ static int hsw_fw_ready(struct snd_sof_dev *sdev, u32 msg_id)
424424
return 0;
425425

426426
/* copy data from the DSP FW ready offset */
427-
sof_block_read(sdev, offset, fw_ready, sizeof(*fw_ready));
427+
sof_block_read(sdev, sdev->mmio_bar, offset, fw_ready,
428+
sizeof(*fw_ready));
428429

429430
snd_sof_dsp_mailbox_init(sdev, fw_ready->dspbox_offset,
430431
fw_ready->dspbox_size,

sound/soc/sof/ipc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -627,8 +627,8 @@ int snd_sof_ipc_set_comp_data(struct snd_sof_ipc *ipc,
627627
/* read firmware volume */
628628
if (scontrol->readback_offset != 0) {
629629
/* we can read value header via mmaped region */
630-
snd_sof_dsp_block_write(sdev, scontrol->readback_offset,
631-
cdata->chanv,
630+
snd_sof_dsp_block_write(sdev, sdev->mmio_bar,
631+
scontrol->readback_offset, cdata->chanv,
632632
sizeof(struct sof_ipc_ctrl_value_chan) *
633633
cdata->num_elems);
634634

@@ -669,8 +669,8 @@ int snd_sof_ipc_get_comp_data(struct snd_sof_ipc *ipc,
669669
/* read firmware byte counters */
670670
if (scontrol->readback_offset != 0) {
671671
/* we can read values via mmaped region */
672-
snd_sof_dsp_block_read(sdev, scontrol->readback_offset,
673-
cdata->chanv,
672+
snd_sof_dsp_block_read(sdev, sdev->mmio_bar,
673+
scontrol->readback_offset, cdata->chanv,
674674
sizeof(struct sof_ipc_ctrl_value_chan) *
675675
cdata->num_elems);
676676

sound/soc/sof/loader.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 offset)
4545
return -ENOMEM;
4646

4747
/* get first header */
48-
snd_sof_dsp_block_read(sdev, offset, ext_data, sizeof(*ext_hdr));
48+
snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset, ext_data,
49+
sizeof(*ext_hdr));
4950
ext_hdr = (struct sof_ipc_ext_data_hdr *)ext_data;
5051

5152
while (ext_hdr->hdr.cmd == SOF_IPC_FW_READY) {
5253
/* read in ext structure */
5354
offset += sizeof(*ext_hdr);
54-
snd_sof_dsp_block_read(sdev, offset,
55+
snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset,
5556
ext_data + sizeof(*ext_hdr),
5657
ext_hdr->hdr.size - sizeof(*ext_hdr));
5758

@@ -77,7 +78,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 offset)
7778

7879
/* move to next header */
7980
offset += ext_hdr->hdr.size;
80-
snd_sof_dsp_block_read(sdev, offset, ext_data,
81+
snd_sof_dsp_block_read(sdev, sdev->mmio_bar, offset, ext_data,
8182
sizeof(*ext_hdr));
8283
ext_hdr = (struct sof_ipc_ext_data_hdr *)ext_data;
8384
}
@@ -146,7 +147,7 @@ int snd_sof_parse_module_memcpy(struct snd_sof_dev *sdev,
146147
block->size);
147148
return -EINVAL;
148149
}
149-
snd_sof_dsp_block_write(sdev, offset,
150+
snd_sof_dsp_block_write(sdev, sdev->mmio_bar, offset,
150151
(void *)block + sizeof(*block),
151152
block->size);
152153

sound/soc/sof/ops.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,18 +182,18 @@ static inline u64 snd_sof_dsp_read64(struct snd_sof_dev *sdev, u32 bar,
182182
}
183183

184184
/* block IO */
185-
static inline void snd_sof_dsp_block_read(struct snd_sof_dev *sdev,
185+
static inline void snd_sof_dsp_block_read(struct snd_sof_dev *sdev, u32 bar,
186186
u32 offset, void *dest, size_t bytes)
187187
{
188188
if (sof_ops(sdev)->block_read)
189-
sof_ops(sdev)->block_read(sdev, offset, dest, bytes);
189+
sof_ops(sdev)->block_read(sdev, bar, offset, dest, bytes);
190190
}
191191

192-
static inline void snd_sof_dsp_block_write(struct snd_sof_dev *sdev,
192+
static inline void snd_sof_dsp_block_write(struct snd_sof_dev *sdev, u32 bar,
193193
u32 offset, void *src, size_t bytes)
194194
{
195195
if (sof_ops(sdev)->block_write)
196-
sof_ops(sdev)->block_write(sdev, offset, src, bytes);
196+
sof_ops(sdev)->block_write(sdev, bar, offset, src, bytes);
197197
}
198198

199199
/* mailbox */

sound/soc/sof/sof-priv.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ struct snd_sof_dsp_ops {
102102
u64 (*read64)(struct snd_sof_dev *sof_dev, void __iomem *addr);
103103

104104
/* memcpy IO */
105-
void (*block_read)(struct snd_sof_dev *sof_dev,
105+
void (*block_read)(struct snd_sof_dev *sof_dev, u32 bar,
106106
u32 offset, void *dest, size_t size);
107-
void (*block_write)(struct snd_sof_dev *sof_dev,
107+
void (*block_write)(struct snd_sof_dev *sof_dev, u32 bar,
108108
u32 offset, void *src, size_t size);
109109

110110
/* doorbell */
@@ -558,9 +558,9 @@ void sof_mailbox_write(struct snd_sof_dev *sdev, u32 offset,
558558
void *message, size_t bytes);
559559
void sof_mailbox_read(struct snd_sof_dev *sdev, u32 offset,
560560
void *message, size_t bytes);
561-
void sof_block_write(struct snd_sof_dev *sdev, u32 offset, void *src,
561+
void sof_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src,
562562
size_t size);
563-
void sof_block_read(struct snd_sof_dev *sdev, u32 offset, void *dest,
563+
void sof_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest,
564564
size_t size);
565565

566566
#endif

0 commit comments

Comments
 (0)