xref: /haiku/src/add-ons/kernel/cpu/x86/amd.cpp (revision 1294543de9ac0eff000eaea1b18368c36435d08e)
1 /*
2  * Copyright 2005-2009, Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  */
8 
9 
10 #include "amd.h"
11 #include "generic_x86.h"
12 
13 #include <OS.h>
14 
15 
16 static void
17 amd_init_mtrrs(void)
18 {
19 	generic_init_mtrrs(generic_count_mtrrs());
20 }
21 
22 
23 static status_t
24 amd_init(void)
25 {
26 	system_info info;
27 	if (get_system_info(&info) != B_OK)
28 		return B_ERROR;
29 
30 	if ((info.cpu_type & B_CPU_x86_VENDOR_MASK) != B_CPU_AMD_x86)
31 		return B_ERROR;
32 
33 	// The K6-2 doesn't seem to support write-combining (before model 9),
34 	// so we ignore anything before that one.
35 	if (info.cpu_type <= B_CPU_AMD_K6_2)
36 		return B_ERROR;
37 
38 	generic_mtrr_compute_physical_mask();
39 	generic_dump_mtrrs(generic_count_mtrrs());
40 
41 	return B_OK;
42 }
43 
44 
45 static void
46 amd_set_mtrrs(uint8 defaultType, const x86_mtrr_info* infos, uint32 count)
47 {
48 	generic_set_mtrrs(defaultType, infos, count, generic_count_mtrrs());
49 }
50 
51 
52 static status_t
53 amd_stdops(int32 op, ...)
54 {
55 	switch (op) {
56 		case B_MODULE_INIT:
57 			return amd_init();
58 		case B_MODULE_UNINIT:
59 			return B_OK;
60 	}
61 
62 	return B_ERROR;
63 }
64 
65 
66 x86_cpu_module_info gAMDModule = {
67 	{
68 		"cpu/generic_x86/amd/v1",
69 		0,
70 		amd_stdops,
71 	},
72 
73 	generic_count_mtrrs,
74 	amd_init_mtrrs,
75 
76 	generic_set_mtrr,
77 	generic_get_mtrr,
78 	amd_set_mtrrs
79 };
80