summaryrefslogtreecommitdiff
path: root/gxp-firmware.c
diff options
context:
space:
mode:
authorAurora pro automerger <aurora-pro-automerger@google.com>2022-04-22 17:10:21 +0800
committerSermin Aydin <sermin@google.com>2022-05-12 04:51:44 +0000
commitfa5cf5721220d5b97544ea56b91bd9f2590debac (patch)
tree649f29e1c371a1c02c87ec038290c507ff2e1b12 /gxp-firmware.c
parent27bed782f3a828674c0f1584cf355bf592c382be (diff)
downloadgs201-fa5cf5721220d5b97544ea56b91bd9f2590debac.tar.gz
[Copybara Auto Merge] Merge branch 'gs201-release' into 'android13-gs-pixel-5.10'
Cherry-pick of Suspend/Resume support gxp: reset CMU regs on blk_off Bug: 231759324 gxp: detach all aux domains when we fail to resume Bug: 231707796 gxp: Hold cores failing to suspend in reset Bug: 231663916 gxp: fix multicore resume if blk is restarted Bug: 231681021 gxp: Release pm_lock before flushing pm workers Bug: 231266703 gxp: update minor version for suspend/resume Bug: 209083969 gxp: handle suspend/resume failure gxp: implement core suspend/resume gxp: reset CMU on PM init Bug: 231291191 gxp: protect mailbox registers from corruption Bug: 231265938 gxp: only set curr_state on non-OFF req Bug: 231291187 gxp: Log clients holding wakelocks on suspend Bug: 230931995 gxp: set boot mode to cold boot on firmware run Bug: 230818196 gxp: change default off LPM state from PS2 to PS3 Bug: 229801235 GitOrigin-RevId: 2520913f6599abeefee27275b056d73f15e2178d Change-Id: I1c15420e06771dff507f29053bc5bba010e46314
Diffstat (limited to 'gxp-firmware.c')
-rw-r--r--gxp-firmware.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/gxp-firmware.c b/gxp-firmware.c
index df4e192..6e079fb 100644
--- a/gxp-firmware.c
+++ b/gxp-firmware.c
@@ -20,6 +20,7 @@
#include "gxp-debug-dump.h"
#include "gxp-doorbell.h"
#include "gxp-firmware.h"
+#include "gxp-host-device-structs.h"
#include "gxp-internal.h"
#include "gxp-lpm.h"
#include "gxp-mailbox.h"
@@ -215,9 +216,27 @@ gxp_firmware_load_authenticated(struct gxp_dev *gxp, const struct firmware *fw,
/* Forward declaration for usage inside gxp_firmware_load(..). */
static void gxp_firmware_unload(struct gxp_dev *gxp, uint core);
+static void gxp_program_reset_vector(struct gxp_dev *gxp, uint core, bool verbose)
+{
+ u32 reset_vec;
+
+ reset_vec = gxp_read_32_core(gxp, core,
+ GXP_REG_ALT_RESET_VECTOR);
+ if (verbose)
+ dev_notice(gxp->dev,
+ "Current Aurora reset vector for core %u: 0x%x\n",
+ core, reset_vec);
+ gxp_write_32_core(gxp, core, GXP_REG_ALT_RESET_VECTOR,
+ gxp->fwbufs[core].daddr);
+ if (verbose)
+ dev_notice(gxp->dev,
+ "New Aurora reset vector for core %u: 0x%llx\n",
+ core, gxp->fwbufs[core].daddr);
+}
+
static int gxp_firmware_load(struct gxp_dev *gxp, uint core)
{
- u32 reset_vec, offset;
+ u32 offset;
void __iomem *core_scratchpad_base;
int ret;
@@ -279,16 +298,6 @@ static int gxp_firmware_load(struct gxp_dev *gxp, uint core)
"ELF loaded at virtual: %pK and physical: 0x%llx\n",
gxp->fwbufs[core].vaddr, gxp->fwbufs[core].paddr);
- /* Program reset vector */
- reset_vec = gxp_read_32_core(gxp, core,
- GXP_REG_ALT_RESET_VECTOR);
- dev_notice(gxp->dev, "Current Aurora reset vector for core %u: 0x%x\n",
- core, reset_vec);
- gxp_write_32_core(gxp, core, GXP_REG_ALT_RESET_VECTOR,
- gxp->fwbufs[core].daddr);
- dev_notice(gxp->dev, "New Aurora reset vector for core %u: 0x%llx\n",
- core, gxp->fwbufs[core].daddr);
-
/* Configure bus performance monitors */
gxp_bpm_configure(gxp, core, INST_BPM_OFFSET, BPM_EVENT_READ_XFER);
gxp_bpm_configure(gxp, core, DATA_BPM_OFFSET, BPM_EVENT_WRITE_XFER);
@@ -491,8 +500,13 @@ int gxp_firmware_run(struct gxp_dev *gxp, struct gxp_virtual_device *vd,
return ret;
}
+ /* Mark this as a cold boot */
+ gxp_write_32_core(gxp, core, GXP_REG_BOOT_MODE,
+ GXP_BOOT_MODE_REQUEST_COLD_BOOT);
+
gxp_doorbell_set_listening_core(gxp, CORE_WAKEUP_DOORBELL, core);
- ret = gxp_pm_core_on(gxp, core);
+ ret = gxp_firmware_setup_hw_after_block_off(gxp, core,
+ /*verbose=*/true);
if (ret) {
dev_err(gxp->dev, "Failed to power up core %u\n", core);
goto out_firmware_unload;
@@ -546,6 +560,13 @@ out_firmware_unload:
return ret;
}
+int gxp_firmware_setup_hw_after_block_off(struct gxp_dev *gxp, uint core,
+ bool verbose)
+{
+ gxp_program_reset_vector(gxp, core, verbose);
+ return gxp_pm_core_on(gxp, core, verbose);
+}
+
void gxp_firmware_stop(struct gxp_dev *gxp, struct gxp_virtual_device *vd,
uint virt_core, uint core)
{
@@ -563,6 +584,7 @@ void gxp_firmware_stop(struct gxp_dev *gxp, struct gxp_virtual_device *vd,
gxp->mailbox_mgr->mailboxes[core]);
dev_notice(gxp->dev, "Mailbox %u released\n", core);
- gxp_pm_core_off(gxp, core);
+ if (vd->state == GXP_VD_RUNNING)
+ gxp_pm_core_off(gxp, core);
gxp_firmware_unload(gxp, core);
}