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

Commit 8e8789e5 authored by Ghanim Fodi's avatar Ghanim Fodi
Browse files

msm: ipa: Adapt EE area registers for IPA4.5



Adapt EE area IPA registers to the H/W changes
at IPA version 4.5. This includes e.g. the IPA
interrupt registers.

CRs-Fixed: 2303588
Change-Id: If8ad2fafb0cca0e591c40105a17dcb5c9e2a5256
Signed-off-by: default avatarGhanim Fodi <gfodi@codeaurora.org>
parent 8920695f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4268,7 +4268,7 @@ int ipa3_init_interrupts(void)
	return 0;

fail_add_interrupt_handler:
	free_irq(ipa3_res.ipa_irq, &ipa3_ctx->master_pdev->dev);
	ipa3_interrupts_destroy(ipa3_res.ipa_irq, &ipa3_ctx->master_pdev->dev);
	return result;
}

+1 −0
Original line number Diff line number Diff line
@@ -2398,6 +2398,7 @@ int ipa3_active_clients_log_print_buffer(char *buf, int size);
int ipa3_active_clients_log_print_table(char *buf, int size);
void ipa3_active_clients_log_clear(void);
int ipa3_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev);
void ipa3_interrupts_destroy(u32 ipa_irq, struct device *ipa_dev);
int __ipa3_del_rt_rule(u32 rule_hdl);
int __ipa3_del_hdr(u32 hdr_hdl, bool by_user);
int __ipa3_release_hdr(u32 hdr_hdl);
+48 −9
Original line number Diff line number Diff line
@@ -43,10 +43,7 @@ static spinlock_t suspend_wa_lock;
static void ipa3_process_interrupts(bool isr_context);

