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