]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
be3f06bc BM |
2 | /* |
3 | * Copyright (C) 2015, Bin Meng <[email protected]> | |
be3f06bc BM |
4 | */ |
5 | ||
6 | #include <common.h> | |
7 | #include <cpu.h> | |
8 | #include <dm.h> | |
9 | #include <errno.h> | |
10 | #include <asm/cpu.h> | |
11 | ||
6e6f4ce4 BM |
12 | DECLARE_GLOBAL_DATA_PTR; |
13 | ||
be3f06bc BM |
14 | int cpu_x86_bind(struct udevice *dev) |
15 | { | |
16 | struct cpu_platdata *plat = dev_get_parent_platdata(dev); | |
6f192ddc | 17 | struct cpuid_result res; |
be3f06bc | 18 | |
e160f7d4 | 19 | plat->cpu_id = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev), |
be3f06bc | 20 | "intel,apic-id", -1); |
6f192ddc AG |
21 | plat->family = gd->arch.x86; |
22 | res = cpuid(1); | |
23 | plat->id[0] = res.eax; | |
24 | plat->id[1] = res.edx; | |
be3f06bc BM |
25 | |
26 | return 0; | |
27 | } | |
28 | ||
94eaa79c AG |
29 | int cpu_x86_get_vendor(struct udevice *dev, char *buf, int size) |
30 | { | |
31 | const char *vendor = cpu_vendor_name(gd->arch.x86_vendor); | |
32 | ||
33 | if (size < (strlen(vendor) + 1)) | |
34 | return -ENOSPC; | |
35 | ||
36 | strcpy(buf, vendor); | |
37 | ||
38 | return 0; | |
39 | } | |
40 | ||
be3f06bc BM |
41 | int cpu_x86_get_desc(struct udevice *dev, char *buf, int size) |
42 | { | |
a6eb6769 SG |
43 | char *ptr; |
44 | ||
be3f06bc BM |
45 | if (size < CPU_MAX_NAME_LEN) |
46 | return -ENOSPC; | |
47 | ||
a6eb6769 SG |
48 | ptr = cpu_get_name(buf); |
49 | if (ptr != buf) | |
50 | strcpy(buf, ptr); | |
be3f06bc BM |
51 | |
52 | return 0; | |
53 | } | |
54 | ||
6e6f4ce4 BM |
55 | static int cpu_x86_get_count(struct udevice *dev) |
56 | { | |
57 | int node, cpu; | |
58 | int num = 0; | |
59 | ||
60 | node = fdt_path_offset(gd->fdt_blob, "/cpus"); | |
61 | if (node < 0) | |
62 | return -ENOENT; | |
63 | ||
64 | for (cpu = fdt_first_subnode(gd->fdt_blob, node); | |
65 | cpu >= 0; | |
66 | cpu = fdt_next_subnode(gd->fdt_blob, cpu)) { | |
67 | const char *device_type; | |
68 | ||
69 | device_type = fdt_getprop(gd->fdt_blob, cpu, | |
70 | "device_type", NULL); | |
71 | if (!device_type) | |
72 | continue; | |
73 | if (strcmp(device_type, "cpu") == 0) | |
74 | num++; | |
75 | } | |
76 | ||
77 | return num; | |
78 | } | |
79 | ||
be3f06bc BM |
80 | static const struct cpu_ops cpu_x86_ops = { |
81 | .get_desc = cpu_x86_get_desc, | |
6e6f4ce4 | 82 | .get_count = cpu_x86_get_count, |
94eaa79c | 83 | .get_vendor = cpu_x86_get_vendor, |
be3f06bc BM |
84 | }; |
85 | ||
86 | static const struct udevice_id cpu_x86_ids[] = { | |
87 | { .compatible = "cpu-x86" }, | |
88 | { } | |
89 | }; | |
90 | ||
91 | U_BOOT_DRIVER(cpu_x86_drv) = { | |
92 | .name = "cpu_x86", | |
93 | .id = UCLASS_CPU, | |
94 | .of_match = cpu_x86_ids, | |
95 | .bind = cpu_x86_bind, | |
96 | .ops = &cpu_x86_ops, | |
97 | }; |