hw/core: Add a helper to check the cache topology level
Currently, we have no way to expose the arch-specific default cache model because the cache model is sometimes related to the CPU model (e.g., i386). Since the user might configure "default" level, any comparison with "default" is meaningless before the machine knows the specific level that "default" refers to. We can only check the correctness of the cache topology after the arch loads the user-configured cache model from MachineState.smp_cache and consumes the special "default" level by replacing it with the specific level. Signed-off-by: Zhao Liu <zhao1.liu@intel.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Message-ID: <20241101083331.340178-6-zhao1.liu@intel.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
f35c0221fe
commit
07995a46ba
@ -348,3 +348,51 @@ void machine_set_cache_topo_level(MachineState *ms, CacheLevelAndType cache,
|
|||||||
{
|
{
|
||||||
ms->smp_cache.props[cache].topology = level;
|
ms->smp_cache.props[cache].topology = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When both cache1 and cache2 are configured with specific topology levels
|
||||||
|
* (not default level), is cache1's topology level higher than cache2?
|
||||||
|
*/
|
||||||
|
static bool smp_cache_topo_cmp(const SmpCache *smp_cache,
|
||||||
|
CacheLevelAndType cache1,
|
||||||
|
CacheLevelAndType cache2)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Before comparing, the "default" topology level should be replaced
|
||||||
|
* with the specific level.
|
||||||
|
*/
|
||||||
|
assert(smp_cache->props[cache1].topology != CPU_TOPOLOGY_LEVEL_DEFAULT);
|
||||||
|
|
||||||
|
return smp_cache->props[cache1].topology > smp_cache->props[cache2].topology;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Currently, we have no way to expose the arch-specific default cache model
|
||||||
|
* because the cache model is sometimes related to the CPU model (e.g., i386).
|
||||||
|
*
|
||||||
|
* We can only check the correctness of the cache topology after the arch loads
|
||||||
|
* the user-configured cache model from MachineState and consumes the special
|
||||||
|
* "default" level by replacing it with the specific level.
|
||||||
|
*/
|
||||||
|
bool machine_check_smp_cache(const MachineState *ms, Error **errp)
|
||||||
|
{
|
||||||
|
if (smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L1D,
|
||||||
|
CACHE_LEVEL_AND_TYPE_L2) ||
|
||||||
|
smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L1I,
|
||||||
|
CACHE_LEVEL_AND_TYPE_L2)) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Invalid smp cache topology. "
|
||||||
|
"L2 cache topology level shouldn't be lower than L1 cache");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (smp_cache_topo_cmp(&ms->smp_cache, CACHE_LEVEL_AND_TYPE_L2,
|
||||||
|
CACHE_LEVEL_AND_TYPE_L3)) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Invalid smp cache topology. "
|
||||||
|
"L3 cache topology level shouldn't be lower than L2 cache");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -53,6 +53,7 @@ CpuTopologyLevel machine_get_cache_topo_level(const MachineState *ms,
|
|||||||
CacheLevelAndType cache);
|
CacheLevelAndType cache);
|
||||||
void machine_set_cache_topo_level(MachineState *ms, CacheLevelAndType cache,
|
void machine_set_cache_topo_level(MachineState *ms, CacheLevelAndType cache,
|
||||||
CpuTopologyLevel level);
|
CpuTopologyLevel level);
|
||||||
|
bool machine_check_smp_cache(const MachineState *ms, Error **errp);
|
||||||
void machine_memory_devices_init(MachineState *ms, hwaddr base, uint64_t size);
|
void machine_memory_devices_init(MachineState *ms, hwaddr base, uint64_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user