• Jon Hunter's avatar
    omap3: Prevent SDRC deadlock when L3 is changing frequency · a3fed9bc
    Jon Hunter authored
    When changing the L3 clock frequency, the CPU is executing from internal RAM
    and the SDRC clock is disabled. During this time accesses made to external
    DDR are stalled. If the ARM subsystem attempts to access the DDR while the
    SDRC clock is disabled this will stall the CPU until the access to the SDRC
    timeouts. A timeout on the SDRC should never occur. Once a timeout occurs all
    the following accesses will be aborted and the DDR is no longer accessible.
    
    Although the code being executed in the internal RAM does not directly access
    the DDR, it was found that the branch prediction logic in the CPU may cause
    the CPU to prefetch code from a DDR location while the SDRC clock is disabled.
    This was causing an SDRC timeout which resulted in a system hang.
    
    This patch fixes this problem by ensuring the branch prediction logic is
    disabled while changing the L3 clock frequency. The branch prediction logic
    is disabled by clearing the Z-bit in the ARM CTRL register.
    
    Disabling the branch prediction logic does not have any noticable impact
    on the execution time of this code section. The hardware observability
    signals were used to monitor the sdrc idle time with and without this
    patch when operating at different CPU frequencies (150MHz, 500MHz and
    600MHz) and the total sdrc idle time when changing frequenct was in
    the range of 9-11us. This was measured on an omap3430 SDP running the
    omapzoom p-android-omap-2.6.29 branch.
    Signed-off-by: default avatarJon Hunter <jon-hunter@ti.com>
    Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
    Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
    Cc: Richard Woodruff <r-woodruff2@ti.com>
    Cc: Tony Lindgren <tony@atomide.com>
    a3fed9bc
sram34xx.S 9.82 KB