提交 0deec596 编写于 作者: J Jeffrey Hugo 提交者: Greg Kroah-Hartman

ACPI/PPTT: Handle architecturally unknown cache types

[ Upstream commit 59bbff3775c0951300f7b41345a54b999438f8d0 ]

The type of a cache might not be specified by architectural mechanisms (ie
system registers), but its type might be specified in the PPTT.  In this
case, we should populate the type of the cache, rather than leave it
undefined.

This fixes the issue where the cacheinfo driver will not populate sysfs
for such caches, resulting in the information missing from utilities like
lstopo and lscpu, thus degrading the user experience.

Fixes: 2bd00bcd (ACPI/PPTT: Add Processor Properties Topology Table parsing)
Reported-by: NVijaya Kumar K <vkilari@codeaurora.org>
Signed-off-by: NJeffrey Hugo <jhugo@codeaurora.org>
Reviewed-by: NSudeep Holla <sudeep.holla@arm.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 a0a9e306
...@@ -338,9 +338,6 @@ static struct acpi_pptt_cache *acpi_find_cache_node(struct acpi_table_header *ta ...@@ -338,9 +338,6 @@ static struct acpi_pptt_cache *acpi_find_cache_node(struct acpi_table_header *ta
return found; return found;
} }
/* total number of attributes checked by the properties code */
#define PPTT_CHECKED_ATTRIBUTES 4
/** /**
* update_cache_properties() - Update cacheinfo for the given processor * update_cache_properties() - Update cacheinfo for the given processor
* @this_leaf: Kernel cache info structure being updated * @this_leaf: Kernel cache info structure being updated
...@@ -357,25 +354,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf, ...@@ -357,25 +354,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
struct acpi_pptt_cache *found_cache, struct acpi_pptt_cache *found_cache,
struct acpi_pptt_processor *cpu_node) struct acpi_pptt_processor *cpu_node)
{ {
int valid_flags = 0;
this_leaf->fw_token = cpu_node; this_leaf->fw_token = cpu_node;
if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) { if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
this_leaf->size = found_cache->size; this_leaf->size = found_cache->size;
valid_flags++; if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
}
if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
this_leaf->coherency_line_size = found_cache->line_size; this_leaf->coherency_line_size = found_cache->line_size;
valid_flags++; if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
}
if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
this_leaf->number_of_sets = found_cache->number_of_sets; this_leaf->number_of_sets = found_cache->number_of_sets;
valid_flags++; if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
}
if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
this_leaf->ways_of_associativity = found_cache->associativity; this_leaf->ways_of_associativity = found_cache->associativity;
valid_flags++;
}
if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) { if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) { switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
case ACPI_PPTT_CACHE_POLICY_WT: case ACPI_PPTT_CACHE_POLICY_WT:
...@@ -402,11 +389,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf, ...@@ -402,11 +389,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
} }
} }
/* /*
* If the above flags are valid, and the cache type is NOCACHE * If cache type is NOCACHE, then the cache hasn't been specified
* update the cache type as well. * via other mechanisms. Update the type if a cache type has been
* provided.
*
* Note, we assume such caches are unified based on conventional system
* design and known examples. Significant work is required elsewhere to
* fully support data/instruction only type caches which are only
* specified in PPTT.
*/ */
if (this_leaf->type == CACHE_TYPE_NOCACHE && if (this_leaf->type == CACHE_TYPE_NOCACHE &&
valid_flags == PPTT_CHECKED_ATTRIBUTES) found_cache->flags & ACPI_PPTT_CACHE_TYPE_VALID)
this_leaf->type = CACHE_TYPE_UNIFIED; this_leaf->type = CACHE_TYPE_UNIFIED;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册