Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c4037e8 authored by Mohammed Javid's avatar Mohammed Javid
Browse files

msm: ipa2: V2 SDM450 kernel 4.9 porting



Added code changes to compile IPA V2 SDM450
kernel 4.9 porting

Change-Id: Ib2fb969c1b21c629872a954e93afaf1da3c3edc3
Acked-by: default avatarAshok Vuyyuru <avuyyuru@qti.qualcomm.com>
Signed-off-by: default avatarMohammed Javid <mjavid@codeaurora.org>
parent 7e3149cb
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@
#include <linux/ipa_qmi_service_v01.h>
#include <linux/ipa_mhi.h>
#include "../ipa_common_i.h"
#ifdef CONFIG_IPA3
#include "../ipa_v3/ipa_pm.h"
#endif

#define IPA_MHI_DRV_NAME "ipa_mhi_client"
#define IPA_MHI_DBG(fmt, args...) \
@@ -842,6 +844,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params)
	IPA_MHI_DBG("event_context_array_addr 0x%llx\n",
		ipa_mhi_client_ctx->event_context_array_addr);

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl);
		if (res) {
@@ -854,6 +857,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params)
			goto fail_pm_activate_modem;
		}
	} else {
#endif
		/* Add MHI <-> Q6 dependencies to IPA RM */
		res = ipa_rm_add_dependency(IPA_RM_RESOURCE_MHI_PROD,
			IPA_RM_RESOURCE_Q6_CONS);
@@ -874,7 +878,9 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params)
			IPA_MHI_ERR("failed request prod %d\n", res);
			goto fail_request_prod;
		}
#ifdef CONFIG_IPA3
	}
#endif

	/* gsi params */
	init_params.gsi.first_ch_idx =
@@ -912,12 +918,14 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params)
		ipa_rm_delete_dependency(IPA_RM_RESOURCE_MHI_PROD,
			IPA_RM_RESOURCE_Q6_CONS);
fail_add_mhi_q6_dep:
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl);
fail_pm_activate_modem:
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl);
fail_pm_activate:
#endif
	ipa_mhi_set_state(IPA_MHI_STATE_INITIALIZED);
	return res;
}
@@ -2124,6 +2132,7 @@ int ipa_mhi_suspend(bool force)
	 */
	IPA_ACTIVE_CLIENTS_INC_SIMPLE();

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		res = ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl);
		if (res) {
@@ -2136,6 +2145,7 @@ int ipa_mhi_suspend(bool force)
			goto fail_deactivate_modem_pm;
		}
	} else {
#endif
		IPA_MHI_DBG("release prod\n");
		res = ipa_mhi_release_prod();
		if (res) {
@@ -2149,7 +2159,9 @@ int ipa_mhi_suspend(bool force)
			IPA_MHI_ERR("ipa_mhi_wait_for_cons_release failed\n");
			goto fail_release_cons;
		}
#ifdef CONFIG_IPA3
	}
#endif
	usleep_range(IPA_MHI_SUSPEND_SLEEP_MIN, IPA_MHI_SUSPEND_SLEEP_MAX);

	res = ipa_mhi_suspend_dl(force);
@@ -2176,12 +2188,14 @@ int ipa_mhi_suspend(bool force)
	if (!ipa_pm_is_used())
	ipa_mhi_request_prod();
fail_release_prod:
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl);
fail_deactivate_modem_pm:
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl);
fail_deactivate_pm:
#endif
	IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
fail_suspend_ul_channel:
	ipa_mhi_resume_channels(true, ipa_mhi_client_ctx->ul_channels);
@@ -2241,6 +2255,7 @@ int ipa_mhi_resume(void)
		ipa_mhi_client_ctx->rm_cons_state = IPA_MHI_RM_STATE_GRANTED;
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl);
		if (res) {
@@ -2253,12 +2268,15 @@ int ipa_mhi_resume(void)
			goto fail_pm_activate_modem;
		}
	} else {
#endif
		res = ipa_mhi_request_prod();
		if (res) {
			IPA_MHI_ERR("ipa_mhi_request_prod failed %d\n", res);
			goto fail_request_prod;
		}
#ifdef CONFIG_IPA3
	}
