xref: /haiku/src/system/kernel/arch/ppc/arch_system_info.cpp (revision 220d04022750f40f8bac8f01fa551211e28d04f2)
1 /*
2  * Copyright 2006, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 #include <OS.h>
7 
8 #include <arch_cpu.h>
9 #include <arch/system_info.h>
10 #include <boot/kernel_args.h>
11 
12 
13 enum cpu_vendor sCPUVendor;
14 uint32 sPVR;
15 
16 static uint64 sCPUClockFrequency;
17 static uint64 sBusClockFrequency;
18 
19 struct cpu_model {
20 	uint16			version;
21 	enum cpu_vendor	vendor;
22 };
23 
24 // mapping of CPU versions to vendors
25 struct cpu_model kCPUModels[] = {
26 	{ MPC601,		B_CPU_VENDOR_MOTOROLA },
27 	{ MPC603,		B_CPU_VENDOR_MOTOROLA },
28 	{ MPC604,		B_CPU_VENDOR_MOTOROLA },
29 	{ MPC602,		B_CPU_VENDOR_MOTOROLA },
30 	{ MPC603e,		B_CPU_VENDOR_MOTOROLA },
31 	{ MPC603ev,		B_CPU_VENDOR_MOTOROLA },
32 	{ MPC750,		B_CPU_VENDOR_MOTOROLA },
33 	{ MPC604ev,		B_CPU_VENDOR_MOTOROLA },
34 	{ MPC7400,		B_CPU_VENDOR_MOTOROLA },
35 	{ MPC620,		B_CPU_VENDOR_MOTOROLA },
36 	{ IBM403,		B_CPU_VENDOR_IBM },
37 	{ IBM401A1,		B_CPU_VENDOR_IBM },
38 	{ IBM401B2,		B_CPU_VENDOR_IBM },
39 	{ IBM401C2,		B_CPU_VENDOR_IBM },
40 	{ IBM401D2,		B_CPU_VENDOR_IBM },
41 	{ IBM401E2,		B_CPU_VENDOR_IBM },
42 	{ IBM401F2,		B_CPU_VENDOR_IBM },
43 	{ IBM401G2,		B_CPU_VENDOR_IBM },
44 	{ IBMPOWER3,	B_CPU_VENDOR_IBM },
45 	{ MPC860,		B_CPU_VENDOR_MOTOROLA },
46 	{ MPC8240,		B_CPU_VENDOR_MOTOROLA },
47 	{ IBM405GP,		B_CPU_VENDOR_IBM },
48 	{ IBM405L,		B_CPU_VENDOR_IBM },
49 	{ IBM750FX,		B_CPU_VENDOR_IBM },
50 	{ MPC7450,		B_CPU_VENDOR_MOTOROLA },
51 	{ MPC7455,		B_CPU_VENDOR_MOTOROLA },
52 	{ MPC7457,		B_CPU_VENDOR_MOTOROLA },
53 	{ MPC7447A,		B_CPU_VENDOR_MOTOROLA },
54 	{ MPC7448,		B_CPU_VENDOR_MOTOROLA },
55 	{ MPC7410,		B_CPU_VENDOR_MOTOROLA },
56 	{ MPC8245,		B_CPU_VENDOR_MOTOROLA },
57 	{ 0,			B_CPU_VENDOR_UNKNOWN }
58 };
59 
60 
61 void
62 arch_fill_topology_node(cpu_topology_node_info* node, int32 cpu)
63 {
64 	switch (node->type) {
65 		case B_TOPOLOGY_ROOT:
66 #if  __powerpc64__
67 			node->data.root.platform = B_CPU_PPC_64;
68 #else
69 			node->data.root.platform = B_CPU_PPC;
70 #endif
71 			break;
72 
73 		case B_TOPOLOGY_PACKAGE:
74 			node->data.package.vendor = sCPUVendor;
75 			node->data.package.cache_line_size = CACHE_LINE_SIZE;
76 			break;
77 
78 		case B_TOPOLOGY_CORE:
79 			node->data.core.model = sPVR;
80 			node->data.core.default_frequency = sCPUClockFrequency;
81 			break;
82 
83 		default:
84 			break;
85 	}
86 }
87 
88 
89 status_t
90 arch_system_info_init(struct kernel_args *args)
91 {
92 	int i;
93 
94 	sCPUClockFrequency = args->arch_args.cpu_frequency;
95 	sBusClockFrequency = args->arch_args.bus_frequency;
96 
97 	// The PVR (processor version register) contains processor version and
98 	// revision.
99 	sPVR = get_pvr();
100 	uint16 model = (uint16)(sPVR >> 16);
101 	//sCPURevision = (uint16)(pvr & 0xffff);
102 
103 	// Populate vendor
104 	for (i = 0; kCPUModels[i].vendor != B_CPU_VENDOR_UNKNOWN; i++) {
105 		if (model == kCPUModels[i].version) {
106 			sCPUVendor = kCPUModels[i].vendor;
107 			break;
108 		}
109 	}
110 
111 	return B_OK;
112 }
113