xref: /aosp_15_r20/external/coreboot/util/msrtool/sys.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <pci/pci.h>
4 
5 #include "msrtool.h"
6 
7 static struct cpuid_t id;
8 
cpuid(void)9 struct cpuid_t *cpuid(void) {
10 	uint32_t outeax;
11 	uint32_t outebx;
12 
13 /* First, we need determine which vendor we have */
14 #if defined(__DARWIN__) && !defined(__LP64__)
15 	asm volatile (
16 		"pushl %%ebx    \n"
17 		"cpuid          \n"
18 		"popl %%ebx     \n"
19 		: "=b" (outebx) : "a" (0) : "%ecx", "%edx"
20 	);
21 #else
22 	asm ("cpuid" : "=b" (outebx) : "a" (0) : "%ecx", "%edx");
23 #endif
24 
25 	id.vendor = outebx;
26 
27 /* Then, identificate CPU itself */
28 #if defined(__DARWIN__) && !defined(__LP64__)
29 	asm volatile (
30 		"pushl %%ebx    \n"
31 		"cpuid          \n"
32 		"popl %%ebx     \n"
33 		: "=a" (outeax) : "a" (1) : "%ecx", "%edx"
34 	);
35 #else
36 	asm ("cpuid" : "=a" (outeax) : "a" (1) : "%ebx", "%ecx", "%edx");
37 #endif
38 
39 	id.stepping = outeax & 0xf;
40 	outeax >>= 4;
41 	id.model = outeax & 0xf;
42 	outeax >>= 4;
43 	id.family = outeax & 0xf;
44 	outeax >>= 8;
45 	id.ext_model = outeax & 0xf;
46 	outeax >>= 4;
47 	id.ext_family = outeax & 0xff;
48 	if ((0xf == id.family) || ((VENDOR_INTEL == id.vendor)
49 			&& (0x6 == id.family))) {
50 		/* Intel says always do this, AMD says only for family f */
51 		id.model |= (id.ext_model << 4);
52 		id.family += id.ext_family;
53 	}
54 	printf_verbose("CPU: family %x, model %x, stepping %x\n",
55 			id.family, id.model, id.stepping);
56 
57 	return &id;
58 }
59 
pci_dev_find(uint16_t vendor,uint16_t device)60 struct pci_dev *pci_dev_find(uint16_t vendor, uint16_t device) {
61 	struct pci_dev *temp;
62 	struct pci_filter filter;
63 
64 	pci_filter_init(NULL, &filter);
65 	filter.vendor = vendor;
66 	filter.device = device;
67 
68 	for (temp = pacc->devices; temp; temp = temp->next)
69 		if (pci_filter_match(&filter, temp))
70 			return temp;
71 
72 	return NULL;
73 }
74