msm: ipa4: debug patch gsi interrupt issue

Debug patch for GSI interrupt issue.

Change-Id: I705cd893233e1afcaeed6fedb424830e39621114
Acked-by: Ashok Vuyyuru <avuyyuru@qti.qualcomm.com>
Signed-off-by: Bojun Pan <bojunp@codeaurora.org>
tirimbino
Bojun Pan 5 years ago
parent f280e41fca
commit 46b75bd1b2
  1. 7
      drivers/platform/msm/gsi/gsi.c
  2. 2
      drivers/platform/msm/gsi/gsi.h
  3. 25
      drivers/platform/msm/ipa/ipa_v3/ipa.c
  4. 2
      include/linux/msm_gsi.h

@ -27,6 +27,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
@ -811,8 +812,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;

@ -234,6 +234,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 {

@ -131,6 +131,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 struct ipa3_plat_drv_res ipa3_res = {0, };
static struct clk *ipa3_clk;
@ -4991,6 +4995,12 @@ 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();
if (ipa3_ctx->use_ipa_pm)
@ -4998,7 +5008,6 @@ void ipa3_disable_clks(void)
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);
}
/**
@ -5180,6 +5189,12 @@ void ipa3_inc_client_enable_clks(struct ipa_active_client_logging_info *id)
mutex_unlock(&ipa3_ctx->ipa3_active_clients.mutex);
}
static 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
@ -5284,6 +5299,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
@ -6127,6 +6149,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;

@ -103,6 +103,7 @@ enum gsi_intr_type {
* @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
* All the callbacks are in interrupt context
*
*/
@ -125,6 +126,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);
};
enum gsi_evt_err {

Loading…
Cancel
Save