resetting manifest requested domain to floor
[platform/upstream/x86info.git] / mtrr.c
1 /*
2  *  (C) 2002 Dave Jones.
3  *
4  *  Licensed under the terms of the GNU GPL License version 2.
5  *
6  *  MTRR register dumping.
7  *  TODO : decode the registers too.
8  */
9
10 #include <stdio.h>
11 #include <asm/mtrr.h>
12 #include "x86info.h"
13
14 #define IA32_MTRRCAP_SMRR 0x800
15 #define IA32_MTRRCAP_WC   0x400
16 #define IA32_MTRRCAP_FIX  0x100
17 #define IA32_MTRRCAP_VCNT 0xFF
18
19 #define IA32_MTRR_DEFTYPE_E    0x800
20 #define IA32_MTRR_DEFTYPE_FE   0x400
21 #define IA32_MTRR_DEFTYPE_TYPE 0xFF
22
23 #define IA32_PHYBASE_TYPE   0XFF
24 #define IA32_PHYMASK_VALID  0X800
25
26 static unsigned int max_phy_addr = 0;
27
28 static char * mtrr_types[MTRR_NUM_TYPES] =
29 {
30     "uncacheable",
31     "write-combining",
32     "?",
33     "?",
34     "write-through",
35     "write-protect",
36     "write-back",
37 };
38
39 static void decode_address(unsigned long long val)
40 {
41         switch (max_phy_addr) {
42                 case 40:
43                         printf("0x%07x ", (unsigned int) ((val >> 12) & 0xFFFFFFF));
44                         break;
45                 case 36:
46                 default:
47                         printf("0x%06x ", (unsigned int) ((val >> 12) & 0xFFFFFF));
48                         break;
49         }
50 }
51
52 static void set_max_phy_addr(struct cpudata *cpu)
53 {
54         unsigned int value;
55
56         if (!max_phy_addr) {
57                 cpuid(cpu->number, 0x80000008,&value, NULL, NULL, NULL);
58                 max_phy_addr = (value & 0xFF);
59         }
60 }
61
62 static int mtrr_value(int cpu, int msr, unsigned long long * val)
63 {
64         if (read_msr(cpu, msr, val) == 1)
65                 return 1;
66         else
67                 return 0;
68 }
69
70 static void dump_mtrr(int cpu, int msr)
71 {
72         unsigned long long val=0;
73
74         if (read_msr(cpu, msr, &val) == 1)
75                 printf("0x%016llx\n", val);
76 }
77
78 static void decode_mtrrcap(int cpu, int msr)
79 {
80         unsigned long long val;
81         int ret;
82
83         ret = mtrr_value(cpu,msr,&val);
84         if (ret) {
85                 printf("0x%016llx ", val);
86                 printf("(smrr flag: 0x%01x, ",(unsigned int) (val & IA32_MTRRCAP_SMRR) >> 11 );
87                 printf("wc flag: 0x%01x, ",(unsigned int) (val&IA32_MTRRCAP_WC) >> 10);
88                 printf("fix flag: 0x%01x, ",(unsigned int) (val&IA32_MTRRCAP_FIX) >> 8);
89                 printf("vcnt field: 0x%02x (%d))\n",(unsigned int) (val&IA32_MTRRCAP_VCNT) , (int) (val&IA32_MTRRCAP_VCNT));
90         }
91 }
92
93 static void decode_mtrr_deftype(int cpu, int msr)
94 {
95         unsigned long long val;
96         int ret;
97
98         ret = mtrr_value(cpu,msr,&val);
99         if (ret) {
100                 printf("0x%016llx ", val);
101                 printf("(fixed-range flag: 0x%01x, ",(unsigned int) (val&IA32_MTRR_DEFTYPE_FE) >> 10);
102                 printf("mtrr flag: 0x%01x, ",(unsigned int) (val&IA32_MTRR_DEFTYPE_E) >> 11);
103                 printf("type field: 0x%02x (%s))\n", (unsigned int) (val&IA32_MTRR_DEFTYPE_TYPE) >> 8,
104                                 mtrr_types[((val&IA32_MTRR_DEFTYPE_TYPE) >> 8)]);
105         }
106 }
107
108 static void decode_mtrr_physbase(int cpu, int msr)
109 {
110         unsigned long long val;
111         int ret;
112
113         ret = mtrr_value(cpu,msr,&val);
114         if (ret) {
115                 printf("0x%016llx ", val);
116
117                 printf("(physbase field:");
118                 decode_address(val);
119
120                 printf("type field: 0x%02x (%s))\n",(unsigned int) (val&IA32_PHYBASE_TYPE),
121                                 mtrr_types[((val&IA32_PHYBASE_TYPE))]);
122         }
123 }
124
125 static void decode_mtrr_physmask(int cpu, int msr)
126 {
127         unsigned long long val;
128         int ret;
129
130         ret = mtrr_value(cpu,msr,&val);
131         if (ret) {
132                 printf("0x%016llx ", val);
133
134                 printf("(physmask field:");
135                 decode_address(val);
136
137                 printf("valid flag: %d)\n",(int) (val&IA32_PHYMASK_VALID)>>11);
138         }
139 }
140
141
142 void dump_mtrrs(struct cpudata *cpu)
143 {
144         unsigned long long val = 0;
145         unsigned int i;
146
147         if (!(cpu->flags_edx & (X86_FEATURE_MTRR)))
148                 return;
149
150         /*
151          * If MTRR registers are not accessible like in some
152          * virtualization systems then return
153          */
154         if (!read_msr(cpu->number, 0xfe, &val))
155                 return;
156
157         printf("MTRR registers:\n");
158
159         printf("MTRRcap (0xfe): ");
160         decode_mtrrcap(cpu->number, 0xfe);
161
162         set_max_phy_addr(cpu);
163
164         for (i = 0; i < 16; i+=2) {
165                 printf("MTRRphysBase%u (0x%x): ", i/2, (unsigned int) 0x200+i);
166                 decode_mtrr_physbase(cpu->number, 0x200+i);
167                 printf("MTRRphysMask%u (0x%x): ", i/2, (unsigned int) 0x201+i);
168                 decode_mtrr_physmask(cpu->number, 0x201+i);
169         }
170
171         printf("MTRRfix64K_00000 (0x250): ");
172         dump_mtrr (cpu->number, 0x250);
173         printf("MTRRfix16K_80000 (0x258): ");
174         dump_mtrr (cpu->number, 0x258);
175         printf("MTRRfix16K_A0000 (0x259): ");
176         dump_mtrr (cpu->number, 0x259);
177
178         printf("MTRRfix4K_C8000 (0x269): ");
179         dump_mtrr (cpu->number, 0x269);
180         printf("MTRRfix4K_D0000 0x26a: ");
181         dump_mtrr (cpu->number, 0x26a);
182         printf("MTRRfix4K_D8000 0x26b: ");
183         dump_mtrr (cpu->number, 0x26b);
184         printf("MTRRfix4K_E0000 0x26c: ");
185         dump_mtrr (cpu->number, 0x26c);
186         printf("MTRRfix4K_E8000 0x26d: ");
187         dump_mtrr (cpu->number, 0x26d);
188         printf("MTRRfix4K_F0000 0x26e: ");
189         dump_mtrr (cpu->number, 0x26e);
190         printf("MTRRfix4K_F8000 0x26f: ");
191         dump_mtrr (cpu->number, 0x26f);
192
193         printf("MTRRdefType (0x2ff): ");
194         decode_mtrr_deftype(cpu->number, 0x2ff);
195
196         printf("\n");
197 }