arm64: Add support for ACPI based firmware tables
The /sys cache entries should support ACPI/PPTT generated cache topology information. For arm64, if ACPI is enabled, determine the max number of cache levels and populate them using the PPTT table if one is available. Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Vijaya Kumar K <vkilari@codeaurora.org> Tested-by: Xiongfeng Wang <wangxiongfeng2@huawei.com> Tested-by: Tomasz Nowicki <Tomasz.Nowicki@cavium.com> Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
582b468bdc
commit
8571890e15
1 changed files with 10 additions and 5 deletions
|
@ -17,6 +17,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/acpi.h>
|
||||||
#include <linux/cacheinfo.h>
|
#include <linux/cacheinfo.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
||||||
|
@ -46,7 +47,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf,
|
||||||
|
|
||||||
static int __init_cache_level(unsigned int cpu)
|
static int __init_cache_level(unsigned int cpu)
|
||||||
{
|
{
|
||||||
unsigned int ctype, level, leaves, of_level;
|
unsigned int ctype, level, leaves, fw_level;
|
||||||
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
|
||||||
|
|
||||||
for (level = 1, leaves = 0; level <= MAX_CACHE_LEVEL; level++) {
|
for (level = 1, leaves = 0; level <= MAX_CACHE_LEVEL; level++) {
|
||||||
|
@ -59,15 +60,19 @@ static int __init_cache_level(unsigned int cpu)
|
||||||
leaves += (ctype == CACHE_TYPE_SEPARATE) ? 2 : 1;
|
leaves += (ctype == CACHE_TYPE_SEPARATE) ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
of_level = of_find_last_cache_level(cpu);
|
if (acpi_disabled)
|
||||||
if (level < of_level) {
|
fw_level = of_find_last_cache_level(cpu);
|
||||||
|
else
|
||||||
|
fw_level = acpi_find_last_cache_level(cpu);
|
||||||
|
|
||||||
|
if (level < fw_level) {
|
||||||
/*
|
/*
|
||||||
* some external caches not specified in CLIDR_EL1
|
* some external caches not specified in CLIDR_EL1
|
||||||
* the information may be available in the device tree
|
* the information may be available in the device tree
|
||||||
* only unified external caches are considered here
|
* only unified external caches are considered here
|
||||||
*/
|
*/
|
||||||
leaves += (of_level - level);
|
leaves += (fw_level - level);
|
||||||
level = of_level;
|
level = fw_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
this_cpu_ci->num_levels = level;
|
this_cpu_ci->num_levels = level;
|
||||||
|
|
Loading…
Reference in a new issue