1# Copyright (C) 2021-2022 Intel Corporation.
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5
6import cpuparser.cpuids
7
8dispatch_table = {
9    0x0: cpuparser.cpuids.LEAF_0,
10    0x1: cpuparser.cpuids.LEAF_1,
11    0x2: cpuparser.cpuids.LEAF_2,
12    0x4: cpuparser.cpuids.LEAF_4,
13    0x5: cpuparser.cpuids.LEAF_5,
14    0x6: cpuparser.cpuids.LEAF_6,
15    0x7: cpuparser.cpuids.LEAF_7,
16    0x9: cpuparser.cpuids.LEAF_9,
17    0xA: cpuparser.cpuids.LEAF_A,
18    0xB: cpuparser.cpuids.LEAF_B,
19    # 0xD: multiple parsers
20    # 0xF: multiple parsers
21    # 0x10: multiple parsers
22    0x1A: cpuparser.cpuids.LEAF_1A,
23    0x1F: cpuparser.cpuids.LEAF_1F,
24    0x80000000: cpuparser.cpuids.LEAF_80000000,
25    0x80000001: cpuparser.cpuids.LEAF_80000001,
26    0x80000002: cpuparser.cpuids.LEAF_80000002,
27    0x80000003: cpuparser.cpuids.LEAF_80000003,
28    0x80000004: cpuparser.cpuids.LEAF_80000004,
29    0x80000006: cpuparser.cpuids.LEAF_80000006,
30    0x80000007: cpuparser.cpuids.LEAF_80000007,
31    0x80000008: cpuparser.cpuids.LEAF_80000008,
32}
33
34def parse_cpuid(leaf, subleaf, cpu_id):
35    if leaf in dispatch_table.keys():
36        return dispatch_table[leaf].read(cpu_id, subleaf)
37    elif leaf == 0xD:
38        if subleaf == 0:
39            return cpuparser.cpuids.LEAF_D.read(cpu_id, subleaf)
40        elif subleaf == 1:
41            return cpuparser.cpuids.LEAF_D_1.read(cpu_id, subleaf)
42        else:
43            return cpuparser.cpuids.LEAF_D_n.read(cpu_id, subleaf)
44    elif leaf == 0xF:
45        if subleaf == 0:
46            return cpuparser.cpuids.LEAF_F.read(cpu_id, subleaf)
47        elif subleaf == 1:
48            return cpuparser.cpuids.LEAF_F_1.read(cpu_id, subleaf)
49        else:
50            return cpuparser.cpuids.LEAF_F_n.read(cpu_id, subleaf)
51    elif leaf == 0x10:
52        if subleaf == 0:
53            return cpuparser.cpuids.LEAF_10.read(cpu_id, subleaf)
54        elif subleaf == 1 or subleaf == 2:
55            return cpuparser.cpuids.LEAF_10_1.read(cpu_id, subleaf)
56        elif subleaf == 3:
57            return cpuparser.cpuids.LEAF_10_3.read(cpu_id, subleaf)
58        else:
59            return None
60    else:
61        return None
62
63def parse_cpu_ids(file):
64    acc = list()
65    with open(file, "r") as f:
66        line = f.read().strip()
67        for r in line.split(","):
68            if r.find("-") > 0:
69                first, last = tuple(map(int, r.split("-")))
70                acc.extend(range(first, last + 1))
71            else:
72                if r:
73                    acc.append(int(r))
74    return acc
75
76def get_online_cpu_ids():
77    return parse_cpu_ids("/sys/devices/system/cpu/online")
78
79def get_offline_cpu_ids():
80    return parse_cpu_ids("/sys/devices/system/cpu/offline")
81