• B
    imx: mx7: snvs: Add an SNVS init routine · 723f8359
    Bryan O'Donoghue 提交于
    Working with HAB on the i.MX7 we've encountered a case where a board that
    successfully authenticates u-boot when booting Linux via OPTEE subsequently
    fails to properly bring up the RTC.
    
    The RTC registers live in the low-power block of the Secure Non-Volatile
    Storage (SNVS) block.
    
    The root cause of the error has been traced to the HAB handing off the
    SNVS-RTC in a state where HPCOMR::NPSWA_EN = 0 in other words where the
    Non-Privileged Software Access Enable bit is zero. In ordinary
    circumstances this is OK since we typically do not run in TZ mode, however
    when we boot via HAB and enablng TrustZone, it is required to set
    HPCOMR::NPSWA_EN = 1 in order for the upstream Linux driver to have
    sufficient permissions to manipulate the SNVS-LP block.
    
    On our reference board it is the difference between Linux doing this:
    
    root@imx7s-warp-mbl:~# dmesg | grep rtc
    snvs_rtc_enable read 0x00000000 from SNVS_LPLR @ 0x00000034
    snvs_rtc_enable read 0x00000021 from SNVS_LPCR @ 0x00000038
    snvs_rtc_enable read 0x00000000 from SNVS_HPLR @ 0x00000000
    snvs_rtc_enable read 0x80002100 from SNVS_HPCOMR @ 0x00000004
    snvs_rtc 30370000.snvs:snvs-rtc-lp: rtc core: registered
             30370000.snvs:snvs-rtc-lp as rtc0
    snvs_rtc 30370000.snvs:snvs-rtc-lp: setting system clock to2018-04-01 00:51:04 UTC (1522543864)
    
    and doing this:
    
    root@imx7s-warp-mbl:~# dmesg | grep rtc
    snvs_rtc_enable read 0x00000000 from SNVS_LPLR @ 0x00000034
    snvs_rtc_enable read 0x00000020 from SNVS_LPCR @ 0x00000038
    snvs_rtc_enable read 0x00000001 from SNVS_HPLR @ 0x00000000
    snvs_rtc_enable read 0x00002020 from SNVS_HPCOMR @ 0x00000004
    snvs_rtc 30370000.snvs:snvs-rtc-lp: failed to enable rtc -110
    snvs_rtc: probe of 30370000.snvs:snvs-rtc-lp failed with error -110
    hctosys: unable to open rtc device (rtc0)
    
    Note bit 1 of LPCR is not set in the second case and is set in the first
    case and that bit 31 of HPCOMR is set in the second case but not in the
    first.
    
    Setting NPSWA_EN in HPCOMR allows us to boot through enabling TrustZone
    and continue onto the kernel. The kernel then has the necessary permissions
    to set LPCR::SRTC_ENV (RTC enable in the LP command register) whereas in
    contrast - in the failing case the non-privileged kernel cannot do so.
    
    This patch adds a simple init_snvs() call which sets the permission-bit
    called from soc.c for the i.MX7. It may be possible, safe and desirable to
    perform this on other i.MX processors but for now this is only tested on
    i.MX7 as working.
    Signed-off-by: NBryan O'Donoghue <bryan.odonoghue@linaro.org>
    723f8359
sys_proto.h 3.5 KB