On Tue, Dec 01, 2015 at 10:58:54PM +0000, Mark Brown wrote:
On Sat, Nov 28, 2015 at 03:01:51PM +0530, Vinod Koul wrote:
Some firmware modules can be loaded and unloaded to/from DSP. This can be done by invoking IPCs Load module and unload module respectively. So this patch starts this by adding support for these IPCs
In what way does it do this?
By adding skl_ipc_load_modules and skl_ipc_unload_modules helpers to send these IPCs to DSP
+int skl_ipc_load_modules(struct sst_generic_ipc *ipc,
u8 module_cnt, void *data)
+{
- struct skl_ipc_header header = {0};
- u64 *ipc_header = (u64 *)(&header);
- int ret;
- header.primary = IPC_MSG_TARGET(IPC_FW_GEN_MSG);
- header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
- header.primary |= IPC_GLB_TYPE(IPC_GLB_LOAD_MULTIPLE_MODS);
- header.primary |= IPC_LOAD_MODULE_CNT(module_cnt);
- ret = sst_ipc_tx_message_wait(ipc, *ipc_header, data,
(sizeof(u16) * module_cnt), NULL, 0);
So the multiple modules are a block of at most 255 16 bit words? That's a bit surprising - is it really a count of the number of modules or rather the size of the block of data that's being squirted at the DSP?
Nope, as you would think that does not make sense :)
So we do not point to module memory here, we are sending IPC saying module X, Y and Z are being loaded, data contains the module IDs only. The IDs are 16 bits so sizeof(u16) and number of modules pass as arg
The modules are transfered with Code Loader DMA which invokes this as IPC after preparing DMA from Host.
This way IPC allows us to load One or multiple modules at one shot
+int skl_ipc_unload_modules(struct sst_generic_ipc *ipc, u8 module_cnt,
void *data)
+{
- struct skl_ipc_header header = {0};
- u64 *ipc_header = (u64 *)(&header);
- int ret;
- header.primary = IPC_MSG_TARGET(IPC_FW_GEN_MSG);
- header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
- header.primary |= IPC_GLB_TYPE(IPC_GLB_UNLOAD_MULTIPLE_MODS);
- header.primary |= IPC_LOAD_MODULE_CNT(module_cnt);
- ret = sst_ipc_tx_message_wait(ipc, *ipc_header, data,
(sizeof(u16) * module_cnt), NULL, 0);
This seems weird... what's the data that's getting passed in? This doesn't seem to be actually managing anything, it's just some very basic message formatting.
Here we are asking to remove module represented by IDs in data buffer. Yes this is only messaging part of module load/unload
Thanks