Loading drivers/platform/msm/gsi/gsi.c +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading drivers/platform/msm/gsi/gsi.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +24 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading @@ -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); } /** Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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; Loading include/linux/msm_gsi.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 * */ Loading @@ -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 Loading
drivers/platform/msm/gsi/gsi.c +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading
drivers/platform/msm/gsi/gsi.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +24 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) Loading @@ -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); } /** Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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; Loading
include/linux/msm_gsi.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 * */ Loading @@ -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