Skip to content

Commit

Permalink
ASoC: Intel: avs: Add pipeline management requests
Browse files Browse the repository at this point in the history
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: Amadeusz Sławiński <[email protected]>
Signed-off-by: Cezary Rojewski <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
crojewsk-intel authored and broonie committed Mar 11, 2022
1 parent cb1eb6b commit b956b27
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 0 deletions.
76 changes: 76 additions & 0 deletions sound/soc/intel/avs/messages.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,79 @@ int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id)

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;
}
48 changes: 48 additions & 0 deletions sound/soc/intel/avs/messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ enum avs_msg_direction {
enum avs_global_msg_type {
AVS_GLB_LOAD_MULTIPLE_MODULES = 15,
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_NOTIFICATION = 27,
};
Expand All @@ -45,6 +49,23 @@ union avs_global_msg {
struct {
u32 mod_cnt:8;
} 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 */
struct {
u32 dma_id:5;
Expand All @@ -54,6 +75,12 @@ union avs_global_msg {
};
union {
u32 val;
/* pipeline management */
struct {
u32 lp:1; /* low power flag */
u32 rsvd:3;
u32 attributes:16; /* additional scheduling flags */
} create_ppl;
} ext;
};
} __packed;
Expand Down Expand Up @@ -101,6 +128,10 @@ union avs_reply_msg {
struct {
u32 err_mod_id:16;
} load_multi_mods;
/* pipeline management */
struct {
u32 state:5;
} get_ppl_state;
} ext;
};
} __packed;
Expand Down Expand Up @@ -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_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 */

0 comments on commit b956b27

Please sign in to comment.