355 lines
8.3 KiB
C
355 lines
8.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* dsp-platform-mem-control.c-- Mediatek ADSP dmemory control
|
|
*
|
|
* Copyright (c) 2018 MediaTek Inc.
|
|
* Author: Chipeng <Chipeng.chang@mediatek.com>
|
|
*/
|
|
|
|
#include <linux/genalloc.h>
|
|
#include <linux/string.h>
|
|
#include <linux/types.h>
|
|
#include <sound/pcm.h>
|
|
|
|
/* adsp or scp*/
|
|
#ifdef CONFIG_MTK_AUDIODSP_SUPPORT
|
|
#include <adsp_helper.h>
|
|
#else
|
|
#include <scp_helper.h>
|
|
#endif
|
|
|
|
#include "dsp-platform-mem-control.h"
|
|
#include "../v2/mtk-dsp-mem-control.h"
|
|
#include "mt6781-afe-common.h"
|
|
#include "../v2/mtk-base-dsp.h"
|
|
#include "../v2/mtk-dsp-common.h"
|
|
#include "audio_ipi_platform.h"
|
|
#include "adsp_platform.h"
|
|
|
|
/*
|
|
* todo: let user space decide this
|
|
* mapping dl ==> task
|
|
*/
|
|
static struct mtk_adsp_task_attr adsp_task_attr[AUDIO_TASK_DAI_NUM] = {
|
|
[AUDIO_TASK_VOIP_ID] = {true, MT6781_MEMIF_DL12, -1, -1,
|
|
VOIP_FEATURE_ID, false},
|
|
[AUDIO_TASK_PRIMARY_ID] = {true, MT6781_MEMIF_DL1, -1, -1,
|
|
PRIMARY_FEATURE_ID, false},
|
|
[AUDIO_TASK_OFFLOAD_ID] = {true, MT6781_MEMIF_DL3, -1, -1,
|
|
OFFLOAD_FEATURE_ID, false},
|
|
[AUDIO_TASK_DEEPBUFFER_ID] = {false, -1, -1, -1,
|
|
DEEPBUF_FEATURE_ID, false},
|
|
[AUDIO_TASK_PLAYBACK_ID] = {false, MT6781_MEMIF_DL4,
|
|
MT6781_MEMIF_VUL4,
|
|
MT6781_MEMIF_AWB2,
|
|
AUDIO_PLAYBACK_FEATURE_ID, false},
|
|
[AUDIO_TASK_MUSIC_ID] = {false, -1, -1, -1,
|
|
AUDIO_MUSIC_FEATURE_ID, false},
|
|
[AUDIO_TASK_CAPTURE_UL1_ID] = {true, -1,
|
|
MT6781_MEMIF_VUL12,
|
|
MT6781_MEMIF_AWB2,
|
|
CAPTURE_UL1_FEATURE_ID, false},
|
|
[AUDIO_TASK_A2DP_ID] = {true, -1,
|
|
-1,
|
|
-1,
|
|
A2DP_PLAYBACK_FEATURE_ID, false},
|
|
[AUDIO_TASK_DATAPROVIDER_ID] = {true, -1,
|
|
MT6781_MEMIF_VUL4,
|
|
-1,
|
|
AUDIO_DATAPROVIDER_FEATURE_ID, false},
|
|
[AUDIO_TASK_CALL_FINAL_ID] = {true, MT6781_MEMIF_DL4,
|
|
MT6781_MEMIF_VUL4,
|
|
MT6781_MEMIF_AWB2,
|
|
CALL_FINAL_FEATURE_ID, false},
|
|
[AUDIO_TASK_FAST_ID] = {false, -1, -1, -1,
|
|
FAST_FEATURE_ID, false},
|
|
[AUDIO_TASK_KTV_ID] = {true, MT6781_MEMIF_DL8,
|
|
MT6781_MEMIF_VUL6,
|
|
-1,
|
|
KTV_FEATURE_ID, false},
|
|
[AUDIO_TASK_CAPTURE_RAW_ID] = {false, -1, -1, -1,
|
|
CAPTURE_RAW_FEATURE_ID, false},
|
|
[AUDIO_TASK_FM_ADSP_ID] = {true, -1, MT6781_MEMIF_VUL4, -1,
|
|
FM_ADSP_FEATURE_ID, false},
|
|
};
|
|
|
|
/* task share mem block */
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_primary_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_playback_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_offload_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, // 1024 bytes
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, // 1024 bytes
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_deepbuffer_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_voip_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_capture_ul1_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_a2dp_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_dataprovider_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_call_final_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_fast_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_ktv_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_capture_raw_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
static struct audio_dsp_dram
|
|
adsp_sharemem_fm_mblock[ADSP_TASK_SHAREMEM_NUM] = {
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
{
|
|
.size = 0x400, /* 1024 bytes */
|
|
.phy_addr = 0,
|
|
},
|
|
};
|
|
|
|
struct audio_dsp_dram *mtk_get_adsp_sharemem_block(int audio_task_id)
|
|
{
|
|
if (audio_task_id > AUDIO_TASK_DAI_NUM)
|
|
pr_info("%s err\n", __func__);
|
|
|
|
switch (audio_task_id) {
|
|
case AUDIO_TASK_VOIP_ID:
|
|
return adsp_sharemem_voip_mblock;
|
|
case AUDIO_TASK_PRIMARY_ID:
|
|
return adsp_sharemem_primary_mblock;
|
|
case AUDIO_TASK_OFFLOAD_ID:
|
|
return adsp_sharemem_offload_mblock;
|
|
case AUDIO_TASK_DEEPBUFFER_ID:
|
|
return adsp_sharemem_deepbuffer_mblock;
|
|
case AUDIO_TASK_PLAYBACK_ID:
|
|
return adsp_sharemem_playback_mblock;
|
|
case AUDIO_TASK_CAPTURE_UL1_ID:
|
|
return adsp_sharemem_capture_ul1_mblock;
|
|
case AUDIO_TASK_A2DP_ID:
|
|
return adsp_sharemem_a2dp_mblock;
|
|
case AUDIO_TASK_DATAPROVIDER_ID:
|
|
return adsp_sharemem_dataprovider_mblock;
|
|
case AUDIO_TASK_CALL_FINAL_ID:
|
|
return adsp_sharemem_call_final_mblock;
|
|
case AUDIO_TASK_FAST_ID:
|
|
return adsp_sharemem_fast_mblock;
|
|
case AUDIO_TASK_KTV_ID:
|
|
return adsp_sharemem_ktv_mblock;
|
|
case AUDIO_TASK_CAPTURE_RAW_ID:
|
|
return adsp_sharemem_capture_raw_mblock;
|
|
case AUDIO_TASK_FM_ADSP_ID:
|
|
return adsp_sharemem_fm_mblock;
|
|
default:
|
|
pr_info("%s err audio_task_id = %d\n", __func__, audio_task_id);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct mtk_adsp_task_attr *mtk_get_adsp_task_attr(int adsp_id)
|
|
{
|
|
if (adsp_id >= AUDIO_TASK_DAI_NUM)
|
|
pr_info("%s adsp_id = %d\n", __func__, adsp_id);
|
|
|
|
switch (adsp_id) {
|
|
case AUDIO_TASK_VOIP_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_VOIP_ID];
|
|
case AUDIO_TASK_PRIMARY_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_PRIMARY_ID];
|
|
case AUDIO_TASK_OFFLOAD_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_OFFLOAD_ID];
|
|
case AUDIO_TASK_DEEPBUFFER_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_DEEPBUFFER_ID];
|
|
case AUDIO_TASK_PLAYBACK_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_PLAYBACK_ID];
|
|
case AUDIO_TASK_MUSIC_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_MUSIC_ID];
|
|
case AUDIO_TASK_CAPTURE_UL1_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_CAPTURE_UL1_ID];
|
|
case AUDIO_TASK_A2DP_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_A2DP_ID];
|
|
case AUDIO_TASK_DATAPROVIDER_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_DATAPROVIDER_ID];
|
|
case AUDIO_TASK_CALL_FINAL_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_CALL_FINAL_ID];
|
|
case AUDIO_TASK_FAST_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_FAST_ID];
|
|
case AUDIO_TASK_KTV_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_KTV_ID];
|
|
case AUDIO_TASK_CAPTURE_RAW_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_CAPTURE_RAW_ID];
|
|
case AUDIO_TASK_FM_ADSP_ID:
|
|
return &adsp_task_attr[AUDIO_TASK_FM_ADSP_ID];
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* dai id support dsp <==> afe */
|
|
bool mtk_adsp_dai_id_support_share_mem(int dai_id)
|
|
{
|
|
switch (dai_id) {
|
|
case MT6781_MEMIF_DL1:
|
|
case MT6781_MEMIF_DL12:
|
|
case MT6781_MEMIF_DL2:
|
|
case MT6781_MEMIF_DL3:
|
|
case MT6781_MEMIF_DL4:
|
|
case MT6781_MEMIF_DL5:
|
|
case MT6781_MEMIF_DL6:
|
|
case MT6781_MEMIF_DL7:
|
|
case MT6781_MEMIF_DL8:
|
|
case MT6781_MEMIF_VUL12:
|
|
case MT6781_MEMIF_VUL2:
|
|
case MT6781_MEMIF_VUL3:
|
|
case MT6781_MEMIF_VUL4:
|
|
case MT6781_MEMIF_VUL5:
|
|
case MT6781_MEMIF_VUL6:
|
|
case MT6781_MEMIF_AWB:
|
|
case MT6781_MEMIF_AWB2:
|
|
case MT6781_MEMIF_NUM:
|
|
return true;
|
|
case MT6781_MEMIF_DAI:
|
|
case MT6781_MEMIF_DAI2:
|
|
case MT6781_MEMIF_MOD_DAI:
|
|
return false;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* base on dsp type get core_id */
|
|
int mtk_get_core_id(int dsp_type)
|
|
{
|
|
return (dsp_type == AUDIO_OPENDSP_USE_HIFI3_A) ?
|
|
ADSP_A_ID : -1;
|
|
}
|
|
|
|
bool get_mtk_enable_common_mem_mpu(void)
|
|
{
|
|
return false;
|
|
}
|
|
|