From fa5cf5721220d5b97544ea56b91bd9f2590debac Mon Sep 17 00:00:00 2001 From: Aurora pro automerger Date: Fri, 22 Apr 2022 17:10:21 +0800 Subject: [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 --- gxp-firmware.c | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) (limited to 'gxp-firmware.c') 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); } -- cgit v1.2.3