|
@@ -122,6 +122,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,
|
|
static DECLARE_DELAYED_WORK(ipa_dec_clients_disable_clks_on_wq_work,
|
|
ipa_dec_clients_disable_clks_on_wq);
|
|
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_v2(unsigned long arg);
|
|
static int ipa3_ioctl_add_rt_rule_ext_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);
|
|
static int ipa3_ioctl_add_rt_rule_after_v2(unsigned long arg);
|
|
@@ -4839,6 +4843,12 @@ void ipa3_disable_clks(void)
|
|
|
|
|
|
IPADBG("disabling IPA clocks and bus voting\n");
|
|
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();
|
|
ipa3_ctx->ctrl->ipa3_disable_clks();
|
|
|
|
|
|
ipa_pm_set_clock_index(0);
|
|
ipa_pm_set_clock_index(0);
|
|
@@ -5024,6 +5034,12 @@ void ipa3_inc_client_enable_clks(struct ipa_active_client_logging_info *id)
|
|
mutex_unlock(&ipa3_ctx->ipa3_active_clients.mutex);
|
|
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
|
|
* ipa3_active_clks_status() - update the current msm bus clock vote
|
|
* status
|
|
* status
|
|
@@ -5140,6 +5156,13 @@ static void ipa_dec_clients_disable_clks_on_wq(struct work_struct *work)
|
|
__ipa3_dec_client_disable_clks();
|
|
__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
|
|
* ipa3_dec_client_disable_clks_no_block() - Decrease active clients counter
|
|
* if possible without blocking. If this is the last client then the desrease
|
|
* if possible without blocking. If this is the last client then the desrease
|
|
@@ -5960,6 +5983,7 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
|
|
gsi_props.req_clk_cb = NULL;
|
|
gsi_props.req_clk_cb = NULL;
|
|
gsi_props.rel_clk_cb = NULL;
|
|
gsi_props.rel_clk_cb = NULL;
|
|
gsi_props.clk_status_cb = ipa3_active_clks_status;
|
|
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) {
|
|
if (ipa3_ctx->ipa_config_is_mhi) {
|
|
gsi_props.mhi_er_id_limits_valid = true;
|
|
gsi_props.mhi_er_id_limits_valid = true;
|