u32 param_id, struct skl_module_cfg *mcfg)
 {
        struct skl_ipc_large_config_msg msg;
+       size_t bytes = size;
 
        msg.module_id = mcfg->id.module_id;
        msg.instance_id = mcfg->id.pvt_id;
        msg.param_data_size = size;
        msg.large_param_id = param_id;
 
-       return skl_ipc_get_large_config(&skl->ipc, &msg, params);
+       return skl_ipc_get_large_config(&skl->ipc, &msg, ¶ms, &bytes);
 }
 
 EXPORT_SYMBOL_GPL(skl_ipc_set_large_config);
 
 int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
-               struct skl_ipc_large_config_msg *msg, u32 *param)
+               struct skl_ipc_large_config_msg *msg,
+               u32 **payload, size_t *bytes)
 {
        struct skl_ipc_header header = {0};
-       struct sst_ipc_message request = {0}, reply = {0};
+       struct sst_ipc_message request, reply = {0};
+       unsigned int *buf;
        int ret;
 
+       reply.data = kzalloc(SKL_ADSP_W1_SZ, GFP_KERNEL);
+       if (!reply.data)
+               return -ENOMEM;
+
        header.primary = IPC_MSG_TARGET(IPC_MOD_MSG);
        header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
        header.primary |= IPC_GLB_TYPE(IPC_MOD_LARGE_CONFIG_GET);
        header.extension |= IPC_FINAL_BLOCK(1);
        header.extension |= IPC_INITIAL_BLOCK(1);
 
-       request.header = *(u64 *)(&header);
-       reply.data = param;
-       reply.size = msg->param_data_size;
+       request.header = *(u64 *)&header;
+       request.data = *payload;
+       request.size = *bytes;
+       reply.size = SKL_ADSP_W1_SZ;
+
        ret = sst_ipc_tx_message_wait(ipc, request, &reply);
        if (ret < 0)
                dev_err(ipc->dev, "ipc: get large config fail, err: %d\n", ret);
 
+       reply.size = (reply.header >> 32) & IPC_DATA_OFFSET_SZ_MASK;
+       buf = krealloc(reply.data, reply.size, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       *payload = buf;
+       *bytes = reply.size;
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(skl_ipc_get_large_config);
 
                struct skl_ipc_large_config_msg *msg, u32 *param);
 
 int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
-               struct skl_ipc_large_config_msg *msg, u32 *param);
+               struct skl_ipc_large_config_msg *msg,
+               u32 **payload, size_t *bytes);
 
 int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc,
                        u8 dma_id, u8 table_id, bool wait);