1919#include "acp-dsp-offset.h"
2020#include "acp.h"
2121
22- #define FW_BIN 0
23- #define FW_DATA_BIN 1
22+ #define FW_BIN 0
23+ #define FW_DATA_BIN 1
24+ #define FW_SRAM_DATA_BIN 2
2425
2526#define FW_BIN_PTE_OFFSET 0x00
2627#define FW_DATA_BIN_PTE_OFFSET 0x08
@@ -49,7 +50,6 @@ int acp_dsp_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_t
4950 u32 offset , void * src , size_t size )
5051{
5152 struct pci_dev * pci = to_pci_dev (sdev -> dev );
52- const struct sof_amd_acp_desc * desc = get_chip_info (sdev -> pdata );
5353 struct acp_dev_data * adata ;
5454 void * dest ;
5555 u32 dma_size , page_count ;
@@ -86,9 +86,18 @@ int acp_dsp_block_write(struct snd_sof_dev *sdev, enum snd_sof_fw_blk_type blk_t
8686 adata -> is_dram_in_use = true;
8787 break ;
8888 case SOF_FW_BLK_TYPE_SRAM :
89- offset = offset - desc -> sram_pte_offset ;
90- memcpy_to_scratch (sdev , offset , src , size );
91- return 0 ;
89+ if (!adata -> sram_data_buf ) {
90+ adata -> sram_data_buf = dma_alloc_coherent (& pci -> dev ,
91+ ACP_DEFAULT_SRAM_LENGTH ,
92+ & adata -> sram_dma_addr ,
93+ GFP_ATOMIC );
94+ if (!adata -> sram_data_buf )
95+ return - ENOMEM ;
96+ }
97+ adata -> fw_sram_data_bin_size = size + offset ;
98+ dest = adata -> sram_data_buf + offset ;
99+ adata -> is_sram_in_use = true;
100+ break ;
92101 default :
93102 dev_err (sdev -> dev , "bad blk type 0x%x\n" , blk_type );
94103 return - EINVAL ;
@@ -123,6 +132,10 @@ static void configure_pte_for_fw_loading(int type, int num_pages, struct acp_dev
123132 offset = adata -> fw_bin_page_count * 8 ;
124133 addr = adata -> dma_addr ;
125134 break ;
135+ case FW_SRAM_DATA_BIN :
136+ offset = (adata -> fw_bin_page_count + ACP_DRAM_PAGE_COUNT ) * 8 ;
137+ addr = adata -> sram_dma_addr ;
138+ break ;
126139 default :
127140 dev_err (sdev -> dev , "Invalid data type %x\n" , type );
128141 return ;
@@ -189,6 +202,22 @@ int acp_dsp_pre_fw_run(struct snd_sof_dev *sdev)
189202 if (ret < 0 )
190203 dev_err (sdev -> dev , "acp dma transfer status: %d\n" , ret );
191204 }
205+ if (adata -> is_sram_in_use ) {
206+ configure_pte_for_fw_loading (FW_SRAM_DATA_BIN , ACP_SRAM_PAGE_COUNT , adata );
207+ src_addr = ACP_SYSTEM_MEMORY_WINDOW + ACP_DEFAULT_SRAM_LENGTH +
208+ (page_count * ACP_PAGE_SIZE );
209+ dest_addr = ACP_SRAM_BASE_ADDRESS ;
210+
211+ ret = configure_and_run_dma (adata , src_addr , dest_addr ,
212+ adata -> fw_sram_data_bin_size );
213+ if (ret < 0 ) {
214+ dev_err (sdev -> dev , "acp dma configuration failed: %d\n" , ret );
215+ return ret ;
216+ }
217+ ret = acp_dma_status (adata , 0 );
218+ if (ret < 0 )
219+ dev_err (sdev -> dev , "acp dma transfer status: %d\n" , ret );
220+ }
192221
193222 if (desc -> rev > 3 ) {
194223 /* Cache Window enable */
@@ -205,6 +234,11 @@ int acp_dsp_pre_fw_run(struct snd_sof_dev *sdev)
205234 adata -> dma_addr );
206235 adata -> data_buf = NULL ;
207236 }
237+ if (adata -> is_sram_in_use ) {
238+ dma_free_coherent (& pci -> dev , ACP_DEFAULT_SRAM_LENGTH , adata -> sram_data_buf ,
239+ adata -> sram_dma_addr );
240+ adata -> sram_data_buf = NULL ;
241+ }
208242 return ret ;
209243}
210244EXPORT_SYMBOL_NS (acp_dsp_pre_fw_run , SND_SOC_SOF_AMD_COMMON );
0 commit comments