Chameleon

Chameleon Svn Source Tree

Root/trunk/i386/libsaio/state_generator.c

1/*
2 * Copyright 2008 mackerintel
3 *
4 * state_generator.h
5 * Chameleon
6 *
7 * Created by Mozodojo on 20/07/10.
8 * Copyright 2010 mozodojo. All rights reserved.
9 *
10 */
11
12#include "libsaio.h"
13#include "boot.h"
14#include "bootstruct.h"
15#include "acpi.h"
16#include "efi_tables.h"
17#include "fake_efi.h"
18#include "acpi_patcher.h"
19#include "platform.h"
20#include "cpu.h"
21#include "aml_generator.h"
22#include "state_generator.h"
23
24#ifndef DEBUG_STATE
25#define DEBUG_STATE 0
26#endif
27
28#if DEBUG_STATE==2
29#define DBG(x...) {printf(x); sleep(1);}
30#elif DEBUG_STATE==1
31#define DBG(x...) printf(x)
32#else
33#define DBG(x...) msglog(x)
34#endif
35
36extern uint8_t acpi_cpu_count;
37extern uint32_t acpi_cpu_p_blk;
38extern char* acpi_cpu_name[32];
39
40static char const pss_ssdt_header[] =
41{
420x53, 0x53, 0x44, 0x54, 0x7E, 0x00, 0x00, 0x00, /* SSDT.... */
430x01, 0x6A, 0x50, 0x6D, 0x52, 0x65, 0x66, 0x00, /* ..PmRef. */
440x43, 0x70, 0x75, 0x50, 0x6D, 0x00, 0x00, 0x00, /* CpuPm... */
450x00, 0x30, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, /* .0..INTL */
460x31, 0x03, 0x10, 0x20,/* 1.._*/
47};
48
49static char const cst_ssdt_header[] =
50{
510x53, 0x53, 0x44, 0x54, 0xE7, 0x00, 0x00, 0x00, /* SSDT.... */
520x01, 0x17, 0x50, 0x6D, 0x52, 0x65, 0x66, 0x41, /* ..PmRefA */
530x43, 0x70, 0x75, 0x43, 0x73, 0x74, 0x00, 0x00, /* CpuCst.. */
540x00, 0x10, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, /* ....INTL */
550x31, 0x03, 0x10, 0x20/* 1.._*/
56};
57
58char resource_template_register_fixedhw[] =
59{
600x11, 0x14, 0x0A, 0x11, 0x82, 0x0C, 0x00, 0x7F,
610x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620x00, 0x00, 0x01, 0x79, 0x00
63};
64
65char resource_template_register_systemio[] =
66{
670x11, 0x14, 0x0A, 0x11, 0x82, 0x0C, 0x00, 0x01,
680x08, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0x00,
690x00, 0x00, 0x00, 0x79, 0x00,
70};
71
72struct acpi_2_ssdt *generate_pss_ssdt(struct acpi_2_dsdt *dsdt)
73{
74
75if (Platform.CPU.Vendor != 0x756E6547)
76{
77DBG("Not an Intel platform: P-States will not be generated !!!\n");
78return NULL;
79}
80
81if (!(Platform.CPU.Features & CPU_FEATURE_MSR))
82{
83DBG("Unsupported CPU: P-States will not be generated !!! No MSR support\n");
84return NULL;
85}
86
87if (acpi_cpu_count == 0)
88{
89get_acpi_cpu_names((void*)dsdt, dsdt->Length);
90}
91
92if (acpi_cpu_count > 0)
93{
94struct p_state initial, maximum, minimum, p_states[32];
95uint8_t p_states_count = 0;
96
97// Retrieving P-States, ported from code by superhai (c)
98switch (Platform.CPU.Family)
99{
100case 0x06:
101{
102switch (Platform.CPU.Model)
103{
104case CPUID_MODEL_DOTHAN:// Intel Pentium M
105case CPUID_MODEL_YONAH:// Intel Mobile Core Solo, Duo
106case CPUID_MODEL_MEROM:// Intel Mobile Core 2 Solo, Duo, Xeon 30xx, Xeon 51xx, Xeon X53xx, Xeon E53xx, Xeon X32xx
107case CPUID_MODEL_PENRYN:// Intel Core 2 Solo, Duo, Quad, Extreme, Xeon X54xx, Xeon X33xx
108case CPUID_MODEL_ATOM:// Intel Atom (45nm)
109{
110bool cpu_dynamic_fsb = false;
111
112if (rdmsr64(MSR_IA32_EXT_CONFIG) & (1 << 27))
113{
114wrmsr64(MSR_IA32_EXT_CONFIG, (rdmsr64(MSR_IA32_EXT_CONFIG) | (1 << 28)));
115delay(1);
116cpu_dynamic_fsb = rdmsr64(MSR_IA32_EXT_CONFIG) & (1 << 28);
117}
118
119bool cpu_noninteger_bus_ratio = (rdmsr64(MSR_IA32_PERF_STATUS) & (1ULL << 46));
120
121initial.Control = rdmsr64(MSR_IA32_PERF_STATUS);
122
123maximum.Control = ((rdmsr64(MSR_IA32_PERF_STATUS) >> 32) & 0x1F3F) | (0x4000 * cpu_noninteger_bus_ratio);
124maximum.CID = ((maximum.FID & 0x1F) << 1) | cpu_noninteger_bus_ratio;
125
126minimum.FID = ((rdmsr64(MSR_IA32_PERF_STATUS) >> 24) & 0x1F) | (0x80 * cpu_dynamic_fsb);
127minimum.VID = ((rdmsr64(MSR_IA32_PERF_STATUS) >> 48) & 0x3F);
128
129if (minimum.FID == 0)
130{
131uint64_t msr;
132uint8_t i;
133// Probe for lowest fid
134for (i = maximum.FID; i >= 0x6; i--)
135{
136msr = rdmsr64(MSR_IA32_PERF_CONTROL);
137wrmsr64(MSR_IA32_PERF_CONTROL, (msr & 0xFFFFFFFFFFFF0000ULL) | (i << 8) | minimum.VID);
138intel_waitforsts();
139minimum.FID = (rdmsr64(MSR_IA32_PERF_STATUS) >> 8) & 0x1F;
140delay(1);
141}
142
143msr = rdmsr64(MSR_IA32_PERF_CONTROL);
144wrmsr64(MSR_IA32_PERF_CONTROL, (msr & 0xFFFFFFFFFFFF0000ULL) | (maximum.FID << 8) | maximum.VID);
145intel_waitforsts();
146}
147
148if (minimum.VID == maximum.VID)
149{
150uint64_t msr;
151uint8_t i;
152// Probe for lowest vid
153for (i = maximum.VID; i > 0xA; i--)
154{
155msr = rdmsr64(MSR_IA32_PERF_CONTROL);
156wrmsr64(MSR_IA32_PERF_CONTROL, (msr & 0xFFFFFFFFFFFF0000ULL) | (minimum.FID << 8) | i);
157intel_waitforsts();
158minimum.VID = rdmsr64(MSR_IA32_PERF_STATUS) & 0x3F;
159delay(1);
160}
161
162msr = rdmsr64(MSR_IA32_PERF_CONTROL);
163wrmsr64(MSR_IA32_PERF_CONTROL, (msr & 0xFFFFFFFFFFFF0000ULL) | (maximum.FID << 8) | maximum.VID);
164intel_waitforsts();
165}
166
167minimum.CID = ((minimum.FID & 0x1F) << 1) >> cpu_dynamic_fsb;
168
169// Sanity check
170if (maximum.CID < minimum.CID)
171{
172DBG("P-States: Insane FID values!");
173p_states_count = 0;
174}
175else
176{
177uint8_t vidstep;
178uint8_t u, invalid = 0;
179// Finalize P-States
180// Find how many P-States machine supports
181p_states_count = (uint8_t)(maximum.CID - minimum.CID + 1);
182
183if (p_states_count > 32)
184{
185p_states_count = 32;
186}
187
188vidstep = ((maximum.VID << 2) - (minimum.VID << 2)) / (p_states_count - 1);
189
190for (u = 0; u < p_states_count; u++)
191{
192uint8_t i = u - invalid;
193
194p_states[i].CID = maximum.CID - u;
195p_states[i].FID = (uint8_t)(p_states[i].CID >> 1);
196
197if (p_states[i].FID < 0x6)
198{
199if (cpu_dynamic_fsb)
200{
201p_states[i].FID = (p_states[i].FID << 1) | 0x80;
202}
203}
204else if (cpu_noninteger_bus_ratio)
205{
206p_states[i].FID = p_states[i].FID | (0x40 * (p_states[i].CID & 0x1));
207}
208
209if (i && p_states[i].FID == p_states[i-1].FID)
210{
211invalid++;
212}
213p_states[i].VID = ((maximum.VID << 2) - (vidstep * u)) >> 2;
214uint32_t multiplier = p_states[i].FID & 0x1f;// = 0x08
215bool half = p_states[i].FID & 0x40;// = 0x01
216bool dfsb = p_states[i].FID & 0x80;// = 0x00
217uint32_t fsb = (uint32_t)(Platform.CPU.FSBFrequency / 1000000); // = 400
218uint32_t halffsb = (fsb + 1) >> 1;// = 200
219uint32_t frequency = (multiplier * fsb);// = 3200
220
221p_states[i].Frequency = (uint32_t)(frequency + (half * halffsb)) >> dfsb;// = 3200 + 200 = 3400
222}
223
224p_states_count -= invalid;
225}
226
227break;
228}
229case CPUID_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
230case CPUID_MODEL_DALES://
231case CPUID_MODEL_DALES_32NM:// Intel Core i3, i5 LGA1156 (32nm)
232case CPUID_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
233case CPUID_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65xx
234case CPUID_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
235case CPUID_MODEL_WESTMERE_EX:// Intel Xeon E7
236case CPUID_MODEL_SANDYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (32nm)
237case CPUID_MODEL_JAKETOWN:// Intel Core i7, Xeon E5 LGA2011 (32nm)
238case CPUID_MODEL_IVYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (22nm)
239case CPUID_MODEL_HASWELL://
240case CPUID_MODEL_IVYBRIDGE_XEON://
241//case CPUID_MODEL_HASWELL_H://
242case CPUID_MODEL_HASWELL_SVR://
243case CPUID_MODEL_HASWELL_ULT://
244case CPUID_MODEL_CRYSTALWELL://
245
246{
247if ( (Platform.CPU.Model == CPUID_MODEL_SANDYBRIDGE) ||
248(Platform.CPU.Model == CPUID_MODEL_JAKETOWN) ||
249(Platform.CPU.Model == CPUID_MODEL_IVYBRIDGE) ||
250(Platform.CPU.Model == CPUID_MODEL_HASWELL) ||
251(Platform.CPU.Model == CPUID_MODEL_IVYBRIDGE_XEON) ||
252(Platform.CPU.Model == CPUID_MODEL_HASWELL_SVR) ||
253(Platform.CPU.Model == CPUID_MODEL_HASWELL_ULT) ||
254(Platform.CPU.Model == CPUID_MODEL_CRYSTALWELL) )
255{
256maximum.Control = (rdmsr64(MSR_IA32_PERF_STATUS) >> 8) & 0xff;
257}
258else
259{
260maximum.Control = rdmsr64(MSR_IA32_PERF_STATUS) & 0xff;
261}
262
263minimum.Control = (rdmsr64(MSR_PLATFORM_INFO) >> 40) & 0xff;
264
265DBG("P-States: min 0x%x, max 0x%x\n", minimum.Control, maximum.Control);
266
267// Sanity check
268if (maximum.Control < minimum.Control)
269{
270DBG("Insane control values!");
271p_states_count = 0;
272}
273else
274{
275uint8_t i;
276p_states_count = 0;
277
278for (i = maximum.Control; i >= minimum.Control; i--)
279{
280p_states[p_states_count].Control = i;
281p_states[p_states_count].CID = p_states[p_states_count].Control << 1;
282p_states[p_states_count].Frequency = (Platform.CPU.FSBFrequency / 1000000) * i;
283p_states_count++;
284}
285}
286
287break;
288}
289default:
290DBG("Unsupported CPU (0x%X): P-States not generated !!!\n", Platform.CPU.Family);
291break;
292}
293}
294}
295
296// Generating SSDT
297if (p_states_count > 0)
298{
299
300int i;
301
302AML_CHUNK* root = aml_create_node(NULL);
303aml_add_buffer(root, pss_ssdt_header, sizeof(pss_ssdt_header)); // SSDT header
304
305AML_CHUNK* scop = aml_add_scope(root, "\\_PR_");
306AML_CHUNK* name = aml_add_name(scop, "PSS_");
307AML_CHUNK* pack = aml_add_package(name);
308
309for (i = 0; i < p_states_count; i++)
310{
311AML_CHUNK* pstt = aml_add_package(pack);
312
313aml_add_dword(pstt, p_states[i].Frequency);
314aml_add_dword(pstt, 0x00000000); // Power
315aml_add_dword(pstt, 0x0000000A); // Latency
316aml_add_dword(pstt, 0x0000000A); // Latency
317aml_add_dword(pstt, p_states[i].Control);
318aml_add_dword(pstt, i+1); // Status
319}
320
321// Add aliaces
322for (i = 0; i < acpi_cpu_count; i++)
323{
324char name[9];
325sprintf(name, "_PR_%c%c%c%c", acpi_cpu_name[i][0], acpi_cpu_name[i][1], acpi_cpu_name[i][2], acpi_cpu_name[i][3]);
326
327scop = aml_add_scope(root, name);
328aml_add_alias(scop, "PSS_", "_PSS");
329}
330
331aml_calculate_size(root);
332
333struct acpi_2_ssdt *ssdt = (struct acpi_2_ssdt *)AllocateKernelMemory(root->Size);
334
335aml_write_node(root, (void*)ssdt, 0);
336
337ssdt->Length = root->Size;
338ssdt->Checksum = 0;
339ssdt->Checksum = (uint8_t)(256 - checksum8(ssdt, ssdt->Length));
340
341aml_destroy_node(root);
342
343//dumpPhysAddr("P-States SSDT content: ", ssdt, ssdt->Length);
344
345DBG("SSDT with CPU P-States generated successfully\n");
346
347return ssdt;
348}
349}
350else
351{
352DBG("ACPI CPUs not found: P-States not generated !!!\n");
353}
354
355return NULL;
356}
357
358struct acpi_2_ssdt *generate_cst_ssdt(struct acpi_2_fadt *fadt)
359{
360
361if (Platform.CPU.Vendor != 0x756E6547)
362{
363DBG("Not an Intel platform: C-States will not be generated !!!\n");
364return NULL;
365}
366
367if (fadt == NULL)
368{
369DBG("FACP not exists: C-States will not be generated !!!\n");
370return NULL;
371}
372
373struct acpi_2_dsdt *dsdt = (void *)fadt->DSDT;
374
375if (dsdt == NULL)
376{
377DBG("DSDT not found: C-States will not be generated !!!\n");
378return NULL;
379}
380
381if (acpi_cpu_count == 0)
382get_acpi_cpu_names((void*)dsdt, dsdt->Length);
383
384if (acpi_cpu_count > 0)
385{
386bool c2_enabled = false;
387bool c3_enabled = false;
388bool c4_enabled = false;
389bool c6_enabled = false;
390bool c7_enabled = false;
391bool cst_using_systemio = false;
392
393getBoolForKey(kEnableC2State, &c2_enabled, &bootInfo->chameleonConfig);
394getBoolForKey(kEnableC3State, &c3_enabled, &bootInfo->chameleonConfig);
395getBoolForKey(kEnableC4State, &c4_enabled, &bootInfo->chameleonConfig);
396getBoolForKey(kEnableC6State, &c6_enabled, &bootInfo->chameleonConfig);
397getBoolForKey(kEnableC7State, &c7_enabled, &bootInfo->chameleonConfig);
398getBoolForKey(kCSTUsingSystemIO, &cst_using_systemio, &bootInfo->chameleonConfig);
399
400c2_enabled = c2_enabled | (fadt->C2_Latency < 100);
401c3_enabled = c3_enabled | (fadt->C3_Latency < 1000);
402
403unsigned char cstates_count = 1 + (c2_enabled ? 1 : 0) + ((c3_enabled || c4_enabled)? 1 : 0) + (c6_enabled ? 1 : 0) + (c7_enabled ? 1 : 0);
404
405AML_CHUNK* root = aml_create_node(NULL);
406aml_add_buffer(root, cst_ssdt_header, sizeof(cst_ssdt_header)); // SSDT header
407AML_CHUNK* scop = aml_add_scope(root, "\\_PR_");
408AML_CHUNK* name = aml_add_name(scop, "CST_");
409AML_CHUNK* pack = aml_add_package(name);
410aml_add_byte(pack, cstates_count);
411
412AML_CHUNK* tmpl = aml_add_package(pack);
413if (cst_using_systemio)
414{
415// C1
416resource_template_register_fixedhw[8] = 0x00;
417resource_template_register_fixedhw[9] = 0x00;
418resource_template_register_fixedhw[18] = 0x00;
419aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
420aml_add_byte(tmpl, 0x01);// C1
421aml_add_word(tmpl, 0x0001);// Latency
422aml_add_dword(tmpl, 0x000003e8);// Power
423
424uint8_t p_blk_lo, p_blk_hi;
425
426if (c2_enabled) // C2
427{
428p_blk_lo = acpi_cpu_p_blk + 4;
429p_blk_hi = (acpi_cpu_p_blk + 4) >> 8;
430
431tmpl = aml_add_package(pack);
432resource_template_register_systemio[11] = p_blk_lo; // C2
433resource_template_register_systemio[12] = p_blk_hi; // C2
434aml_add_buffer(tmpl, resource_template_register_systemio, sizeof(resource_template_register_systemio));
435aml_add_byte(tmpl, 0x02);// C2
436aml_add_word(tmpl, 0x0040);// Latency
437aml_add_dword(tmpl, 0x000001f4);// Power
438}
439
440if (c4_enabled) // C4
441{
442p_blk_lo = acpi_cpu_p_blk + 5;
443p_blk_hi = (acpi_cpu_p_blk + 5) >> 8;
444
445tmpl = aml_add_package(pack);
446resource_template_register_systemio[11] = p_blk_lo; // C4
447resource_template_register_systemio[12] = p_blk_hi; // C4
448aml_add_buffer(tmpl, resource_template_register_systemio, sizeof(resource_template_register_systemio));
449aml_add_byte(tmpl, 0x04);// C4
450aml_add_word(tmpl, 0x0080);// Latency
451aml_add_dword(tmpl, 0x000000C8);// Power
452}
453else if (c3_enabled) // C3
454{
455p_blk_lo = acpi_cpu_p_blk + 5;
456p_blk_hi = (acpi_cpu_p_blk + 5) >> 8;
457
458tmpl = aml_add_package(pack);
459resource_template_register_systemio[11] = p_blk_lo; // C3
460resource_template_register_systemio[12] = p_blk_hi; // C3
461aml_add_buffer(tmpl, resource_template_register_systemio, sizeof(resource_template_register_systemio));
462aml_add_byte(tmpl, 0x03);// C3
463aml_add_word(tmpl, 0x0043);// Latency
464aml_add_dword(tmpl, 0x000001F4);// Power
465}
466if (c6_enabled) // C6
467{
468p_blk_lo = acpi_cpu_p_blk + 5;
469p_blk_hi = (acpi_cpu_p_blk + 5) >> 8;
470
471tmpl = aml_add_package(pack);
472resource_template_register_systemio[11] = p_blk_lo; // C6
473resource_template_register_systemio[12] = p_blk_hi; // C6
474aml_add_buffer(tmpl, resource_template_register_systemio, sizeof(resource_template_register_systemio));
475aml_add_byte(tmpl, 0x06);// C6
476aml_add_word(tmpl, 0x0046);// Latency
477aml_add_dword(tmpl, 0x0000015E);// Power
478}
479if (c7_enabled) //C7
480{
481p_blk_lo = (acpi_cpu_p_blk + 6) & 0xff;
482p_blk_hi = (acpi_cpu_p_blk + 5) >> 8;
483
484tmpl = aml_add_package(pack);
485resource_template_register_systemio[11] = p_blk_lo; // C4 or C7
486resource_template_register_systemio[12] = p_blk_hi;
487aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
488aml_add_byte(tmpl, 0x07);// C7
489aml_add_word(tmpl, 0xF5);// Latency as in iMac14,1
490aml_add_dword(tmpl, 0xC8);// Power
491}
492}
493else
494{
495// C1
496resource_template_register_fixedhw[8] = 0x01;
497resource_template_register_fixedhw[9] = 0x02;
498resource_template_register_fixedhw[18] = 0x01;
499
500resource_template_register_fixedhw[11] = 0x00; // C1
501aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
502aml_add_byte(tmpl, 0x01);// C1
503aml_add_word(tmpl, 0x0001);// Latency
504aml_add_dword(tmpl, 0x000003e8);// Power
505
506resource_template_register_fixedhw[18] = 0x03;
507
508if (c2_enabled) // C2
509{
510tmpl = aml_add_package(pack);
511resource_template_register_fixedhw[11] = 0x10; // C2
512aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
513aml_add_byte(tmpl, 0x02);// C2
514aml_add_word(tmpl, 0x0040);// Latency
515aml_add_dword(tmpl, 0x000001f4);// Power
516}
517
518if (c4_enabled) // C4
519{
520tmpl = aml_add_package(pack);
521resource_template_register_fixedhw[11] = 0x30; // C4
522aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
523aml_add_byte(tmpl, 0x04);// C4
524aml_add_word(tmpl, 0x0080);// Latency
525aml_add_dword(tmpl, 0x000000C8);// Power
526}
527else if (c3_enabled)
528{
529tmpl = aml_add_package(pack);
530resource_template_register_fixedhw[11] = 0x20; // C3
531aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
532aml_add_byte(tmpl, 0x03);// C3
533aml_add_word(tmpl, 0x0043);// Latency
534aml_add_dword(tmpl, 0x000001F4);// Power
535}
536if (c6_enabled) // C6
537{
538tmpl = aml_add_package(pack);
539resource_template_register_fixedhw[11] = 0x20; // C6
540aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
541aml_add_byte(tmpl, 0x06);// C6
542aml_add_word(tmpl, 0x0046);// Latency as in MacPro6,1
543aml_add_dword(tmpl, 0x0000015E);// Power
544}
545if (c7_enabled) // C7
546{
547tmpl = aml_add_package(pack);
548resource_template_register_fixedhw[11] = 0x30; // C4 or C7
549aml_add_buffer(tmpl, resource_template_register_fixedhw, sizeof(resource_template_register_fixedhw));
550aml_add_byte(tmpl, 0x07);// C7
551aml_add_word(tmpl, 0xF5);// Latency as in iMac14,1
552aml_add_dword(tmpl, 0xC8);// Power
553}
554}
555
556// Aliaces
557int i;
558for (i = 0; i < acpi_cpu_count; i++)
559{
560char name[9];
561sprintf(name, "_PR_%c%c%c%c", acpi_cpu_name[i][0], acpi_cpu_name[i][1], acpi_cpu_name[i][2], acpi_cpu_name[i][3]);
562
563scop = aml_add_scope(root, name);
564aml_add_alias(scop, "CST_", "_CST");
565}
566
567aml_calculate_size(root);
568
569struct acpi_2_ssdt *ssdt = (struct acpi_2_ssdt *)AllocateKernelMemory(root->Size);
570
571aml_write_node(root, (void*)ssdt, 0);
572
573ssdt->Length = root->Size;
574ssdt->Checksum = 0;
575ssdt->Checksum = 256 - checksum8(ssdt, ssdt->Length);
576
577aml_destroy_node(root);
578
579// dumpPhysAddr("C-States SSDT content: ", ssdt, ssdt->Length);
580
581DBG("SSDT with CPU C-States generated successfully\n");
582
583return ssdt;
584}
585else
586{
587DBG("ACPI CPUs not found: C-States not generated !!!\n");
588}
589
590return NULL;
591}
592

Archive Download this file

Revision: 2538