Merge "msm: ipa3: Prevent addition of duplicate headers"
diff --git a/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c b/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c
index 8c3be54..bb9cf79 100644
--- a/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c
+++ b/drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c
@@ -2218,6 +2218,13 @@
goto fail_pm_cons;
}
+ res = ipa_pm_associate_ipa_cons_to_client(ipa_mhi_client_ctx->pm_hdl,
+ IPA_CLIENT_MHI_LOW_LAT_CONS);
+ if (res) {
+ IPA_MHI_ERR("fail to associate low_lat_cons with PM %d\n", res);
+ goto fail_pm_cons;
+ }
+
res = ipa_pm_set_throughput(ipa_mhi_client_ctx->pm_hdl, 1000);
if (res) {
IPA_MHI_ERR("fail to set perf profile to PM %d\n", res);
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c
index 06bf6fb..9f53578 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c
@@ -6932,7 +6932,8 @@
pipe_bitmask |= bmsk;
bmsk = bmsk << 1;
- if ((i % IPA_EP_PER_REG) == (ep_per_reg - 1)) {
+ if ((i % IPA_EP_PER_REG) == (ep_per_reg - 1)
+ || (i == ipa3_ctx->ipa_num_pipes - 1)) {
IPADBG("interrupt data: %u\n", suspend_data[j]);
res = ipa_pm_handle_suspend(pipe_bitmask, j);
if (res) {
@@ -9299,8 +9300,10 @@
kfree(ipa3_ctx->ipa_tz_unlock_reg);
ipa3_ctx->ipa_tz_unlock_reg = NULL;
fail_tz_unlock_reg:
- if (ipa3_ctx->logbuf)
+ if (ipa3_ctx->logbuf) {
ipc_log_context_destroy(ipa3_ctx->logbuf);
+ ipa3_ctx->logbuf = NULL;
+ }
fail_uc_file_alloc:
kfree(ipa3_ctx->gsi_fw_file_name);
ipa3_ctx->gsi_fw_file_name = NULL;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c
index 908c530..a9744ff 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c
@@ -637,11 +637,20 @@
mem_size = IPA_MEM_PART(apps_hdr_size_ddr);
entry->is_lcl = false;
} else {
- /* if the entry is intended to be in DDR,
- and there is no space -> error */
- IPAERR("No space in DDR header buffer! Requested: %d Left: %d\n",
- ipa_hdr_bin_sz[bin], mem_size - htbl->end);
- goto bad_hdr_len;
+ /* check if DDR free list */
+ if (list_empty(&htbl->head_free_offset_list[bin])) {
+ IPAERR("No space in DDR header buffer! Requested: %d Left: %d name %s, end %d\n",
+ ipa_hdr_bin_sz[bin], mem_size - htbl->end, entry->name, htbl->end);
+ goto bad_hdr_len;
+ } else {
+ /* get the first free slot */
+ offset = list_first_entry(&htbl->head_free_offset_list[bin],
+ struct ipa_hdr_offset_entry, link);
+ list_move(&offset->link, &htbl->head_offset_list[bin]);
+ entry->offset_entry = offset;
+ offset->ipacm_installed = user;
+ goto free_list;
+ }
}
}
offset = kmem_cache_zalloc(ipa3_ctx->hdr_offset_cache,
@@ -671,6 +680,8 @@
offset->ipacm_installed = user;
}
+free_list:
+
list_add(&entry->link, &htbl->head_hdr_entry_list);
htbl->hdr_cnt++;
IPADBG("add hdr of sz=%d hdr_cnt=%d ofst=%d to %s table\n",
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_odl.c b/drivers/platform/msm/ipa/ipa_v3/ipa_odl.c
index 3726355..2123327 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_odl.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_odl.c
@@ -372,6 +372,11 @@
return 0;
}
+ if (atomic_read(&ipa3_ctx->is_ssr)) {
+ IPAERR("SSR in progress ODL pipe configuration not allowed\n");
+ return 0;
+ }
+
memset(&holb_cfg, 0, sizeof(holb_cfg));
holb_cfg.tmr_val = 0;
holb_cfg.en = 1;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c
index c16ea49..411e798 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include <linux/debugfs.h>
@@ -50,6 +51,8 @@
__stringify(IPAHAL_PKT_STATUS_EXCEPTION_NAT),
__stringify(IPAHAL_PKT_STATUS_EXCEPTION_IPV6CT),
__stringify(IPAHAL_PKT_STATUS_EXCEPTION_UCP),
+ __stringify(IPAHAL_PKT_STATUS_EXCEPTION_INVALID_PIPE),
+ __stringify(IPAHAL_PKT_STATUS_EXCEPTION_HDRI),
__stringify(IPAHAL_PKT_STATUS_EXCEPTION_CSUM),
};
@@ -1164,8 +1167,14 @@
exception_type = IPAHAL_PKT_STATUS_EXCEPTION_NAT;
break;
case 128:
- exception_type = IPAHAL_PKT_STATUS_EXCEPTION_UCP;
- break;
+ exception_type = IPAHAL_PKT_STATUS_EXCEPTION_UCP;
+ break;
+ case 129:
+ exception_type = IPAHAL_PKT_STATUS_EXCEPTION_INVALID_PIPE;
+ break;
+ case 136:
+ exception_type = IPAHAL_PKT_STATUS_EXCEPTION_HDRI;
+ break;
case 229:
exception_type = IPAHAL_PKT_STATUS_EXCEPTION_CSUM;
break;
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h
index db5de06..05ff186 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h
+++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _IPAHAL_H_
@@ -522,6 +523,8 @@
IPAHAL_PKT_STATUS_EXCEPTION_NAT,
IPAHAL_PKT_STATUS_EXCEPTION_IPV6CT,
IPAHAL_PKT_STATUS_EXCEPTION_UCP,
+ IPAHAL_PKT_STATUS_EXCEPTION_INVALID_PIPE,
+ IPAHAL_PKT_STATUS_EXCEPTION_HDRI,
IPAHAL_PKT_STATUS_EXCEPTION_CSUM,
IPAHAL_PKT_STATUS_EXCEPTION_MAX,
};