From 9eea7feb1c978b5740eedd11bf88c50bbba35f59 Mon Sep 17 00:00:00 2001 From: Michael Adisumarta Date: Thu, 13 May 2021 12:06:56 -0700 Subject: [PATCH] msm: ipa: fix for common event ring size When common event ring size is used, event ring memory is shared across the pipes. Make changes to not increase the descriptor fifo memory for pipes which use common event ring. Change-Id: I3b93c8074c8c85eca2f04f18057dad6bfa7a8581 Signed-off-by: Chaitanya Pratapa --- drivers/platform/msm/ipa/ipa_v3/ipa.c | 73 ++++++++++--------- drivers/platform/msm/ipa/ipa_v3/ipa_i.h | 3 +- .../platform/msm/ipa/ipa_v3/rmnet_ctl_ipa.c | 2 +- .../platform/msm/ipa/ipa_v3/rmnet_ll_ipa.c | 2 +- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 6ebb8ed431..87b47cbf8c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -6866,6 +6866,37 @@ void ipa3_notify_clients_registered(void) } EXPORT_SYMBOL(ipa3_notify_clients_registered); +void ipa_gsi_map_unmap_gsi_msi_addr(bool map) +{ + struct ipa_smmu_cb_ctx *cb; + u64 rounddown_addr; + int res; + int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO; + + cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_AP); + rounddown_addr = rounddown(ipa3_ctx->gsi_msi_addr, PAGE_SIZE); + if (map) { + res = ipa3_iommu_map(cb->iommu_domain, + rounddown_addr, rounddown_addr, PAGE_SIZE, prot); + if (res) { + IPAERR("iommu mapping failed for gsi_msi_addr\n"); + ipa_assert(); + } + ipa3_ctx->gsi_msi_clear_addr_io_mapped = + (u64)ioremap(ipa3_ctx->gsi_msi_clear_addr, 4); + ipa3_ctx->gsi_msi_addr_io_mapped = + (u64)ioremap(ipa3_ctx->gsi_msi_addr, 4); + } else { + iounmap((int *) ipa3_ctx->gsi_msi_clear_addr_io_mapped); + iounmap((int *) ipa3_ctx->gsi_msi_addr_io_mapped); + res = iommu_unmap(cb->iommu_domain, rounddown_addr, PAGE_SIZE); + ipa3_ctx->gsi_msi_clear_addr_io_mapped = 0; + ipa3_ctx->gsi_msi_addr_io_mapped = 0; + if (res) + IPAERR("smmu unmap for gsi_msi_addr failed %d\n", res); + } +} + /** * ipa3_post_init() - Initialize the IPA Driver (Part II). * This part contains all initialization which requires interaction with @@ -7242,6 +7273,12 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p, ipa_ut_module_init(); + /* Map the MSI addresses for the GSI to access, for LL and QMAP FC pipe */ + if (!ipa3_ctx->gsi_msi_addr_io_mapped && + !ipa3_ctx->gsi_msi_clear_addr_io_mapped && + (ipa3_ctx->rmnet_ll_enable || ipa3_ctx->rmnet_ctl_enable)) + ipa_gsi_map_unmap_gsi_msi_addr(true); + pr_info("IPA driver initialization was successful.\n"); return 0; @@ -9343,11 +9380,6 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->gsi_rmnet_ll_evt_ring_intvec = gsi_rmnet_ll_evt_ring_intvec; - if (!ipa3_ctx->gsi_msi_addr_io_mapped && - !ipa3_ctx->gsi_msi_clear_addr_io_mapped && - (ipa3_ctx->rmnet_ll_enable || ipa3_ctx->rmnet_ctl_enable)) - ipa_gsi_map_unmap_gsi_msi_addr(true); - result = of_property_read_string(pdev->dev.of_node, "qcom,use-gsi-ipa-fw", &ipa_drv_res->gsi_fw_file_name); if (!result) @@ -10899,37 +10931,6 @@ int ipa3_pci_drv_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent) return result; } -void ipa_gsi_map_unmap_gsi_msi_addr(bool map) -{ - struct ipa_smmu_cb_ctx *cb; - u64 rounddown_addr; - int res; - int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO; - - cb = ipa3_get_smmu_ctx(IPA_SMMU_CB_AP); - rounddown_addr = rounddown(ipa3_ctx->gsi_msi_addr, PAGE_SIZE); - if (map) { - res = ipa3_iommu_map(cb->iommu_domain, - rounddown_addr, rounddown_addr, PAGE_SIZE, prot); - if (res) { - IPAERR("iommu mapping failed for gsi_msi_addr\n"); - ipa_assert(); - } - ipa3_ctx->gsi_msi_clear_addr_io_mapped = - (u64)ioremap(ipa3_ctx->gsi_msi_clear_addr, 4); - ipa3_ctx->gsi_msi_addr_io_mapped = - (u64)ioremap(ipa3_ctx->gsi_msi_addr, 4); - } else { - iounmap((int *) ipa3_ctx->gsi_msi_clear_addr_io_mapped); - iounmap((int *) ipa3_ctx->gsi_msi_addr_io_mapped); - res = iommu_unmap(cb->iommu_domain, rounddown_addr, PAGE_SIZE); - ipa3_ctx->gsi_msi_clear_addr_io_mapped = 0; - ipa3_ctx->gsi_msi_addr_io_mapped = 0; - if (res) - IPAERR("smmu unmap for gsi_msi_addr failed %d\n", res); - } -} - /* * The following returns transport register memory location and * size... diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index 239f2469e8..9dcec8c1ac 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -59,7 +59,8 @@ #define IPA5_PIPE_REG_NUM 2 #define IPA5_MAX_NUM_PIPES (IPA5_PIPES_NUM) #define IPA_SYS_DESC_FIFO_SZ 0x800 -#define IPA_SYS_TX_DATA_DESC_FIFO_SZ 0x2000 +#define IPA_SYS_TX_DATA_DESC_FIFO_SZ 0x1000 +#define IPA_SYS_TX_DATA_DESC_FIFO_SZ_8K 0x2000 #define IPA_COMMON_EVENT_RING_SIZE 0x7C00 #define IPA_LAN_RX_HEADER_LENGTH (2) #define IPA_QMAP_HEADER_LENGTH (4) diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ctl_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ctl_ipa.c index 528e652b85..b4d88315bf 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ctl_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ctl_ipa.c @@ -393,7 +393,7 @@ int ipa3_setup_apps_low_lat_prod_pipe(bool rmnet_config, ipa_low_lat_ep_cfg->notify = apps_rmnet_ctl_tx_complete_notify; ipa_low_lat_ep_cfg->desc_fifo_sz = - IPA_SYS_TX_DATA_DESC_FIFO_SZ; + IPA_SYS_TX_DATA_DESC_FIFO_SZ_8K; ipa_low_lat_ep_cfg->priv = NULL; ret = ipa_setup_sys_pipe(ipa_low_lat_ep_cfg, diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ll_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ll_ipa.c index 9229f53434..2258aa6f1c 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ll_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ll_ipa.c @@ -513,7 +513,7 @@ int ipa3_setup_apps_low_lat_data_prod_pipe( apps_rmnet_ll_tx_complete_notify; ipa_low_lat_data_ep_cfg->priv = dev; ipa_low_lat_data_ep_cfg->desc_fifo_sz = - IPA_SYS_TX_DATA_DESC_FIFO_SZ; + IPA_SYS_TX_DATA_DESC_FIFO_SZ_8K; ret = ipa_setup_sys_pipe(ipa_low_lat_data_ep_cfg, &rmnet_ll_ipa3_ctx->apps_to_ipa3_low_lat_data_hdl);