Skip to content
  • Abel Vesa's avatar
    MLK-21399 plat: imx8mq: gpc: Workaround for ERR11171 · 0e91ff59
    Abel Vesa authored
    
    
    This new workaround takes advantage of the per core IMR registers in GPC in
    order to unmask the IRQ0, still generated by the 12bit in IOMUX_GPR register
    (which now remains always set), so it can only wake up one core at the time.
    Also, this entire workaround has now been moved here in TF-A, allowing the
    kernel side to be minimal.
    
    Another advantage this workaround brings is the removal of the 50us delay
    (which was necessary before in gic_raise_softirq in kernel) by allowing the
    core that is waking up to mask his own IRQ0 in the suspend finish callback.
    
    One important change here is the way the cores are woken up in
    dram_dvfs_handler. Since the wake up mechanism has changed from asserting the
    12th bit in IOMUX_GPR and leaving the IMR1 1st bit on for each core to exactly
    the reverse, that is, leaving the IOMUX_GPR 12th bit always set and then
    masking/unmasking the IMR1 1st bit for each independent core, we need to use
    the imx_gpc_core_wake to wake up the cores.
    
    Also, the 50us udelay is moved to TF-A (inside imx_pwr_domain_off) from kernel
    (gic_raise_softirq), since the new cpuidle workaround does not need it in order
    to clean the IOMUX_GPC 12bit. For now, the udelay seems to be still needed
    in order to delay the affinity info OFF for the dying core. This is something
    that needs further investigation.
    
    Signed-off-by: default avatarAbel Vesa <abel.vesa@nxp.com>
    Reviewed-by: default avatarLeonard Crestez <leonard.crestez@nxp.com>
    0e91ff59