Skip to content

Commit 351fcd0

Browse files
Addede l2 cache logic
1 parent 8b0a4c2 commit 351fcd0

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/riscv/linux/init.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ void cpuinfo_riscv_linux_init(void) {
326326
if (bitmask_all(riscv_linux_processors[processor].flags, valid_processor_mask)) {
327327
riscv_linux_processors[processor].processor.linux_id = processor;
328328
riscv_linux_processors[processor].flags |= CPUINFO_LINUX_FLAG_VALID;
329-
cpuinfo_log_debug("parsed processor %"PRIu32, processor);
329+
cpuinfo_log_debug("parsed processor %zu", processor);
330330
}
331331
}
332332

@@ -553,12 +553,27 @@ void cpuinfo_riscv_linux_init(void) {
553553
goto cleanup;
554554
}
555555

556+
l1i = calloc(valid_processors_count, sizeof(struct cpuinfo_cache));
557+
if (l1i == NULL) {
558+
cpuinfo_log_error("failed to allocate %zu bytes for descriptions of %zu L1I caches",
559+
valid_processors_count * sizeof(struct cpuinfo_cache), valid_processors_count);
560+
goto cleanup;
561+
}
562+
563+
l1d = calloc(valid_processors_count, sizeof(struct cpuinfo_cache));
564+
if (l1d == NULL) {
565+
cpuinfo_log_error("failed to allocate %zu bytes for descriptions of %zu L1D caches",
566+
valid_processors_count * sizeof(struct cpuinfo_cache), valid_processors_count);
567+
goto cleanup;
568+
}
569+
556570
/* Transfer contents of processor list to ABI structures. */
557571
size_t valid_processors_index = 0;
558572
size_t valid_cores_index = 0;
559573
size_t valid_clusters_index = 0;
560574
size_t valid_packages_index = 0;
561575
size_t valid_uarchs_index = 0;
576+
size_t l2_count = 0;
562577
last_uarch = cpuinfo_uarch_unknown;
563578
for (size_t processor = 0; processor < riscv_linux_processors_count; processor++) {
564579
if (!bitmask_all(riscv_linux_processors[processor].flags, CPUINFO_LINUX_FLAG_VALID)) {
@@ -612,10 +627,26 @@ void cpuinfo_riscv_linux_init(void) {
612627
sizeof(struct cpuinfo_package));
613628
}
614629

630+
/* Populate cache information structures in l1i, l1d */
631+
struct cpuinfo_cache temp_l2 = { 0 };
632+
cpuinfo_riscv_decode_cache(
633+
riscv_linux_processors[processor].core.uarch,
634+
&l1i[processor], &l1d[processor], &temp_l2);
635+
l1i[processor].processor_start = l1d[processor].processor_start = processor;
636+
l1i[processor].processor_count = l1d[processor].processor_count = 1;
637+
if (temp_l2.size != 0) {
638+
/* Assume L2 is shared by cores in the same cluster */
639+
if (riscv_linux_processors[processor].package_leader_id == linux_id) {
640+
l2_count += 1;
641+
}
642+
}
643+
615644
/* Commit pointers on the final structures. */
616645
processors[valid_processors_index - 1].core = &cores[valid_cores_index - 1];
617646
processors[valid_processors_index - 1].cluster = &clusters[valid_clusters_index - 1];
618647
processors[valid_processors_index - 1].package = &packages[valid_packages_index - 1];
648+
processors[valid_processors_index - 1].cache.l1i = l1i + processor;
649+
processors[valid_processors_index - 1].cache.l1d = l1d + processor;
619650

620651
cores[valid_cores_index - 1].cluster = &clusters[valid_clusters_index - 1];
621652
cores[valid_cores_index - 1].package = &packages[valid_packages_index - 1];
@@ -627,9 +658,18 @@ void cpuinfo_riscv_linux_init(void) {
627658
linux_cpu_to_uarch_index_map[linux_id] = valid_uarchs_index - 1;
628659
}
629660

661+
if (l2_count != 0) {
662+
l2 = calloc(l2_count, sizeof(struct cpuinfo_cache));
663+
if (l2 == NULL) {
664+
cpuinfo_log_error("failed to allocate %zu bytes for descriptions of %zu L2 caches",
665+
l2_count * sizeof(struct cpuinfo_cache), l2_count);
666+
goto cleanup;
667+
}
668+
}
669+
670+
/* Populate cache information structures in l2 */
630671
uint32_t l2_index = UINT32_MAX;
631672
for (uint32_t processor = 0; processor < valid_processors_count; processor++) {
632-
633673
struct cpuinfo_cache dummy_l1i, dummy_l1d, temp_l2 = { 0 };
634674
cpuinfo_riscv_decode_cache(
635675
riscv_linux_processors[processor].core.uarch,

src/riscv/linux/riscv-hw.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
2121
};
2222
const size_t pairs_count = sizeof(pairs) / sizeof(struct riscv_hwprobe);
2323

24-
/* In case of failure, report unknown. */
25-
*vendor = cpuinfo_vendor_unknown;
26-
*uarch = cpuinfo_uarch_unknown;
27-
2824
/* Create a CPU set with this processor flagged. */
2925
const size_t cpu_set_size = processor + 1;
3026
cpu_set_t* cpu_set = CPU_ALLOC(cpu_set_size);
@@ -71,7 +67,9 @@ void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
7167
void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
7268
uint32_t processor,
7369
enum cpuinfo_vendor vendor[restrict static 1],
74-
enum cpuinfo_uarch uarch[restrict static 1]) {}
70+
enum cpuinfo_uarch uarch[restrict static 1]) {
71+
/* Do nothing */
72+
}
7573

7674
#endif
7775

0 commit comments

Comments
 (0)