xref: /openbmc/linux/sound/soc/intel/avs/messages.c (revision cb1eb6b5be42799d23f81ffde84ee3537365b0ed)
1*cb1eb6b5SCezary Rojewski // SPDX-License-Identifier: GPL-2.0-only
2*cb1eb6b5SCezary Rojewski //
3*cb1eb6b5SCezary Rojewski // Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
4*cb1eb6b5SCezary Rojewski //
5*cb1eb6b5SCezary Rojewski // Authors: Cezary Rojewski <cezary.rojewski@intel.com>
6*cb1eb6b5SCezary Rojewski //          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
7*cb1eb6b5SCezary Rojewski //
8*cb1eb6b5SCezary Rojewski 
9*cb1eb6b5SCezary Rojewski #include "avs.h"
10*cb1eb6b5SCezary Rojewski #include "messages.h"
11*cb1eb6b5SCezary Rojewski 
12*cb1eb6b5SCezary Rojewski #define AVS_CL_TIMEOUT_MS	5000
13*cb1eb6b5SCezary Rojewski 
14*cb1eb6b5SCezary Rojewski int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids)
15*cb1eb6b5SCezary Rojewski {
16*cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(LOAD_MULTIPLE_MODULES);
17*cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request;
18*cb1eb6b5SCezary Rojewski 	int ret;
19*cb1eb6b5SCezary Rojewski 
20*cb1eb6b5SCezary Rojewski 	msg.load_multi_mods.mod_cnt = num_mod_ids;
21*cb1eb6b5SCezary Rojewski 	request.header = msg.val;
22*cb1eb6b5SCezary Rojewski 	request.data = mod_ids;
23*cb1eb6b5SCezary Rojewski 	request.size = sizeof(*mod_ids) * num_mod_ids;
24*cb1eb6b5SCezary Rojewski 
25*cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
26*cb1eb6b5SCezary Rojewski 	if (ret)
27*cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "load multiple modules", ret);
28*cb1eb6b5SCezary Rojewski 
29*cb1eb6b5SCezary Rojewski 	return ret;
30*cb1eb6b5SCezary Rojewski }
31*cb1eb6b5SCezary Rojewski 
32*cb1eb6b5SCezary Rojewski int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids)
33*cb1eb6b5SCezary Rojewski {
34*cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(UNLOAD_MULTIPLE_MODULES);
35*cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request;
36*cb1eb6b5SCezary Rojewski 	int ret;
37*cb1eb6b5SCezary Rojewski 
38*cb1eb6b5SCezary Rojewski 	msg.load_multi_mods.mod_cnt = num_mod_ids;
39*cb1eb6b5SCezary Rojewski 	request.header = msg.val;
40*cb1eb6b5SCezary Rojewski 	request.data = mod_ids;
41*cb1eb6b5SCezary Rojewski 	request.size = sizeof(*mod_ids) * num_mod_ids;
42*cb1eb6b5SCezary Rojewski 
43*cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
44*cb1eb6b5SCezary Rojewski 	if (ret)
45*cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "unload multiple modules", ret);
46*cb1eb6b5SCezary Rojewski 
47*cb1eb6b5SCezary Rojewski 	return ret;
48*cb1eb6b5SCezary Rojewski }
49*cb1eb6b5SCezary Rojewski 
50*cb1eb6b5SCezary Rojewski int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id)
51*cb1eb6b5SCezary Rojewski {
52*cb1eb6b5SCezary Rojewski 	union avs_global_msg msg = AVS_GLOBAL_REQUEST(LOAD_LIBRARY);
53*cb1eb6b5SCezary Rojewski 	struct avs_ipc_msg request = {{0}};
54*cb1eb6b5SCezary Rojewski 	int ret;
55*cb1eb6b5SCezary Rojewski 
56*cb1eb6b5SCezary Rojewski 	msg.load_lib.dma_id = dma_id;
57*cb1eb6b5SCezary Rojewski 	msg.load_lib.lib_id = lib_id;
58*cb1eb6b5SCezary Rojewski 	request.header = msg.val;
59*cb1eb6b5SCezary Rojewski 
60*cb1eb6b5SCezary Rojewski 	ret = avs_dsp_send_msg_timeout(adev, &request, NULL, AVS_CL_TIMEOUT_MS);
61*cb1eb6b5SCezary Rojewski 	if (ret)
62*cb1eb6b5SCezary Rojewski 		avs_ipc_err(adev, &request, "load library", ret);
63*cb1eb6b5SCezary Rojewski 
64*cb1eb6b5SCezary Rojewski 	return ret;
65*cb1eb6b5SCezary Rojewski }
66