@samitouri / QOSamiQemu / commits / 8d53896b44

hw/core/machine: topology functions capabilities added

Add two functions one of which finds the lowest cache level defined in the cache description input, and the other checks if a given cache topology is defined at a particular cache level Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Signed-off-by: Alireza Sanaee <alireza.sanaee@huawei.com> Reviewed-by: Gustavo Romero <gustavo.romero@linaro.org> Message-id: 20260311160609.358-3-alireza.sanaee@huawei.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Alireza Sanaee committed Apr 23, 2026 at 10:24 UTC 8d53896b44e210281e79cad34c8683744b8a433e
2 files changed +57
hw/core/machine-smp.c
+52
@@ -406,3 +406,55 @@ bool machine_check_smp_cache(const MachineState *ms, Error **errp)
406
407 return true;
408 }
409 +
410 +/*
411 + * This function assumes L3 and L2 have unified cache and L1 is split L1d and
412 + * L1i.
413 + */
414 +bool machine_find_lowest_level_cache_at_topo_level(const MachineState *ms,
415 + int *lowest_cache_level,
416 + CpuTopologyLevel topo_level)
417 +{
418 + enum CacheLevelAndType cache_level;
419 + enum CpuTopologyLevel t;
420 +
421 + for (cache_level = CACHE_LEVEL_AND_TYPE_L1D;
422 + cache_level < CACHE_LEVEL_AND_TYPE__MAX; cache_level++) {
423 + t = machine_get_cache_topo_level(ms, cache_level);
424 + if (t == topo_level) {
425 + /* Assume L1 is split into L1d and L1i caches. */
426 + if (cache_level == CACHE_LEVEL_AND_TYPE_L1D ||
427 + cache_level == CACHE_LEVEL_AND_TYPE_L1I) {
428 + *lowest_cache_level = 1; /* L1 */
429 + } else {
430 + /* Assume the other caches are unified. */
431 + *lowest_cache_level = cache_level;
432 + }
433 +
434 + return true;
435 + }
436 + }
437 +
438 + return false;
439 +}
440 +
441 +/*
442 + * Check if there are caches defined at a particular level. It supports only
443 + * L1, L2 and L3 caches, but this can be extended to more levels as needed.
444 + *
445 + * Return True on success, False otherwise.
446 + */
447 +bool machine_defines_cache_at_topo_level(const MachineState *ms,
448 + CpuTopologyLevel topology)
449 +{
450 + enum CacheLevelAndType cache_level;
451 +
452 + for (cache_level = CACHE_LEVEL_AND_TYPE_L1D;
453 + cache_level < CACHE_LEVEL_AND_TYPE__MAX; cache_level++) {
454 + if (machine_get_cache_topo_level(ms, cache_level) == topology) {
455 + return true;
456 + }
457 + }
458 +
459 + return false;
460 +}
include/hw/core/boards.h
+5
@@ -60,6 +60,11 @@ void machine_set_cache_topo_level(MachineState *ms, CacheLevelAndType cache,
60 CpuTopologyLevel level);
61 bool machine_check_smp_cache(const MachineState *ms, Error **errp);
62 void machine_memory_devices_init(MachineState *ms, hwaddr base, uint64_t size);
63 +bool machine_defines_cache_at_topo_level(const MachineState *ms,
64 + CpuTopologyLevel topology);
65 +bool machine_find_lowest_level_cache_at_topo_level(const MachineState *ms,
66 + int *lowest_cache_level,
67 + CpuTopologyLevel topo_level);
68
69 /**
70 * machine_class_allow_dynamic_sysbus_dev: Add type to list of valid devices