Commit b956b27b authored by Cezary Rojewski's avatar Cezary Rojewski Committed by Mark Brown

ASoC: Intel: avs: Add pipeline management requests

Pipeline represents a scheduling entity. Their existence as well as
their state machine is controlled through CREATE_PIPELINE,
DELETE_PIPELINE and SET_PIPELINE_STATE IPCs.
Signed-off-by: default avatarAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Signed-off-by: default avatarCezary Rojewski <cezary.rojewski@intel.com>
Link: https://lore.kernel.org/r/20220311153544.136854-7-cezary.rojewski@intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent cb1eb6b5
...@@ -63,3 +63,79 @@ int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id) ...@@ -63,3 +63,79 @@ int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id)
return ret; return ret;
} }
int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
u8 instance_id, bool lp, u16 attributes)
{
union avs_global_msg msg = AVS_GLOBAL_REQUEST(CREATE_PIPELINE);
struct avs_ipc_msg request = {{0}};
int ret;
msg.create_ppl.ppl_mem_size = req_size;
msg.create_ppl.ppl_priority = priority;
msg.create_ppl.instance_id = instance_id;
msg.ext.create_ppl.lp = lp;
msg.ext.create_ppl.attributes = attributes;
request.header = msg.val;
ret = avs_dsp_send_msg(adev, &request, NULL);
if (ret)
avs_ipc_err(adev, &request, "create pipeline", ret);
return ret;
}
int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id)
{
union avs_global_msg msg = AVS_GLOBAL_REQUEST(DELETE_PIPELINE);
struct avs_ipc_msg request = {{0}};
int ret;
msg.ppl.instance_id = instance_id;
request.header = msg.val;
ret = avs_dsp_send_msg(adev, &request, NULL);
if (ret)
avs_ipc_err(adev, &request, "delete pipeline", ret);
return ret;
}
int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id,
enum avs_pipeline_state state)
{
union avs_global_msg msg = AVS_GLOBAL_REQUEST(SET_PIPELINE_STATE);
struct avs_ipc_msg request = {{0}};
int ret;
msg.set_ppl_state.ppl_id = instance_id;
msg.set_ppl_state.state = state;
request.header = msg.val;
ret = avs_dsp_send_msg(adev, &request, NULL);
if (ret)
avs_ipc_err(adev, &request, "set pipeline state", ret);
return ret;
}
int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id,
enum avs_pipeline_state *state)
{
union avs_global_msg msg = AVS_GLOBAL_REQUEST(GET_PIPELINE_STATE);
struct avs_ipc_msg request = {{0}};
struct avs_ipc_msg reply = {{0}};
int ret;
msg.get_ppl_state.ppl_id = instance_id;
request.header = msg.val;
ret = avs_dsp_send_msg(adev, &request, &reply);
if (ret) {
avs_ipc_err(adev, &request, "get pipeline state", ret);
return ret;
}
*state = reply.rsp.ext.get_ppl_state.state;
return ret;
}
...@@ -26,6 +26,10 @@ enum avs_msg_direction { ...@@ -26,6 +26,10 @@ enum avs_msg_direction {
enum avs_global_msg_type { enum avs_global_msg_type {
AVS_GLB_LOAD_MULTIPLE_MODULES = 15, AVS_GLB_LOAD_MULTIPLE_MODULES = 15,
AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16, AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16,
AVS_GLB_CREATE_PIPELINE = 17,
AVS_GLB_DELETE_PIPELINE = 18,
AVS_GLB_SET_PIPELINE_STATE = 19,
AVS_GLB_GET_PIPELINE_STATE = 20,
AVS_GLB_LOAD_LIBRARY = 24, AVS_GLB_LOAD_LIBRARY = 24,
AVS_GLB_NOTIFICATION = 27, AVS_GLB_NOTIFICATION = 27,
}; };
...@@ -45,6 +49,23 @@ union avs_global_msg { ...@@ -45,6 +49,23 @@ union avs_global_msg {
struct { struct {
u32 mod_cnt:8; u32 mod_cnt:8;
} load_multi_mods; } load_multi_mods;
/* pipeline management */
struct {
u32 ppl_mem_size:11;
u32 ppl_priority:5;
u32 instance_id:8;
} create_ppl;
struct {
u32 rsvd:16;
u32 instance_id:8;
} ppl; /* generic ppl request */
struct {
u32 state:16;
u32 ppl_id:8;
} set_ppl_state;
struct {
u32 ppl_id:8;
} get_ppl_state;
/* library loading */ /* library loading */
struct { struct {
u32 dma_id:5; u32 dma_id:5;
...@@ -54,6 +75,12 @@ union avs_global_msg { ...@@ -54,6 +75,12 @@ union avs_global_msg {
}; };
union { union {
u32 val; u32 val;
/* pipeline management */
struct {
u32 lp:1; /* low power flag */
u32 rsvd:3;
u32 attributes:16; /* additional scheduling flags */
} create_ppl;
} ext; } ext;
}; };
} __packed; } __packed;
...@@ -101,6 +128,10 @@ union avs_reply_msg { ...@@ -101,6 +128,10 @@ union avs_reply_msg {
struct { struct {
u32 err_mod_id:16; u32 err_mod_id:16;
} load_multi_mods; } load_multi_mods;
/* pipeline management */
struct {
u32 state:5;
} get_ppl_state;
} ext; } ext;
}; };
} __packed; } __packed;
...@@ -189,4 +220,21 @@ int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids); ...@@ -189,4 +220,21 @@ int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids); int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id); int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id);
/* Pipeline management messages */
enum avs_pipeline_state {
AVS_PPL_STATE_INVALID,
AVS_PPL_STATE_UNINITIALIZED,
AVS_PPL_STATE_RESET,
AVS_PPL_STATE_PAUSED,
AVS_PPL_STATE_RUNNING,
};
int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
u8 instance_id, bool lp, u16 attributes);
int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id);
int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id,
enum avs_pipeline_state state);
int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id,
enum avs_pipeline_state *state);
#endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */ #endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment