@ -26,6 +26,9 @@ struct sst_mem_block;
struct sst_module ;
struct sst_fw ;
/* do we need to remove or keep */
# define DSP_DRAM_ADDR_OFFSET 0x400000
/*
* DSP Operations exported by platform Audio DSP driver .
*/
@ -67,6 +70,8 @@ struct sst_addr {
u32 shim_offset ;
u32 iram_offset ;
u32 dram_offset ;
u32 dsp_iram_offset ;
u32 dsp_dram_offset ;
void __iomem * lpe ;
void __iomem * shim ;
void __iomem * pci_cfg ;
@ -83,15 +88,6 @@ struct sst_mailbox {
size_t out_size ;
} ;
/*
* Audio DSP Firmware data types .
*/
enum sst_data_type {
SST_DATA_M = 0 , /* module block data */
SST_DATA_P = 1 , /* peristant data (text, data) */
SST_DATA_S = 2 , /* scratch data (usually buffers) */
} ;
/*
* Audio DSP memory block types .
*/
@ -124,23 +120,6 @@ struct sst_fw {
void * private ; /* core doesn't touch this */
} ;
/*
* Audio DSP Generic Module data .
*
* This is used to dsecribe any sections of persistent ( text and data ) and
* scratch ( buffers ) of module data in ADSP memory space .
*/
struct sst_module_data {
enum sst_mem_type type ; /* destination memory type */
enum sst_data_type data_type ; /* type of module data */
u32 size ; /* size in bytes */
int32_t offset ; /* offset in FW file */
u32 data_offset ; /* offset in ADSP memory space */
void * data ; /* module data */
} ;
/*
* Audio DSP Generic Module Template .
*
@ -150,15 +129,52 @@ struct sst_module_data {
struct sst_module_template {
u32 id ;
u32 entry ; /* entry point */
struct sst_module_data s ; /* scratch data */
struct sst_module_data p ; /* peristant data */
u32 scratch_size ;
u32 persistent_size ;
} ;
/*
* Block Allocator - Used to allocate blocks of DSP memory .
*/
struct sst_block_allocator {
u32 id ;
u32 offset ;
int size ;
enum sst_mem_type type ;
} ;
/*
* Runtime Module Instance - A module object can be instanciated multiple
* times within the DSP FW .
*/
struct sst_module_runtime {
struct sst_dsp * dsp ;
int id ;
struct sst_module * module ; /* parent module we belong too */
u32 persistent_offset ; /* private memory offset */
void * private ;
struct list_head list ;
struct list_head block_list ; /* list of blocks used */
} ;
/*
* Runtime Module Context - The runtime context must be manually stored by the
* driver prior to enter S3 and restored after leaving S3 . This should really be
* part of the memory context saved by the enter D3 message IPC ? ? ?
*/
struct sst_module_runtime_context {
dma_addr_t dma_buffer ;
u32 * buffer ;
} ;
/*
* Audio DSP Generic Module .
*
* Each Firmware file can consist of 1. . N modules . A module can span multiple
* ADSP memory blocks . The simplest FW will be a file with 1 module .
* ADSP memory blocks . The simplest FW will be a file with 1 module . A module
* can be instanciated multiple times in the DSP .
*/
struct sst_module {
struct sst_dsp * dsp ;
@ -167,10 +183,13 @@ struct sst_module {
/* module configuration */
u32 id ;
u32 entry ; /* module entry point */
u 32 offset ; /* module offset in firmware file */
s 32 offset ; /* module offset in firmware file */
u32 size ; /* module size */
struct sst_module_data s ; /* scratch data */
struct sst_module_data p ; /* peristant data */
u32 scratch_size ; /* global scratch memory required */
u32 persistent_size ; /* private memory required */
enum sst_mem_type type ; /* destination memory type */
u32 data_offset ; /* offset in ADSP memory space */
void * data ; /* module data */
/* runtime */
u32 usage_count ; /* can be unloaded if count == 0 */
@ -180,6 +199,7 @@ struct sst_module {
struct list_head block_list ; /* Module list of blocks in use */
struct list_head list ; /* DSP list of modules */
struct list_head list_fw ; /* FW list of modules */
struct list_head runtime_list ; /* list of runtime module objects*/
} ;
/*
@ -208,7 +228,6 @@ struct sst_mem_block {
struct sst_block_ops * ops ; /* block operations, if any */
/* block status */
enum sst_data_type data_type ; /* data type held in this block */
u32 bytes_used ; /* bytes in use by modules */
void * private ; /* generic core does not touch this */
int users ; /* number of modules using this block */
@ -253,6 +272,11 @@ struct sst_dsp {
struct list_head module_list ;
struct list_head fw_list ;
/* scratch buffer */
struct list_head scratch_block_list ;
u32 scratch_offset ;
u32 scratch_size ;
/* platform data */
struct sst_pdata * pdata ;
@ -290,18 +314,33 @@ void sst_fw_unload(struct sst_fw *sst_fw);
/* Create/Free firmware modules */
struct sst_module * sst_module_new ( struct sst_fw * sst_fw ,
struct sst_module_template * template , void * private ) ;
void sst_module_free ( struct sst_module * sst_module ) ;
int sst_module_insert ( struct sst_module * sst_module ) ;
int sst_module_remove ( struct sst_module * sst_module ) ;
int sst_module_insert_fixed_block ( struct sst_module * module ,
struct sst_module_data * data ) ;
void sst_module_free ( struct sst_module * module ) ;
struct sst_module * sst_module_get_from_id ( struct sst_dsp * dsp , u32 id ) ;
/* allocate/free pesistent/scratch memory regions managed by drv */
struct sst_module * sst_mem_block_alloc_scratch ( struct sst_dsp * dsp ) ;
void sst_mem_block_free_scratch ( struct sst_dsp * dsp ,
struct sst_module * scratch ) ;
int sst_block_module_remove ( struct sst_module * module ) ;
int sst_module_alloc_blocks ( struct sst_module * module ) ;
int sst_module_free_blocks ( struct sst_module * module ) ;
/* Create/Free firmware module runtime instances */
struct sst_module_runtime * sst_module_runtime_new ( struct sst_module * module ,
int id , void * private ) ;
void sst_module_runtime_free ( struct sst_module_runtime * runtime ) ;
struct sst_module_runtime * sst_module_runtime_get_from_id (
struct sst_module * module , u32 id ) ;
int sst_module_runtime_alloc_blocks ( struct sst_module_runtime * runtime ,
int offset ) ;
int sst_module_runtime_free_blocks ( struct sst_module_runtime * runtime ) ;
int sst_module_runtime_save ( struct sst_module_runtime * runtime ,
struct sst_module_runtime_context * context ) ;
int sst_module_runtime_restore ( struct sst_module_runtime * runtime ,
struct sst_module_runtime_context * context ) ;
/* generic block allocation */
int sst_alloc_blocks ( struct sst_dsp * dsp , struct sst_block_allocator * ba ,
struct list_head * block_list ) ;
int sst_free_blocks ( struct sst_dsp * dsp , struct list_head * block_list ) ;
/* scratch allocation */
int sst_block_alloc_scratch ( struct sst_dsp * dsp ) ;
void sst_block_free_scratch ( struct sst_dsp * dsp ) ;
/* Register the DSPs memory blocks - would be nice to read from ACPI */
struct sst_mem_block * sst_mem_block_register ( struct sst_dsp * dsp , u32 offset ,
@ -309,4 +348,10 @@ struct sst_mem_block *sst_mem_block_register(struct sst_dsp *dsp, u32 offset,
void * private ) ;
void sst_mem_block_unregister_all ( struct sst_dsp * dsp ) ;
/* Create/Free DMA resources */
int sst_dma_new ( struct sst_dsp * sst ) ;
void sst_dma_free ( struct sst_dma * dma ) ;
u32 sst_dsp_get_offset ( struct sst_dsp * dsp , u32 offset ,
enum sst_mem_type type ) ;
# endif