tf: aarch64 fix for cases where CNTFRQ_EL0 returns bogus value #2929
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description of Change(s)
As noted in this commit in the linux kernel:
torvalds/linux@c6f97ad
...the value of CNTFRQ_EL0 is sometimes unreliable. The linux kernel instead reads the tick rate from the device tree, and if that fails, only then falls back on CNTFRQ_EL0.
Since we already have measurement-based code, and reading from the device tree seemed tricky, we instead check if CNTFRQ_EL0 seems "sane" (ie, > 1Hz), and if not, fall back on the measurement code used in all other linux flavors.
I ran across this issue when running an aarch64 vm running on aarch64 hardware - I'm not sure if the issue was with the actual hardware or just the VMWare vm. In this case, CNTFRQ_EL0 was returning a negative value. Not sure if all "bad" values will be as obvious, but this change is at least an improvement.
Fixes Issue(s)