diff options
author | Aurora pro automerger <aurora-pro-automerger@google.com> | 2022-04-22 17:10:21 +0800 |
---|---|---|
committer | Sermin Aydin <sermin@google.com> | 2022-05-12 04:51:44 +0000 |
commit | fa5cf5721220d5b97544ea56b91bd9f2590debac (patch) | |
tree | 649f29e1c371a1c02c87ec038290c507ff2e1b12 /gxp-firmware.c | |
parent | 27bed782f3a828674c0f1584cf355bf592c382be (diff) | |
download | gs201-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.c | 48 |
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); } |