#endif

	/* resume all UL channels */
	res = ipa_mhi_resume_channels(false,
@@ -2298,12 +2316,14 @@ int ipa_mhi_resume(void)
	if (!ipa_pm_is_used())
		ipa_mhi_release_prod();
fail_request_prod:
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl);
fail_pm_activate_modem:
	if (ipa_pm_is_used())
		ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl);
fail_pm_activate:
#endif
	ipa_mhi_suspend_channels(ipa_mhi_client_ctx->dl_channels);
fail_resume_dl_channels:
	ipa_mhi_set_state(IPA_MHI_STATE_SUSPENDED);
@@ -2455,6 +2475,7 @@ static void ipa_mhi_delete_rm_resources(void)
	ipa_assert();
}

#ifdef CONFIG_IPA3
static void ipa_mhi_deregister_pm(void)
{
	ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl);
@@ -2465,7 +2486,7 @@ static void ipa_mhi_deregister_pm(void)
	ipa_pm_deregister(ipa_mhi_client_ctx->modem_pm_hdl);
	ipa_mhi_client_ctx->modem_pm_hdl = ~0;
}

#endif
/**
 * ipa_mhi_destroy() - Destroy MHI IPA
 *
@@ -2498,9 +2519,11 @@ void ipa_mhi_destroy(void)
		ipa_uc_mhi_cleanup();
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ipa_mhi_deregister_pm();
	else
#endif
		ipa_mhi_delete_rm_resources();

	ipa_dma_destroy();
@@ -2516,6 +2539,7 @@ void ipa_mhi_destroy(void)
	ipa_assert();
}

#ifdef CONFIG_IPA3
static void ipa_mhi_pm_cb(void *p, enum ipa_pm_cb_event event)
{
	unsigned long flags;
@@ -2587,7 +2611,7 @@ static int ipa_mhi_register_pm(void)
	ipa_mhi_client_ctx->pm_hdl = ~0;
	return res;
}

#endif
static int ipa_mhi_create_rm_resources(void)
{
	int res;
@@ -2725,9 +2749,11 @@ int ipa_mhi_init(struct ipa_mhi_init_params *params)
		goto fail_dma_init;
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		res = ipa_mhi_register_pm();
	else
#endif
		res = ipa_mhi_create_rm_resources();
	if (res) {
		IPA_MHI_ERR("failed to create RM resources\n");
+24 −2
Original line number Diff line number Diff line
@@ -13,7 +13,9 @@
#include <linux/ipa_uc_offload.h>
#include <linux/msm_ipa.h>
#include "../ipa_common_i.h"
#ifdef CONFIG_IPA3
#include "../ipa_v3/ipa_pm.h"
#endif

#define IPA_NTN_DMA_POOL_ALIGNMENT 8
#define OFFLOAD_DRV_NAME "ipa_uc_offload"
@@ -115,6 +117,7 @@ static int ipa_commit_partial_hdr(
	return 0;
}

#ifdef CONFIG_IPA3
static void ipa_uc_offload_ntn_pm_cb(void *p, enum ipa_pm_cb_event event)
{
	/* suspend/resume is not supported */
