Since ARM caches are physically indexed is there any way to flush based on the PA? I know I can get the set, but what about the way? If I am flushing from L1 would I have to flush all ways in L1 and then L2 assuming there is no L3 to get to system memory?
Is there an example of this written somewhere? All examples I have seen use VA.
Thanks!
Not quite. Taking Cortex-A53:
This is inner caches, for outer caches, eg. L3 could be different but as you say you don't have.
m0sf3tz said: I know I can get the set, but what about the way?
if you want to flush a set manually (that is by SW Cache Maint. Operations) you must clean a set from each of the ways as you cannot tell what way your date is. You can tell the set but not the way as you noticed. Well HW design surely have the means to determine that but it is not exposed to us.
m0sf3tz said:If I am flushing from L1 would I have to flush all ways in L1 and then L2 assuming there is no L3 to get to system memory?
You have a variety of options:
There are loads of examples in Uboot at arch/arm/cpu/armv8/cache.S.
If you have a system with more than 1x Cluster then you should also take into consideration what Cache Maint. Operations are broadcast
IC IALLUIS I-cache invalidate all to Point of Unification, Inner Shareable Yes (inner only)IC IALLU I-cache invalidate all to Point of Unification NoaIC IVAU, Xt I-cache invalidate by address to Point of Unification MaybebDC ZVA, Xt D-cache zero by address NoDC IVAC, Xt D-cache invalidate by address to Point of Coherency YesDC ISW, Xt D-cache invalidate by Set/Way NoDC CVAC, Xt D-cache clean by address to Point of Coherency MaybebDC CSW, Xt D-cache clean by Set/Way NoDC CVAU, Xt D-cache clean by address to Point of Unification MaybebDC CIVAC, Xt D-cache clean and invalidate by address to Point of Coherency YesDC CISW, Xt D-cache clean and invalidate by Set/Way No
If an operation is not broadcast OS/Uboot (or any other) must issue the clean or invalidate operations locally on each core even though you may have the Cache Coherent Network/Interconnect connecting the Clusters.
Loads of details are in "ARM® Cortex®-A Series Version: 1.0 Programmer’s Guide for ARMv8-A"