summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2023-10-09 11:30:11 -0700
committerPindar Yang <pindaryang@google.com>2023-10-11 07:02:50 +0000
commitf7d1ed25de655e15fdc066e4e1c779826684723a (patch)
tree2cf54229f16420e5db3bd489daeaf6b9541d985b
parent75ada36a0c96d6b028786b0ed9c61f0a7a82fd4f (diff)
parent89b5a47bfcce5de1d5a885087dde90d4c97f858e (diff)
downloadaoc-f7d1ed25de655e15fdc066e4e1c779826684723a.tar.gz
Merge android13-gs-pixel-5.10-udc-qpr1 into android13-gs-pixel-5.10-24Q1
Conflict files: aoc.c Bug: 300854197 SBMerger: 571992243 Change-Id: I4f8cbdab0ca7783ac37cbfc5fb326de12703d481 Signed-off-by: Pindar Yang <pindaryang@google.com>
-rw-r--r--aoc.c6
-rw-r--r--aoc.h3
-rw-r--r--aoc_v1.c26
3 files changed, 28 insertions, 7 deletions
diff --git a/aoc.c b/aoc.c
index 8a0daae..6846262 100644
--- a/aoc.c
+++ b/aoc.c
@@ -641,7 +641,7 @@ static void aoc_fw_callback(const struct firmware *fw, void *ctx)
aoc_release_from_reset(prvdata);
}
- enable_irq(prvdata->watchdog_irq);
+ configure_crash_interrupts(prvdata, true);
/* Monitor if there is callback from aoc after 5sec */
cancel_delayed_work_sync(&prvdata->monitor_work);
@@ -948,7 +948,7 @@ static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
if (prvdata->no_ap_resets) {
dev_err(dev, "Reset request rejected, option disabled via persist options");
} else {
- disable_irq_nosync(prvdata->watchdog_irq);
+ configure_crash_interrupts(prvdata, false);
strlcpy(prvdata->ap_reset_reason, reason_str, AP_RESET_REASON_LENGTH);
prvdata->ap_triggered_reset = true;
schedule_work(&prvdata->watchdog_work);
@@ -2560,7 +2560,7 @@ static void aoc_platform_shutdown(struct platform_device *pdev)
{
struct aoc_prvdata *prvdata = platform_get_drvdata(pdev);
- disable_irq_nosync(prvdata->watchdog_irq);
+ configure_crash_interrupts(prvdata, false);
aoc_take_offline(prvdata);
}
diff --git a/aoc.h b/aoc.h
index afa7fbc..dfd39bb 100644
--- a/aoc.h
+++ b/aoc.h
@@ -120,6 +120,7 @@ struct aoc_prvdata {
int watchdog_irq;
struct work_struct watchdog_work;
+ bool first_fw_load;
bool aoc_reset_done;
bool ap_triggered_reset;
bool force_release_aoc;
@@ -284,6 +285,8 @@ bool aoc_fw_ready(void);
u32 dt_property(struct device_node *node, const char *key);
+void configure_crash_interrupts(struct aoc_prvdata *prvdata, bool enable);
+
#define AOC_SERVICE_NAME_LENGTH 32
/* Rings should have the ring flag set, slots = 1, size = ring size
diff --git a/aoc_v1.c b/aoc_v1.c
index 3370e86..6689a5a 100644
--- a/aoc_v1.c
+++ b/aoc_v1.c
@@ -136,8 +136,6 @@ int aoc_watchdog_restart(struct aoc_prvdata *prvdata,
return AOC_RESTART_DISABLED_RC;
aoc_reset_successful = false;
- disable_irq_nosync(prvdata->sysmmu_nonsecure_irq);
- disable_irq_nosync(prvdata->sysmmu_secure_irq);
for (i = 0; i < aoc_reset_tries; i++) {
dev_info(prvdata->dev, "asserting aoc_req\n");
request_aoc_on(prvdata, true);
@@ -179,8 +177,6 @@ int aoc_watchdog_restart(struct aoc_prvdata *prvdata,
panic("AoC kernel panic: timed out waiting for aoc_ack");
}
- enable_irq(prvdata->sysmmu_nonsecure_irq);
- enable_irq(prvdata->sysmmu_secure_irq);
if (!aoc_reset_successful) {
/* Trigger acpm ramdump since we timed out the aoc reset request */
dbg_snapshot_emergency_reboot("AoC Restart timed out");
@@ -439,6 +435,7 @@ int configure_watchdog_interrupt(struct platform_device *pdev, struct aoc_prvdat
ret);
return -EIO;
}
+ prvdata->first_fw_load = true;
return ret;
}
@@ -496,3 +493,24 @@ void aoc_configure_ssmt(struct platform_device *pdev
{}
#endif
EXPORT_SYMBOL_GPL(aoc_configure_ssmt);
+
+void configure_crash_interrupts(struct aoc_prvdata *prvdata, bool enable)
+{
+ if (prvdata->first_fw_load) {
+ /* Default irq state of watchdog is off and sysmmu is on.
+ * When loading aoc firmware in first time
+ * Enable only irq of watchdog for balance irq state
+ */
+ enable_irq(prvdata->watchdog_irq);
+ prvdata->first_fw_load = false;
+ } else if (enable) {
+ enable_irq(prvdata->sysmmu_nonsecure_irq);
+ enable_irq(prvdata->sysmmu_secure_irq);
+ enable_irq(prvdata->watchdog_irq);
+ } else {
+ disable_irq(prvdata->sysmmu_nonsecure_irq);
+ disable_irq(prvdata->sysmmu_secure_irq);
+ disable_irq_nosync(prvdata->watchdog_irq);
+ }
+}
+EXPORT_SYMBOL_GPL(configure_crash_interrupts);