@@ -156,6 +159,7 @@ static void ipa_uc_offload_ntn_deregister_pm_client(
	ipa_pm_deactivate_sync(ntn_ctx->pm_hdl);
	ipa_pm_deregister(ntn_ctx->pm_hdl);
}
#endif
static int ipa_uc_offload_ntn_create_rm_resources(
	struct ipa_uc_offload_ctx *ntn_ctx)
{
@@ -203,9 +207,11 @@ static int ipa_uc_offload_ntn_reg_intf(

	IPA_UC_OFFLOAD_DBG("register interface for netdev %s\n",
					 inp->netdev_name);
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ret = ipa_uc_offload_ntn_register_pm_client(ntn_ctx);
	else
#endif
		ret = ipa_uc_offload_ntn_create_rm_resources(ntn_ctx);
	if (ret) {
		IPA_UC_OFFLOAD_ERR("fail to create rm resource\n");
@@ -289,12 +295,16 @@ static int ipa_uc_offload_ntn_reg_intf(
fail:
	kfree(hdr);
fail_alloc:
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx);
	} else {
#endif
		ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_CONS);
		ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD);
#ifdef CONFIG_IPA3
	}
#endif
	return ret;
}

@@ -412,6 +422,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp,
		return -EINVAL;
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		result = ipa_pm_activate_sync(ntn_ctx->pm_hdl);
		if (result) {
@@ -419,6 +430,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp,
			return result;
		}
	} else {
#endif
		result = ipa_rm_add_dependency(IPA_RM_RESOURCE_ETHERNET_PROD,
			IPA_RM_RESOURCE_APPS_CONS);
		if (result) {
@@ -440,7 +452,9 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp,
			result = -EFAULT;
			goto fail;
		}
#ifdef CONFIG_IPA3
	}
#endif

	ntn_ctx->state = IPA_UC_OFFLOAD_STATE_UP;
	result = ipa_setup_uc_ntn_pipes(inp, ntn_ctx->notify,
@@ -529,11 +543,12 @@ int ipa_set_perf_profile(struct ipa_perf_profile *profile)
		return -EINVAL;
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		return ipa_pm_set_perf_profile(
			ipa_uc_offload_ctx[IPA_UC_NTN]->pm_hdl,
			profile->max_supported_bw_mbps);

#endif
	if (ipa_rm_set_perf_profile(resource_name, &rm_profile)) {
		IPA_UC_OFFLOAD_ERR("fail to setup rm perf profile\n");
		return -EFAULT;
@@ -550,6 +565,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx)

	ntn_ctx->state = IPA_UC_OFFLOAD_STATE_INITIALIZED;

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		ret = ipa_pm_deactivate_sync(ntn_ctx->pm_hdl);
		if (ret) {
@@ -558,6 +574,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx)
			return -EFAULT;
		}
	} else {
#endif
		ret = ipa_rm_release_resource(IPA_RM_RESOURCE_ETHERNET_PROD);
		if (ret) {
			IPA_UC_OFFLOAD_ERR("fail release ETHERNET_PROD: %d\n",
@@ -571,7 +588,9 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx)
			IPA_UC_OFFLOAD_ERR("fail del dep ETH->APPS, %d\n", ret);
			return -EFAULT;
		}
#ifdef CONFIG_IPA3
	}
#endif

	ipa_ep_idx_ul = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_PROD);
	ipa_ep_idx_dl = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_CONS);
@@ -627,9 +646,11 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx)
	int len, result = 0;
	struct ipa_ioc_del_hdr *hdr;

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used()) {
		ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx);
	} else {
#endif
		if (ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD)) {
			IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_PROD\n");
			return -EFAULT;
@@ -639,8 +660,9 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx)
			IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_CONS\n");
			return -EFAULT;
		}
#ifdef CONFIG_IPA3
	}

#endif
	len = sizeof(struct ipa_ioc_del_hdr) + 2 * sizeof(struct ipa_hdr_del);
	hdr = kzalloc(len, GFP_KERNEL);
	if (hdr == NULL) {
+2 −0
Original line number Diff line number Diff line
@@ -27,7 +27,9 @@
#include <linux/cdev.h>
#include <linux/ipa_odu_bridge.h>
#include "../ipa_common_i.h"
#ifdef CONFIG_IPA3
#include "../ipa_v3/ipa_pm.h"
#endif

#define ODU_BRIDGE_DRV_NAME "odu_ipa_bridge"

+18 −3
Original line number Diff line number Diff line
@@ -28,7 +28,9 @@
#include <linux/rndis_ipa.h>
#include <linux/workqueue.h>
#include "../ipa_common_i.h"
#ifdef CONFIG_IPA3
#include "../ipa_v3/ipa_pm.h"
#endif

#define CREATE_TRACE_POINTS
#include "rndis_ipa_trace.h"
@@ -240,8 +242,10 @@ static void rndis_ipa_rm_notify
	unsigned long data);
