2020-03-06 07:28:18 +03:00
// SPDX-License-Identifier: GPL-2.0
2021-03-26 18:11:13 +03:00
/* Copyright (C) 2019-2021 Linaro Ltd. */
2020-03-06 07:28:18 +03:00
# include <linux/log2.h>
# include "gsi.h"
# include "ipa_data.h"
# include "ipa_endpoint.h"
# include "ipa_mem.h"
2021-03-28 20:31:09 +03:00
/** enum ipa_resource_type - IPA resource types for an SoC having IPA v4.2 */
2021-03-26 18:11:17 +03:00
enum ipa_resource_type {
/* Source resource types; first must have value 0 */
IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS = 0 ,
IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS ,
IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF ,
IPA_RESOURCE_TYPE_SRC_HPS_DMARS ,
IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES ,
/* Destination resource types; first must have value 0 */
IPA_RESOURCE_TYPE_DST_DATA_SECTORS = 0 ,
IPA_RESOURCE_TYPE_DST_DPS_DMARS ,
} ;
2021-03-28 20:31:09 +03:00
/* Resource groups used for an SoC having IPA v4.2 */
2021-03-26 18:11:13 +03:00
enum ipa_rsrc_group_id {
/* Source resource group identifiers */
IPA_RSRC_GROUP_SRC_UL_DL = 0 ,
2021-03-26 18:11:21 +03:00
IPA_RSRC_GROUP_SRC_COUNT , /* Last in set; not a source group */
2021-03-26 18:11:13 +03:00
/* Destination resource group identifiers */
IPA_RSRC_GROUP_DST_UL_DL_DPL = 0 ,
2021-03-26 18:11:21 +03:00
IPA_RSRC_GROUP_DST_COUNT , /* Last; not a destination group */
2021-03-26 18:11:13 +03:00
} ;
2021-03-28 20:31:09 +03:00
/* QSB configuration data for an SoC having IPA v4.2 */
2021-03-19 18:24:22 +03:00
static const struct ipa_qsb_data ipa_qsb_data [ ] = {
[ IPA_QSB_MASTER_DDR ] = {
. max_writes = 8 ,
. max_reads = 12 ,
2021-03-20 18:57:04 +03:00
/* no outstanding read byte (beat) limit */
2021-03-19 18:24:22 +03:00
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Endpoint configuration data for an SoC having IPA v4.2 */
2020-03-06 07:28:18 +03:00
static const struct ipa_gsi_endpoint_data ipa_gsi_endpoint_data [ ] = {
[ IPA_ENDPOINT_AP_COMMAND_TX ] = {
. ee_id = GSI_EE_AP ,
. channel_id = 1 ,
. endpoint_id = 6 ,
. toward_ipa = true ,
. channel = {
. tre_count = 256 ,
. event_count = 256 ,
. tlv_count = 20 ,
} ,
. endpoint = {
. config = {
2021-03-26 18:11:13 +03:00
. resource_group = IPA_RSRC_GROUP_SRC_UL_DL ,
2020-03-06 07:28:18 +03:00
. dma_mode = true ,
. dma_endpoint = IPA_ENDPOINT_AP_LAN_RX ,
2021-03-20 18:57:06 +03:00
. tx = {
. seq_type = IPA_SEQ_DMA ,
} ,
2020-03-06 07:28:18 +03:00
} ,
} ,
} ,
[ IPA_ENDPOINT_AP_LAN_RX ] = {
. ee_id = GSI_EE_AP ,
. channel_id = 2 ,
. endpoint_id = 8 ,
. toward_ipa = false ,
. channel = {
. tre_count = 256 ,
. event_count = 256 ,
. tlv_count = 6 ,
} ,
. endpoint = {
. config = {
2021-03-26 18:11:13 +03:00
. resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL ,
2020-03-06 07:28:18 +03:00
. aggregation = true ,
. status_enable = true ,
. rx = {
. pad_align = ilog2 ( sizeof ( u32 ) ) ,
} ,
} ,
} ,
} ,
[ IPA_ENDPOINT_AP_MODEM_TX ] = {
. ee_id = GSI_EE_AP ,
. channel_id = 0 ,
. endpoint_id = 1 ,
. toward_ipa = true ,
. channel = {
. tre_count = 512 ,
. event_count = 512 ,
. tlv_count = 8 ,
} ,
. endpoint = {
. filter_support = true ,
. config = {
2021-03-26 18:11:13 +03:00
. resource_group = IPA_RSRC_GROUP_SRC_UL_DL ,
2020-03-06 07:28:18 +03:00
. checksum = true ,
. qmap = true ,
. status_enable = true ,
. tx = {
2021-03-20 18:57:06 +03:00
. seq_type = IPA_SEQ_1_PASS_SKIP_LAST_UC ,
. seq_rep_type = IPA_SEQ_REP_DMA_PARSER ,
2020-03-06 07:28:18 +03:00
. status_endpoint =
IPA_ENDPOINT_MODEM_AP_RX ,
} ,
} ,
} ,
} ,
[ IPA_ENDPOINT_AP_MODEM_RX ] = {
. ee_id = GSI_EE_AP ,
. channel_id = 3 ,
. endpoint_id = 9 ,
. toward_ipa = false ,
. channel = {
. tre_count = 256 ,
. event_count = 256 ,
. tlv_count = 6 ,
} ,
. endpoint = {
. config = {
2021-03-26 18:11:13 +03:00
. resource_group = IPA_RSRC_GROUP_DST_UL_DL_DPL ,
2020-03-06 07:28:18 +03:00
. checksum = true ,
. qmap = true ,
. aggregation = true ,
. rx = {
. aggr_close_eof = true ,
} ,
} ,
} ,
} ,
[ IPA_ENDPOINT_MODEM_COMMAND_TX ] = {
. ee_id = GSI_EE_MODEM ,
. channel_id = 1 ,
. endpoint_id = 5 ,
. toward_ipa = true ,
} ,
[ IPA_ENDPOINT_MODEM_LAN_RX ] = {
. ee_id = GSI_EE_MODEM ,
. channel_id = 3 ,
2020-06-11 22:48:31 +03:00
. endpoint_id = 11 ,
2020-03-06 07:28:18 +03:00
. toward_ipa = false ,
} ,
[ IPA_ENDPOINT_MODEM_AP_TX ] = {
. ee_id = GSI_EE_MODEM ,
. channel_id = 0 ,
. endpoint_id = 4 ,
. toward_ipa = true ,
. endpoint = {
. filter_support = true ,
} ,
} ,
[ IPA_ENDPOINT_MODEM_AP_RX ] = {
. ee_id = GSI_EE_MODEM ,
. channel_id = 2 ,
. endpoint_id = 10 ,
. toward_ipa = false ,
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Source resource configuration data for an SoC having IPA v4.2 */
2021-03-26 18:11:19 +03:00
static const struct ipa_resource ipa_resource_src [ ] = {
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_SRC_PKT_CONTEXTS ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_SRC_UL_DL ] = {
2021-03-26 18:11:17 +03:00
. min = 3 , . max = 63 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_LISTS ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_SRC_UL_DL ] = {
2021-03-26 18:11:17 +03:00
. min = 3 , . max = 3 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_SRC_DESCRIPTOR_BUFF ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_SRC_UL_DL ] = {
2021-03-26 18:11:17 +03:00
. min = 10 , . max = 10 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_SRC_HPS_DMARS ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_SRC_UL_DL ] = {
2021-03-26 18:11:17 +03:00
. min = 1 , . max = 1 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_SRC_ACK_ENTRIES ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_SRC_UL_DL ] = {
2021-03-26 18:11:17 +03:00
. min = 5 , . max = 5 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Destination resource configuration data for an SoC having IPA v4.2 */
2021-03-26 18:11:19 +03:00
static const struct ipa_resource ipa_resource_dst [ ] = {
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_DST_DATA_SECTORS ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_DST_UL_DL_DPL ] = {
2021-03-26 18:11:17 +03:00
. min = 3 , . max = 3 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
2021-03-26 18:11:16 +03:00
[ IPA_RESOURCE_TYPE_DST_DPS_DMARS ] = {
2021-03-26 18:11:13 +03:00
. limits [ IPA_RSRC_GROUP_DST_UL_DL_DPL ] = {
2021-03-26 18:11:17 +03:00
. min = 1 , . max = 63 ,
2020-03-06 07:28:18 +03:00
} ,
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Resource configuration data for an SoC having IPA v4.2 */
2020-03-06 07:28:18 +03:00
static const struct ipa_resource_data ipa_resource_data = {
2021-03-26 18:11:21 +03:00
. rsrc_group_src_count = IPA_RSRC_GROUP_SRC_COUNT ,
. rsrc_group_dst_count = IPA_RSRC_GROUP_DST_COUNT ,
2020-03-06 07:28:18 +03:00
. resource_src_count = ARRAY_SIZE ( ipa_resource_src ) ,
. resource_src = ipa_resource_src ,
. resource_dst_count = ARRAY_SIZE ( ipa_resource_dst ) ,
. resource_dst = ipa_resource_dst ,
} ;
2021-03-28 20:31:09 +03:00
/* IPA-resident memory region data for an SoC having IPA v4.2 */
2020-05-04 20:58:57 +03:00
static const struct ipa_mem ipa_mem_local_data [ ] = {
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_UC_SHARED ,
2020-03-06 07:28:18 +03:00
. offset = 0x0000 ,
. size = 0x0080 ,
. canary_count = 0 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_UC_INFO ,
2020-03-06 07:28:18 +03:00
. offset = 0x0080 ,
. size = 0x0200 ,
2021-03-19 18:24:19 +03:00
. canary_count = 0 ,
2020-03-06 07:28:18 +03:00
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V4_FILTER_HASHED ,
2020-03-06 07:28:18 +03:00
. offset = 0x0288 ,
. size = 0 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V4_FILTER ,
2020-03-06 07:28:18 +03:00
. offset = 0x0290 ,
. size = 0x0078 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V6_FILTER_HASHED ,
2020-03-06 07:28:18 +03:00
. offset = 0x0310 ,
. size = 0 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V6_FILTER ,
2020-03-06 07:28:18 +03:00
. offset = 0x0318 ,
. size = 0x0078 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V4_ROUTE_HASHED ,
2020-03-06 07:28:18 +03:00
. offset = 0x0398 ,
. size = 0 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V4_ROUTE ,
2020-03-06 07:28:18 +03:00
. offset = 0x03a0 ,
. size = 0x0078 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V6_ROUTE_HASHED ,
2020-03-06 07:28:18 +03:00
. offset = 0x0420 ,
. size = 0 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_V6_ROUTE ,
2020-03-06 07:28:18 +03:00
. offset = 0x0428 ,
. size = 0x0078 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_MODEM_HEADER ,
2020-03-06 07:28:18 +03:00
. offset = 0x04a8 ,
. size = 0x0140 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_MODEM_PROC_CTX ,
2020-03-06 07:28:18 +03:00
. offset = 0x05f0 ,
. size = 0x0200 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_AP_PROC_CTX ,
2020-03-06 07:28:18 +03:00
. offset = 0x07f0 ,
. size = 0x0200 ,
. canary_count = 0 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_PDN_CONFIG ,
2020-03-06 07:28:18 +03:00
. offset = 0x09f8 ,
. size = 0x0050 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_STATS_QUOTA_MODEM ,
2020-03-06 07:28:18 +03:00
. offset = 0x0a50 ,
. size = 0x0060 ,
. canary_count = 2 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_STATS_TETHERING ,
2020-03-06 07:28:18 +03:00
. offset = 0x0ab0 ,
. size = 0x0140 ,
. canary_count = 0 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_MODEM ,
2020-03-06 07:28:18 +03:00
. offset = 0x0bf0 ,
. size = 0x140c ,
. canary_count = 0 ,
} ,
2021-06-10 22:23:08 +03:00
{
2021-06-10 01:34:54 +03:00
. id = IPA_MEM_END_MARKER ,
2020-03-06 07:28:18 +03:00
. offset = 0x2000 ,
. size = 0 ,
. canary_count = 1 ,
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Memory configuration data for an SoC having IPA v4.2 */
2021-03-19 18:24:18 +03:00
static const struct ipa_mem_data ipa_mem_data = {
2020-05-04 20:58:57 +03:00
. local_count = ARRAY_SIZE ( ipa_mem_local_data ) ,
. local = ipa_mem_local_data ,
2020-05-04 20:58:58 +03:00
. imem_addr = 0x146a8000 ,
. imem_size = 0x00002000 ,
2020-05-04 20:58:59 +03:00
. smem_id = 497 ,
. smem_size = 0x00002000 ,
2020-05-04 20:58:57 +03:00
} ;
2021-03-28 20:31:09 +03:00
/* Interconnect rates are in 1000 byte/second units */
2021-03-19 18:24:18 +03:00
static const struct ipa_interconnect_data ipa_interconnect_data [ ] = {
2021-01-15 15:50:50 +03:00
{
. name = " memory " ,
. peak_bandwidth = 465000 , /* 465 MBps */
. average_bandwidth = 80000 , /* 80 MBps */
} ,
/* Average bandwidth is unused for the next two interconnects */
{
. name = " imem " ,
. peak_bandwidth = 68570 , /* 68.570 MBps */
. average_bandwidth = 0 , /* unused */
} ,
{
. name = " config " ,
. peak_bandwidth = 30000 , /* 30 MBps */
. average_bandwidth = 0 , /* unused */
} ,
} ;
2021-03-28 20:31:09 +03:00
/* Clock and interconnect configuration data for an SoC having IPA v4.2 */
2021-03-19 18:24:18 +03:00
static const struct ipa_clock_data ipa_clock_data = {
2020-11-20 01:40:40 +03:00
. core_clock_rate = 100 * 1000 * 1000 , /* Hz */
2021-01-15 15:50:50 +03:00
. interconnect_count = ARRAY_SIZE ( ipa_interconnect_data ) ,
. interconnect_data = ipa_interconnect_data ,
2020-11-20 01:40:40 +03:00
} ;
2021-03-28 20:31:09 +03:00
/* Configuration data for an SoC having IPA v4.2 */
const struct ipa_data ipa_data_v4_2 = {
2020-03-06 07:28:18 +03:00
. version = IPA_VERSION_4_2 ,
2021-03-28 20:31:06 +03:00
/* backward_compat value is 0 */
2021-03-19 18:24:22 +03:00
. qsb_count = ARRAY_SIZE ( ipa_qsb_data ) ,
. qsb_data = ipa_qsb_data ,
2020-03-06 07:28:18 +03:00
. endpoint_count = ARRAY_SIZE ( ipa_gsi_endpoint_data ) ,
. endpoint_data = ipa_gsi_endpoint_data ,
. resource_data = & ipa_resource_data ,
2020-05-04 20:58:57 +03:00
. mem_data = & ipa_mem_data ,
2020-11-20 01:40:40 +03:00
. clock_data = & ipa_clock_data ,
2020-03-06 07:28:18 +03:00
} ;