Skip to content

Commit 6a69b72

Browse files
Venkata-Prasad-Potturubroonie
authored andcommitted
ASoC: SOF: amd: Add support for signed fw image loading
Add support for signed firmware code bin and data bin loading for amd platforms. Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com> Link: https://lore.kernel.org/r/20230809123534.287707-2-venkataprasad.potturu@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent d0dab6b commit 6a69b72

4 files changed

Lines changed: 51 additions & 3 deletions

File tree

sound/soc/sof/amd/acp-dsp-offset.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
#define ACP_SHA_DMA_CMD_STS 0x1CC0
8888
#define ACP_SHA_DMA_ERR_STATUS 0x1CC4
8989
#define ACP_SHA_TRANSFER_BYTE_CNT 0x1CC8
90+
#define ACP_SHA_DMA_INCLUDE_HDR 0x1CCC
9091
#define ACP_SHA_PSP_ACK 0x1C74
9192

9293
#define ACP_SCRATCH_REG_0 0x10000

sound/soc/sof/amd/acp-loader.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// This file is provided under a dual BSD/GPLv2 license. When using or
44
// redistributing this file, you may do so under either license.
55
//
6-
// Copyright(c) 2021 Advanced Micro Devices, Inc.
6+
// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.
77
//
88
// Authors: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
99

@@ -158,7 +158,11 @@ int acp_dsp_pre_fw_run(struct snd_sof_dev *sdev)
158158
int ret;
159159

160160
adata = sdev->pdata->hw_pdata;
161-
size_fw = adata->fw_bin_size;
161+
162+
if (adata->signed_fw_image)
163+
size_fw = adata->fw_bin_size - ACP_FIRMWARE_SIGNATURE;
164+
else
165+
size_fw = adata->fw_bin_size;
162166

163167
page_count = PAGE_ALIGN(size_fw) >> PAGE_SHIFT;
164168
adata->fw_bin_page_count = page_count;
@@ -219,3 +223,34 @@ int acp_sof_dsp_run(struct snd_sof_dev *sdev)
219223
return 0;
220224
}
221225
EXPORT_SYMBOL_NS(acp_sof_dsp_run, SND_SOC_SOF_AMD_COMMON);
226+
227+
int acp_sof_load_signed_firmware(struct snd_sof_dev *sdev)
228+
{
229+
struct snd_sof_pdata *plat_data = sdev->pdata;
230+
struct acp_dev_data *adata = plat_data->hw_pdata;
231+
int ret;
232+
233+
ret = request_firmware(&sdev->basefw.fw, adata->fw_code_bin, sdev->dev);
234+
if (ret < 0) {
235+
dev_err(sdev->dev, "sof signed firmware code bin is missing\n");
236+
return ret;
237+
} else {
238+
dev_dbg(sdev->dev, "request_firmware %s successful\n", adata->fw_code_bin);
239+
}
240+
ret = snd_sof_dsp_block_write(sdev, SOF_FW_BLK_TYPE_IRAM, 0,
241+
(void *)sdev->basefw.fw->data, sdev->basefw.fw->size);
242+
243+
ret = request_firmware(&adata->fw_dbin, adata->fw_data_bin, sdev->dev);
244+
if (ret < 0) {
245+
dev_err(sdev->dev, "sof signed firmware data bin is missing\n");
246+
return ret;
247+
248+
} else {
249+
dev_dbg(sdev->dev, "request_firmware %s successful\n", adata->fw_data_bin);
250+
}
251+
252+
ret = snd_sof_dsp_block_write(sdev, SOF_FW_BLK_TYPE_DRAM, 0,
253+
(void *)adata->fw_dbin->data, adata->fw_dbin->size);
254+
return ret;
255+
}
256+
EXPORT_SYMBOL_NS(acp_sof_load_signed_firmware, SND_SOC_SOF_AMD_COMMON);

sound/soc/sof/amd/acp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// This file is provided under a dual BSD/GPLv2 license. When using or
44
// redistributing this file, you may do so under either license.
55
//
6-
// Copyright(c) 2021 Advanced Micro Devices, Inc. All rights reserved.
6+
// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc. All rights reserved.
77
//
88
// Authors: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
99
// Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
@@ -235,6 +235,9 @@ int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
235235
}
236236
}
237237

238+
if (adata->signed_fw_image)
239+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_DMA_INCLUDE_HDR, ACP_SHA_HEADER);
240+
238241
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_DMA_STRT_ADDR, start_addr);
239242
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_DMA_DESTINATION_ADDR, dest_addr);
240243
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SHA_MSG_LENGTH, image_length);
@@ -527,6 +530,7 @@ int amd_sof_acp_probe(struct snd_sof_dev *sdev)
527530
sdev->debug_box.offset = sdev->host_box.offset + sdev->host_box.size;
528531
sdev->debug_box.size = BOX_SIZE_1024;
529532

533+
adata->signed_fw_image = false;
530534
acp_memory_init(sdev);
531535

532536
acp_dsp_stream_init(sdev);

sound/soc/sof/amd/acp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#define DSP_FW_RUN_ENABLE 0x01
4242
#define ACP_SHA_RUN 0x01
4343
#define ACP_SHA_RESET 0x02
44+
#define ACP_SHA_HEADER 0x01
4445
#define ACP_DMA_CH_RST 0x01
4546
#define ACP_DMA_CH_GRACEFUL_RST_EN 0x10
4647
#define ACP_ATU_CACHE_INVALID 0x01
@@ -82,6 +83,8 @@
8283
#define SRAM1_SIZE 0x13A000
8384
#define PROBE_STATUS_BIT BIT(31)
8485

86+
#define ACP_FIRMWARE_SIGNATURE 0x100
87+
8588
enum clock_source {
8689
ACP_CLOCK_96M = 0,
8790
ACP_CLOCK_48M,
@@ -181,15 +184,19 @@ struct sof_amd_acp_desc {
181184
/* Common device data struct for ACP devices */
182185
struct acp_dev_data {
183186
struct snd_sof_dev *dev;
187+
const struct firmware *fw_dbin;
184188
/* DMIC device */
185189
struct platform_device *dmic_dev;
186190
unsigned int fw_bin_size;
187191
unsigned int fw_data_bin_size;
192+
const char *fw_code_bin;
193+
const char *fw_data_bin;
188194
u32 fw_bin_page_count;
189195
dma_addr_t sha_dma_addr;
190196
u8 *bin_buf;
191197
dma_addr_t dma_addr;
192198
u8 *data_buf;
199+
bool signed_fw_image;
193200
struct dma_descriptor dscr_info[ACP_MAX_DESC];
194201
struct acp_dsp_stream stream_buf[ACP_MAX_STREAM];
195202
struct acp_dsp_stream *dtrace_stream;
@@ -214,6 +221,7 @@ int amd_sof_acp_remove(struct snd_sof_dev *sdev);
214221
/* DSP Loader callbacks */
215222
int acp_sof_dsp_run(struct snd_sof_dev *sdev);
216223
int acp_dsp_pre_fw_run(struct snd_sof_dev *sdev);
224+
int acp_sof_load_signed_firmware(struct snd_sof_dev *sdev);
217225
int acp_get_bar_index(struct snd_sof_dev *sdev, u32 type);
218226

219227
/* Block IO callbacks */

0 commit comments

Comments
 (0)