static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx);
static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx);
#ifdef CONFIG_IPA3
static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx);
static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx);
#endif
static bool rx_filter(struct sk_buff *skb);
static bool tx_filter(struct sk_buff *skb);
static bool rm_enabled(struct rndis_ipa_dev *rndis_ipa_ctx);
@@ -721,9 +725,11 @@ int rndis_ipa_pipe_connect_notify(
		return -EINVAL;
	}

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		result = rndis_ipa_register_pm_client(rndis_ipa_ctx);
	else
#endif
		result = rndis_ipa_create_rm_resource(rndis_ipa_ctx);
	if (result) {
		RNDIS_IPA_ERROR("fail on RM create\n");
@@ -787,9 +793,11 @@ int rndis_ipa_pipe_connect_notify(
	return 0;

fail:
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		rndis_ipa_deregister_pm_client(rndis_ipa_ctx);
	else
#endif
		rndis_ipa_destroy_rm_resource(rndis_ipa_ctx);
fail_create_rm:
	return result;
@@ -1262,9 +1270,11 @@ int rndis_ipa_pipe_disconnect_notify(void *private)
	rndis_ipa_ctx->net->stats.tx_dropped += outstanding_dropped_pkts;
	atomic_set(&rndis_ipa_ctx->outstanding_pkts, 0);

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		retval = rndis_ipa_deregister_pm_client(rndis_ipa_ctx);
	else
#endif
		retval = rndis_ipa_destroy_rm_resource(rndis_ipa_ctx);
	if (retval) {
		RNDIS_IPA_ERROR("Fail to clean RM\n");
@@ -1822,6 +1832,7 @@ static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx)
	return result;
}

#ifdef CONFIG_IPA3
static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event)
{
	struct rndis_ipa_dev *rndis_ipa_ctx = p;
@@ -1844,7 +1855,7 @@ static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event)

	RNDIS_IPA_LOG_EXIT();
}

#endif
/**
 * rndis_ipa_destroy_rm_resource() - delete the dependency and destroy
 * the resource done on rndis_ipa_create_rm_resource()
@@ -1904,6 +1915,7 @@ static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx)
	return result;
}

#ifdef CONFIG_IPA3
static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx)
{
	int result;
@@ -1930,7 +1942,7 @@ static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx)
	rndis_ipa_ctx->pm_hdl = ~0;
	return 0;
}

#endif
/**
 * resource_request() - request for the Netdev resource
 * @rndis_ipa_ctx: main driver context
@@ -1951,9 +1963,10 @@ static int resource_request(struct rndis_ipa_dev *rndis_ipa_ctx)
	if (!rm_enabled(rndis_ipa_ctx))
		return result;

#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		return ipa_pm_activate(rndis_ipa_ctx->pm_hdl);

#endif
	return ipa_rm_inactivity_timer_request_resource(
			DRV_RESOURCE_ID);

@@ -1972,9 +1985,11 @@ static void resource_release(struct rndis_ipa_dev *rndis_ipa_ctx)
{
	if (!rm_enabled(rndis_ipa_ctx))
		return;
#ifdef CONFIG_IPA3
	if (ipa_pm_is_used())
		ipa_pm_deferred_deactivate(rndis_ipa_ctx->pm_hdl);
	else
#endif
		ipa_rm_inactivity_timer_release_resource(DRV_RESOURCE_ID);

	return;
+17 −6
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
#include <linux/qcom_iommu.h>
#include <linux/time.h>
#include <linux/hashtable.h>
#include <linux/hash.h>
#include <linux/jhash.h>
#include "ipa_i.h"
#include "../ipa_rm_i.h"

@@ -3281,7 +3281,7 @@ void ipa2_active_clients_log_mod(struct ipa_active_client_logging_info *id,
	hfound = NULL;
	memset(str_to_hash, 0, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN);
	strlcpy(str_to_hash, id->id_string, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN);
	hkey = arch_fast_hash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN,
	hkey = jhash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN,
			0);
	hash_for_each_possible(ipa_ctx->ipa2_active_clients_logging.htable,
			hentry, list, hkey) {
@@ -3730,7 +3730,8 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt,
					 * acquire wake lock as long as suspend
					 * vote is held
					 */
					ipa_inc_acquire_wakelock();
					ipa_inc_acquire_wakelock(
						IPA_WAKELOCK_REF_CLIENT_SPS);
					ipa_sps_process_irq_schedule_rel();
				}
				mutex_unlock(&ipa_ctx->sps_pm.sps_pm_lock);
