mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-03 03:16:43 +07:00
7604537bbb
Current implementation of cpu_{suspend}/cpu_{resume} relies on the MPIDR to index the array of pointers where the context is saved and restored. The current approach works as long as the MPIDR can be considered a linear index, so that the pointers array can simply be dereferenced by using the MPIDR[7:0] value. On ARM multi-cluster systems, where the MPIDR may not be a linear index, to properly dereference the stack pointer array, a mapping function should be applied to it so that it can be used for arrays look-ups. This patch adds code in the cpu_{suspend}/cpu_{resume} implementation that relies on shifting and ORing hashing method to map a MPIDR value to a set of buckets precomputed at boot to have a collision free mapping from MPIDR to context pointers. The hashing algorithm must be simple, fast, and implementable with few instructions since in the cpu_resume path the mapping is carried out with the MMU off and the I-cache off, hence code and data are fetched from DRAM with no-caching available. Simplicity is counterbalanced with a little increase of memory (allocated dynamically) for stack pointers buckets, that should be anyway fairly limited on most systems. Memory for context pointers is allocated in a early_initcall with size precomputed and stashed previously in kernel data structures. Memory for context pointers is allocated through kmalloc; this guarantees contiguous physical addresses for the allocated memory which is fundamental to the correct functioning of the resume mechanism that relies on the context pointer array to be a chunk of contiguous physical memory. Virtual to physical address conversion for the context pointer array base is carried out at boot to avoid fiddling with virt_to_phys conversions in the cpu_resume path which is quite fragile and should be optimized to execute as few instructions as possible. Virtual and physical context pointer base array addresses are stashed in a struct that is accessible from assembly using values generated through the asm-offsets.c mechanism. Cc: Will Deacon <will.deacon@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Colin Cross <ccross@android.com> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Amit Kucheria <amit.kucheria@linaro.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Nicolas Pitre <nico@linaro.org> Tested-by: Shawn Guo <shawn.guo@linaro.org> Tested-by: Kevin Hilman <khilman@linaro.org> Tested-by: Stephen Warren <swarren@wwwdotorg.org> |
||
---|---|---|
.. | ||
boot | ||
common | ||
configs | ||
crypto | ||
include | ||
kernel | ||
kvm | ||
lib | ||
mach-at91 | ||
mach-bcm | ||
mach-bcm2835 | ||
mach-clps711x | ||
mach-cns3xxx | ||
mach-davinci | ||
mach-dove | ||
mach-ebsa110 | ||
mach-ep93xx | ||
mach-exynos | ||
mach-footbridge | ||
mach-gemini | ||
mach-highbank | ||
mach-imx | ||
mach-integrator | ||
mach-iop13xx | ||
mach-iop32x | ||
mach-iop33x | ||
mach-ixp4xx | ||
mach-kirkwood | ||
mach-ks8695 | ||
mach-lpc32xx | ||
mach-mmp | ||
mach-msm | ||
mach-mv78xx0 | ||
mach-mvebu | ||
mach-mxs | ||
mach-netx | ||
mach-nomadik | ||
mach-omap1 | ||
mach-omap2 | ||
mach-orion5x | ||
mach-picoxcell | ||
mach-prima2 | ||
mach-pxa | ||
mach-realview | ||
mach-rpc | ||
mach-s3c24xx | ||
mach-s3c64xx | ||
mach-s5p64x0 | ||
mach-s5pc100 | ||
mach-s5pv210 | ||
mach-sa1100 | ||
mach-shark | ||
mach-shmobile | ||
mach-socfpga | ||
mach-spear | ||
mach-sunxi | ||
mach-tegra | ||
mach-u300 | ||
mach-ux500 | ||
mach-versatile | ||
mach-vexpress | ||
mach-virt | ||
mach-vt8500 | ||
mach-w90x900 | ||
mach-zynq | ||
mm | ||
net | ||
nwfpe | ||
oprofile | ||
plat-iop | ||
plat-omap | ||
plat-orion | ||
plat-pxa | ||
plat-samsung | ||
plat-versatile | ||
tools | ||
vfp | ||
xen | ||
Kconfig | ||
Kconfig-nommu | ||
Kconfig.debug | ||
Makefile |