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

Commit 097e4e47 authored by Bojun Pan's avatar Bojun Pan Committed by Gerrit - the friendly Code Review server
Browse files

msm: ipa4: debug patch gsi interrupt issue



Debug patch for GSI interrupt issue.

Change-Id: I705cd893233e1afcaeed6fedb424830e39621114
Acked-by: default avatarAshok Vuyyuru <avuyyuru@qti.qualcomm.com>
Signed-off-by: default avatarBojun Pan <bojunp@codeaurora.org>
parent 73309377
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#define GSI_CMD_POLL_CNT 5
#define GSI_STOP_CMD_TIMEOUT_MS 200
#define GSI_MAX_CH_LOW_WEIGHT 15
#define GSI_IRQ_STORM_THR 5

#define GSI_STOP_CMD_POLL_CNT 4
#define GSI_STOP_IN_PROC_CMD_POLL_CNT 2
@@ -806,8 +807,14 @@ static irqreturn_t gsi_isr(int irq, void *ctxt)
			gsi_ctx->per.rel_clk_cb(gsi_ctx->per.user_data);
		}
	} else if (!gsi_ctx->per.clk_status_cb()) {
	/* we only want to capture the gsi isr storm here */
		if (atomic_read(&gsi_ctx->num_unclock_irq) ==
			GSI_IRQ_STORM_THR)
			gsi_ctx->per.enable_clk_bug_on();
		atomic_inc(&gsi_ctx->num_unclock_irq);
		return IRQ_HANDLED;
	} else {
		atomic_set(&gsi_ctx->num_unclock_irq, 0);
		gsi_handle_irq();
	}
	return IRQ_HANDLED;
+2 −0
Original line number Diff line number Diff line
@@ -237,6 +237,8 @@ struct gsi_ctx {
	u32 intcntrlr_mem_size;
	irq_handler_t intcntrlr_gsi_isr;
	irq_handler_t intcntrlr_client_isr;

	atomic_t num_unclock_irq;
};

enum gsi_re_type {
+24 −1
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ static void ipa_dec_clients_disable_clks_on_wq(struct work_struct *work);
static DECLARE_DELAYED_WORK(ipa_dec_clients_disable_clks_on_wq_work,
	ipa_dec_clients_disable_clks_on_wq);

static void ipa_inc_clients_enable_clks_on_wq(struct work_struct *work);
static DECLARE_WORK(ipa_inc_clients_enable_clks_on_wq_work,
	ipa_inc_clients_enable_clks_on_wq);

static int ipa3_ioctl_add_rt_rule_v2(unsigned long arg);
static int ipa3_ioctl_add_rt_rule_ext_v2(unsigned long arg);
static int ipa3_ioctl_add_rt_rule_after_v2(unsigned long arg);
@@ -4834,13 +4838,18 @@ void ipa3_disable_clks(void)

	IPADBG("disabling IPA clocks and bus voting\n");

	/*
	 * We see a NoC error on GSI on this flag sequence.
	 * Need to set this flag first before clock off.
	 */
	atomic_set(&ipa3_ctx->ipa_clk_vote, 0);

	ipa3_ctx->ctrl->ipa3_disable_clks();

	ipa_pm_set_clock_index(0);

	if (msm_bus_scale_client_update_request(ipa3_ctx->ipa_bus_hdl, 0))
		WARN(1, "bus scaling failed");
	atomic_set(&ipa3_ctx->ipa_clk_vote, 0);
}

/**
@@ -5013,6 +5022,12 @@ void ipa3_inc_client_enable_clks(struct ipa_active_client_logging_info *id)
	mutex_unlock(&ipa3_ctx->ipa3_active_clients.mutex);
}

void ipa3_handle_gsi_differ_irq(void)
{
	queue_work(ipa3_ctx->power_mgmt_wq,
		&ipa_inc_clients_enable_clks_on_wq_work);
}

/**
 * ipa3_active_clks_status() - update the current msm bus clock vote
 * status
@@ -5129,6 +5144,13 @@ static void ipa_dec_clients_disable_clks_on_wq(struct work_struct *work)
	__ipa3_dec_client_disable_clks();
}

static void ipa_inc_clients_enable_clks_on_wq(struct work_struct *work)
{
	ipa3_enable_clks();
	IPAERR("unexpected clk access, clock on IPA to save reg");
	ipa_assert();
}

/**
 * ipa3_dec_client_disable_clks_no_block() - Decrease active clients counter
 * if possible without blocking. If this is the last client then the desrease
@@ -5924,6 +5946,7 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	gsi_props.req_clk_cb = NULL;
	gsi_props.rel_clk_cb = NULL;
	gsi_props.clk_status_cb = ipa3_active_clks_status;
	gsi_props.enable_clk_bug_on = ipa3_handle_gsi_differ_irq;

	if (ipa3_ctx->ipa_config_is_mhi) {
		gsi_props.mhi_er_id_limits_valid = true;
+2 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ enum gsi_intr_type {
 * @rel_clk_cb: callback to release peripheral clock
 * @user_data:  cookie used for notifications
 * @clk_status_cb: callback to update the current msm bus clock vote
 * @enable_clk_bug_on: enable IPA clock for dump saving before assert
 * @skip_ieob_mask_wa: flag for skipping ieob_mask_wa
 * All the callbacks are in interrupt context
 *
@@ -120,6 +121,7 @@ struct gsi_per_props {
	int (*rel_clk_cb)(void *user_data);
	void *user_data;
	int (*clk_status_cb)(void);
	void (*enable_clk_bug_on)(void);
	bool skip_ieob_mask_wa;
};