@@ -3803,7 +3804,7 @@ static void ipa_sps_release_resource(struct work_struct *work)
			ipa_sps_process_irq_schedule_rel();
		} else {
			atomic_set(&ipa_ctx->sps_pm.dec_clients, 0);
			ipa_dec_release_wakelock();
			ipa_dec_release_wakelock(IPA_WAKELOCK_REF_CLIENT_SPS);
			IPA_ACTIVE_CLIENTS_DEC_SPECIAL("SPS_RESOURCE");
		}
	}
@@ -3922,6 +3923,7 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
	ipa_ctx->skip_uc_pipe_reset = resource_p->skip_uc_pipe_reset;
	ipa_ctx->use_dma_zone = resource_p->use_dma_zone;
	ipa_ctx->tethered_flow_control = resource_p->tethered_flow_control;
	ipa_ctx->use_ipa_pm = resource_p->use_ipa_pm;

	/* Setting up IPA RX Polling Timeout Seconds */
	ipa_rx_timeout_min_max_calc(&ipa_ctx->ipa_rx_min_timeout_usec,
@@ -3973,7 +3975,8 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
				ipa_ctx->ctrl->msm_bus_data_ptr);
		if (!ipa_ctx->ipa_bus_hdl) {
			IPAERR("fail to register with bus mgr!\n");
			result = -ENODEV;
			result = -EPROBE_DEFER;
			bus_scale_table = NULL;
			goto fail_bus_reg;
		}
	} else {
@@ -4429,11 +4432,11 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
	ipa2_active_clients_log_destroy();
fail_init_active_client:
	msm_bus_scale_unregister_client(ipa_ctx->ipa_bus_hdl);
fail_bus_reg:
	if (bus_scale_table) {
		msm_bus_cl_clear_pdata(bus_scale_table);
		bus_scale_table = NULL;
	}
fail_bus_reg:
fail_bind:
	kfree(ipa_ctx->ctrl);
fail_mem_ctrl:
@@ -4445,12 +4448,20 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
	return result;
}

bool ipa_pm_is_used(void)
{
	return (ipa_ctx) ? ipa_ctx->use_ipa_pm : false;
}

static int get_ipa_dts_configuration(struct platform_device *pdev,
		struct ipa_plat_drv_res *ipa_drv_res)
{
	int result;
	struct resource *resource;

	ipa_drv_res->use_ipa_pm = of_property_read_bool(pdev->dev.of_node,
		"qcom,use-ipa-pm");
	IPADBG("use_ipa_pm=%d\n", ipa_drv_res->use_ipa_pm);
	/* initialize ipa_res */
	ipa_drv_res->ipa_pipe_mem_start_ofst = IPA_PIPE_MEM_START_OFST;
	ipa_drv_res->ipa_pipe_mem_size = IPA_PIPE_MEM_SIZE;
Loading