static int ipa3_irq_mapping[IPA_IRQ_MAX] = {
	[IPA_UC_TX_CMD_Q_NOT_FULL_IRQ]		= -1,
	[IPA_UC_TO_PROC_ACK_Q_NOT_FULL_IRQ]	= -1,
	[IPA_BAD_SNOC_ACCESS_IRQ]		= 0,
	[IPA_EOT_COAL_IRQ]			= -1,
	[IPA_UC_IRQ_0]				= 2,
	[IPA_UC_IRQ_1]				= 3,
	[IPA_UC_IRQ_2]				= 4,
@@ -61,7 +58,17 @@ static int ipa3_irq_mapping[IPA_IRQ_MAX] = {
	[IPA_PROC_ERR_IRQ]			= 13,
	[IPA_TX_SUSPEND_IRQ]			= 14,
	[IPA_TX_HOLB_DROP_IRQ]			= 15,
	[IPA_GSI_IDLE_IRQ]			= 16,
	[IPA_BAM_GSI_IDLE_IRQ]			= 16,
	[IPA_PIPE_YELLOW_MARKER_BELOW_IRQ]	= 17,
	[IPA_PIPE_RED_MARKER_BELOW_IRQ]		= 18,
	[IPA_PIPE_YELLOW_MARKER_ABOVE_IRQ]	= 19,
	[IPA_PIPE_RED_MARKER_ABOVE_IRQ]		= 20,
	[IPA_UCP_IRQ]				= 21,
	[IPA_DCMP_IRQ]				= 22,
	[IPA_GSI_EE_IRQ]			= 23,
	[IPA_GSI_IPA_IF_TLV_RCVD_IRQ]		= 24,
	[IPA_GSI_UC_IRQ]			= 25,
	[IPA_TLV_LEN_MIN_DSM_IRQ]		= 26,
};

static void ipa3_interrupt_defer(struct work_struct *work);
@@ -73,7 +80,7 @@ static void ipa3_deferred_interrupt_work(struct work_struct *work)
			container_of(work,
			struct ipa3_interrupt_work_wrap,
			interrupt_work);
	IPADBG("call handler from workq... interrupt=%d\n",
	IPADBG("call handler from workq for interrupt %d...\n",
		work_data->interrupt);
	work_data->handler(work_data->interrupt, work_data->private_data,
			work_data->interrupt_data);
@@ -114,7 +121,7 @@ static int ipa3_handle_interrupt(int irq_num, bool isr_context)
	case IPA_TX_SUSPEND_IRQ:
		IPADBG_LOW("processing TX_SUSPEND interrupt\n");
		ipa3_tx_suspend_interrupt_wa();
		suspend_data = ipahal_read_reg_n(IPA_IRQ_SUSPEND_INFO_EE_n,
		suspend_data = ipahal_read_reg_n(IPA_SUSPEND_IRQ_INFO_EE_n,
			ipa_ee);
		IPADBG_LOW("get interrupt %d\n", suspend_data);

@@ -223,6 +230,7 @@ static void ipa3_tx_suspend_interrupt_wa(void)
	u32 val;
	u32 suspend_bmask;
	int irq_num;
	int wa_delay;

	IPADBG_LOW("Enter\n");
	irq_num = ipa3_irq_mapping[IPA_TX_SUSPEND_IRQ];
@@ -241,8 +249,17 @@ static void ipa3_tx_suspend_interrupt_wa(void)
	ipa3_uc_rg10_write_reg(IPA_IRQ_EN_EE_n, ipa_ee, val);

	IPADBG_LOW(" processing suspend interrupt work-around, delayed work\n");

	wa_delay = DIS_SUSPEND_INTERRUPT_TIMEOUT;
	if (ipa3_ctx->ipa3_hw_mode == IPA_HW_MODE_VIRTUAL ||
	    ipa3_ctx->ipa3_hw_mode == IPA_HW_MODE_EMULATION) {
		wa_delay *= 400;
	}

	IPADBG_LOW("Delay period %d msec\n", wa_delay);

	queue_delayed_work(ipa_interrupt_wq, &dwork_en_suspend_int,
			msecs_to_jiffies(DIS_SUSPEND_INTERRUPT_TIMEOUT));
			msecs_to_jiffies(wa_delay));

	IPADBG_LOW("Exit\n");
}
@@ -274,9 +291,9 @@ static void ipa3_process_interrupts(bool isr_context)
		IPADBG_LOW("en=0x%x reg=0x%x\n", en, reg);
		bmsk = 1;
		for (i = 0; i < IPA_IRQ_NUM_MAX; i++) {
			IPADBG_LOW("Check irq num %d\n", i);
			IPADBG_LOW("Check irq number %d\n", i);
			if (en & reg & bmsk) {
				IPADBG_LOW("irq num %d asserted\n", i);
				IPADBG_LOW("Irq number %d asserted\n", i);
				uc_irq = is_uc_irq(i);

				/*
@@ -525,6 +542,8 @@ int ipa3_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev)
			IPAERR(
			    "fail to register IPA IRQ handler irq=%d\n",
			    ipa_irq);
			destroy_workqueue(ipa_interrupt_wq);
			ipa_interrupt_wq = NULL;
			return -ENODEV;
		}
		IPADBG("IPA IRQ handler irq=%d registered\n", ipa_irq);
@@ -540,6 +559,26 @@ int ipa3_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev)
	return 0;
}

/**
 * ipa3_interrupts_destroy() - Destroy the IPA interrupts framework
 * @ipa_irq:	The interrupt number to allocate
 * @ee:		Execution environment
 * @ipa_dev:	The basic device structure representing the IPA driver
 *
 * - Disable apps processor wakeup by IPA interrupts
 * - Unregister the ipa interrupt handler - ipa3_isr
 * - Destroy the interrupt workqueue
 */
void ipa3_interrupts_destroy(u32 ipa_irq, struct device *ipa_dev)
{
	if (ipa3_ctx->ipa3_hw_mode != IPA_HW_MODE_EMULATION) {
		disable_irq_wake(ipa_irq);
		free_irq(ipa_irq, ipa_dev);
	}
	destroy_workqueue(ipa_interrupt_wq);
	ipa_interrupt_wq = NULL;
}

/**
 * ipa3_suspend_active_aggr_wa() - Emulate suspend IRQ
 * @clnt_hndl:		suspended client handle, IRQ is emulated for this pipe
+4 −20
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ static const char *ipareg_name_to_str[IPA_REG_MAX] = {
	__stringify(IPA_IRQ_STTS_EE_n),
	__stringify(IPA_IRQ_EN_EE_n),
	__stringify(IPA_IRQ_CLR_EE_n),
	__stringify(IPA_IRQ_SUSPEND_INFO_EE_n),
	__stringify(IPA_SUSPEND_IRQ_INFO_EE_n),
	__stringify(IPA_SUSPEND_IRQ_EN_EE_n),
	__stringify(IPA_SUSPEND_IRQ_CLR_EE_n),
	__stringify(IPA_HOLB_DROP_IRQ_INFO_EE_n),
@@ -143,11 +143,7 @@ static const char *ipareg_name_to_str[IPA_REG_MAX] = {
	__stringify(IPA_FEC_ADDR_EE_n),
	__stringify(IPA_FEC_ADDR_MSB_EE_n),
	__stringify(IPA_FEC_ATTR_EE_n),
	__stringify(IPA_MBIM_DEAGGR_FEC_ATTR_EE_n),
	__stringify(IPA_GEN_DEAGGR_FEC_ATTR_EE_n),
	__stringify(IPA_GSI_CONF),
	__stringify(IPA_ENDP_GSI_CFG1_n),
	__stringify(IPA_ENDP_GSI_CFG2_n),
	__stringify(IPA_ENDP_GSI_CFG_AOS_n),
	__stringify(IPA_ENDP_GSI_CFG_TLV_n),
};
@@ -2320,7 +2316,7 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {
	[IPA_HW_v3_0][IPA_IRQ_CLR_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003010, 0x1000, 0, 0, 0},
	[IPA_HW_v3_0][IPA_IRQ_SUSPEND_INFO_EE_n] = {
	[IPA_HW_v3_0][IPA_SUSPEND_IRQ_INFO_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003098, 0x1000, 0, 0, 0},
	[IPA_HW_v3_0][IPA_BCR] = {
@@ -2499,7 +2495,7 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {


	/* IPAv3.1 */
	[IPA_HW_v3_1][IPA_IRQ_SUSPEND_INFO_EE_n] = {
	[IPA_HW_v3_1][IPA_SUSPEND_IRQ_INFO_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003030, 0x1000, 0, 0, 0},
	[IPA_HW_v3_1][IPA_SUSPEND_IRQ_EN_EE_n] = {
@@ -2565,15 +2561,9 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {
	[IPA_HW_v3_5][IPA_COUNTER_CFG] = {
		ipareg_construct_counter_cfg, ipareg_parse_counter_cfg,
		0x000001F0, 0, 0, 0, 0},
	[IPA_HW_v3_5][IPA_GSI_CONF] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00002790, 0x0, 0, 0, 0 },
	[IPA_HW_v3_5][IPA_ENDP_GSI_CFG1_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00002794, 0x4, 0, 0, 0 },
	[IPA_HW_v3_5][IPA_ENDP_GSI_CFG2_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00002A2C, 0x4, 0, 0, 0 },
	[IPA_HW_v3_5][IPA_ENDP_GSI_CFG_AOS_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x000029A8, 0x4, 0, 0, 0 },
@@ -2585,7 +2575,7 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {
		0x0001e1fc, 0, 0, 0, 0},

	/* IPAv4.0 */
	[IPA_HW_v4_0][IPA_IRQ_SUSPEND_INFO_EE_n] = {
	[IPA_HW_v4_0][IPA_SUSPEND_IRQ_INFO_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003030, 0x1000, 0, 1, 1},
	[IPA_HW_v4_0][IPA_SUSPEND_IRQ_EN_EE_n] = {
@@ -2796,12 +2786,6 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = {
	[IPA_HW_v4_0][IPA_FEC_ATTR_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003028, 0x1000, 0, 0, 1},
	[IPA_HW_v4_0][IPA_MBIM_DEAGGR_FEC_ATTR_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003028, 0x1000, 0, 0, 1},
	[IPA_HW_v4_0][IPA_GEN_DEAGGR_FEC_ATTR_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x00003028, 0x1000, 0, 0, 1},
	[IPA_HW_v4_0][IPA_HOLB_DROP_IRQ_INFO_EE_n] = {
		ipareg_construct_dummy, ipareg_parse_dummy,
		0x0000303C, 0x1000, 0, 0, 1},
+1 −5
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ enum ipahal_reg_name {
	IPA_IRQ_STTS_EE_n,
	IPA_IRQ_EN_EE_n,
	IPA_IRQ_CLR_EE_n,
	IPA_IRQ_SUSPEND_INFO_EE_n,
	IPA_SUSPEND_IRQ_INFO_EE_n,
	IPA_SUSPEND_IRQ_EN_EE_n,
	IPA_SUSPEND_IRQ_CLR_EE_n,
	IPA_HOLB_DROP_IRQ_INFO_EE_n,
@@ -144,11 +144,7 @@ enum ipahal_reg_name {
	IPA_FEC_ADDR_EE_n,
	IPA_FEC_ADDR_MSB_EE_n,
	IPA_FEC_ATTR_EE_n,
	IPA_MBIM_DEAGGR_FEC_ATTR_EE_n,
	IPA_GEN_DEAGGR_FEC_ATTR_EE_n,
	IPA_GSI_CONF,
	IPA_ENDP_GSI_CFG1_n,
	IPA_ENDP_GSI_CFG2_n,
	IPA_ENDP_GSI_CFG_AOS_n,
	IPA_ENDP_GSI_CFG_TLV_n,
	IPA_REG_MAX,
Loading