xref: /openbmc/linux/sound/soc/intel/avs/messages.c (revision b956b27b477ae63e92240f813c1027de601df11f)
1cb1eb6b5SCezary Rojewski // SPDX-License-Identifier: GPL-2.0-only
2cb1eb6b5SCezary Rojewski //
3cb1eb6b5SCezary Rojewski // Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
4cb1eb6b5SCezary Rojewski //
5cb1eb6b5SCezary Rojewski // Authors: Cezary Rojewski <cezary.rojewski@intel.com>
6cb1eb6b5SCezary Rojewski //          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
7cb1eb6b5SCezary Rojewski //
8cb1eb6b5SCezary Rojewski 
9cb1eb6b5SCezary Rojewski #include "avs.h"
10cb1eb6b5SCezary Rojewski #include "messages.h"
11cb1eb6b5SCezary Rojewski 
12cb1eb6b5SCezary Rojewski #define AVS_CL_TIMEOUT_MS	5000
13cb1eb6b5SCezary Rojewski 
14cb1eb6b5SCezary Rojewski int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids)
15cb1eb6b5SCezary Rojewski {
16cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(LOAD_MULTIPLE_MODULES);
17cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request;
18cb1eb6b5SCezary Rojewski 	int ret;
19cb1eb6b5SCezary Rojewski 
20cb1eb6b5SCezary Rojewski 	msg.load_multi_mods.mod_cnt = num_mod_ids;
21cb1eb6b5SCezary Rojewski 	request.header = msg.val;
22cb1eb6b5SCezary Rojewski 	request.data = mod_ids;
23cb1eb6b5SCezary Rojewski 	request.size = sizeof(*mod_ids) * num_mod_ids;
24cb1eb6b5SCezary Rojewski 
25cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
26cb1eb6b5SCezary Rojewski 	if (ret)
27cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "load multiple modules", ret);
28cb1eb6b5SCezary Rojewski 
29cb1eb6b5SCezary Rojewski 	return ret;
30cb1eb6b5SCezary Rojewski }
31cb1eb6b5SCezary Rojewski 
32cb1eb6b5SCezary Rojewski int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids)
33cb1eb6b5SCezary Rojewski {
34cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(UNLOAD_MULTIPLE_MODULES);
35cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request;
36cb1eb6b5SCezary Rojewski 	int ret;
37cb1eb6b5SCezary Rojewski 
38cb1eb6b5SCezary Rojewski 	msg.load_multi_mods.mod_cnt = num_mod_ids;
39cb1eb6b5SCezary Rojewski 	request.header = msg.val;
40cb1eb6b5SCezary Rojewski 	request.data = mod_ids;
41cb1eb6b5SCezary Rojewski 	request.size = sizeof(*mod_ids) * num_mod_ids;
42cb1eb6b5SCezary Rojewski 
43cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
44cb1eb6b5SCezary Rojewski 	if (ret)
45cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "unload multiple modules", ret);
46cb1eb6b5SCezary Rojewski 
47cb1eb6b5SCezary Rojewski 	return ret;
48cb1eb6b5SCezary Rojewski }
49cb1eb6b5SCezary Rojewski 
50cb1eb6b5SCezary Rojewski int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id)
51cb1eb6b5SCezary Rojewski {
52cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(LOAD_LIBRARY);
53cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request = {{0}};
54cb1eb6b5SCezary Rojewski 	int ret;
55cb1eb6b5SCezary Rojewski 
56cb1eb6b5SCezary Rojewski 	msg.load_lib.dma_id = dma_id;
57cb1eb6b5SCezary Rojewski 	msg.load_lib.lib_id = lib_id;
58cb1eb6b5SCezary Rojewski 	request.header = msg.val;
59cb1eb6b5SCezary Rojewski 
60cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
61cb1eb6b5SCezary Rojewski 	if (ret)
62cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "load library", ret);
63cb1eb6b5SCezary Rojewski 
64cb1eb6b5SCezary Rojewski 	return ret;
65cb1eb6b5SCezary Rojewski }
66*b956b27bSCezary Rojewski 
67*b956b27bSCezary Rojewski int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
68*b956b27bSCezary Rojewski 			    u8 instance_id, bool lp, u16 attributes)
69*b956b27bSCezary Rojewski {
70*b956b27bSCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(CREATE_PIPELINE);
71*b956b27bSCezary Rojewski 	struct avs_ipc_msg request = {{0}};
72*b956b27bSCezary Rojewski 	int ret;
73*b956b27bSCezary Rojewski 
74*b956b27bSCezary Rojewski 	msg.create_ppl.ppl_mem_size = req_size;
75*b956b27bSCezary Rojewski 	msg.create_ppl.ppl_priority = priority;
76*b956b27bSCezary Rojewski 	msg.create_ppl.instance_id = instance_id;
77*b956b27bSCezary Rojewski 	msg.ext.create_ppl.lp = lp;
78*b956b27bSCezary Rojewski 	msg.ext.create_ppl.attributes = attributes;
79*b956b27bSCezary Rojewski 	request.header = msg.val;
80*b956b27bSCezary Rojewski 
81*b956b27bSCezary Rojewski 	ret = avs_dsp_send_msg(adev, &request, NULL);
82*b956b27bSCezary Rojewski 	if (ret)
83*b956b27bSCezary Rojewski 		avs_ipc_err(adev, &request, "create pipeline", ret);
84*b956b27bSCezary Rojewski 
85*b956b27bSCezary Rojewski 	return ret;
86*b956b27bSCezary Rojewski }
87*b956b27bSCezary Rojewski 
88*b956b27bSCezary Rojewski int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id)
89*b956b27bSCezary Rojewski {
90*b956b27bSCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(DELETE_PIPELINE);
91*b956b27bSCezary Rojewski 	struct avs_ipc_msg request = {{0}};
92*b956b27bSCezary Rojewski 	int ret;
93*b956b27bSCezary Rojewski 
94*b956b27bSCezary Rojewski 	msg.ppl.instance_id = instance_id;
95*b956b27bSCezary Rojewski 	request.header = msg.val;
96*b956b27bSCezary Rojewski 
97*b956b27bSCezary Rojewski 	ret = avs_dsp_send_msg(adev, &request, NULL);
98*b956b27bSCezary Rojewski 	if (ret)
99*b956b27bSCezary Rojewski 		avs_ipc_err(adev, &request, "delete pipeline", ret);
100*b956b27bSCezary Rojewski 
101*b956b27bSCezary Rojewski 	return ret;
102*b956b27bSCezary Rojewski }
103*b956b27bSCezary Rojewski 
104*b956b27bSCezary Rojewski int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id,
105*b956b27bSCezary Rojewski 			       enum avs_pipeline_state state)
106*b956b27bSCezary Rojewski {
107*b956b27bSCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(SET_PIPELINE_STATE);
108*b956b27bSCezary Rojewski 	struct avs_ipc_msg request = {{0}};
109*b956b27bSCezary Rojewski 	int ret;
110*b956b27bSCezary Rojewski 
111*b956b27bSCezary Rojewski 	msg.set_ppl_state.ppl_id = instance_id;
112*b956b27bSCezary Rojewski 	msg.set_ppl_state.state = state;
113*b956b27bSCezary Rojewski 	request.header = msg.val;
114*b956b27bSCezary Rojewski 
115*b956b27bSCezary Rojewski 	ret = avs_dsp_send_msg(adev, &request, NULL);
116*b956b27bSCezary Rojewski 	if (ret)
117*b956b27bSCezary Rojewski 		avs_ipc_err(adev, &request, "set pipeline state", ret);
118*b956b27bSCezary Rojewski 
119*b956b27bSCezary Rojewski 	return ret;
120*b956b27bSCezary Rojewski }
121*b956b27bSCezary Rojewski 
122*b956b27bSCezary Rojewski int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id,
123*b956b27bSCezary Rojewski 			       enum avs_pipeline_state *state)
124*b956b27bSCezary Rojewski {
125*b956b27bSCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(GET_PIPELINE_STATE);
126*b956b27bSCezary Rojewski 	struct avs_ipc_msg request = {{0}};
127*b956b27bSCezary Rojewski 	struct avs_ipc_msg reply = {{0}};
128*b956b27bSCezary Rojewski 	int ret;
129*b956b27bSCezary Rojewski 
130*b956b27bSCezary Rojewski 	msg.get_ppl_state.ppl_id = instance_id;
131*b956b27bSCezary Rojewski 	request.header = msg.val;
132*b956b27bSCezary Rojewski 
133*b956b27bSCezary Rojewski 	ret = avs_dsp_send_msg(adev, &request, &reply);
134*b956b27bSCezary Rojewski 	if (ret) {
135*b956b27bSCezary Rojewski 		avs_ipc_err(adev, &request, "get pipeline state", ret);
136*b956b27bSCezary Rojewski 		return ret;
137*b956b27bSCezary Rojewski 	}
138*b956b27bSCezary Rojewski 
139*b956b27bSCezary Rojewski 	*state = reply.rsp.ext.get_ppl_state.state;
140*b956b27bSCezary Rojewski 	return ret;
141*b956b27bSCezary Rojewski }
142