1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#define DEFINE_ACPI_GLOBALS
45
46#include <acpi/acpi.h>
47#include "accommon.h"
48#include "acnamesp.h"
49
50#define _COMPONENT ACPI_UTILITIES
51ACPI_MODULE_NAME("utglobal")
52
53
54
55
56
57
58
59
60
61
62
63u32 acpi_dbg_level = ACPI_DEBUG_DEFAULT;
64
65
66
67u32 acpi_dbg_layer = 0;
68u32 acpi_gbl_nesting_level = 0;
69
70
71
72u8 acpi_gbl_db_terminate_threads = FALSE;
73u8 acpi_gbl_abort_method = FALSE;
74u8 acpi_gbl_method_executing = FALSE;
75
76
77
78u32 acpi_gbl_startup_flags = 0;
79
80
81
82u8 acpi_gbl_shutdown = TRUE;
83
84const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = {
85 "\\_S0_",
86 "\\_S1_",
87 "\\_S2_",
88 "\\_S3_",
89 "\\_S4_",
90 "\\_S5_"
91};
92
93const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS] = {
94 "_S0W",
95 "_S1W",
96 "_S2W",
97 "_S3W",
98 "_S4W"
99};
100
101const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS] = {
102 "_S1D",
103 "_S2D",
104 "_S3D",
105 "_S4D"
106};
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122const char *acpi_format_exception(acpi_status status)
123{
124 const char *exception = NULL;
125
126 ACPI_FUNCTION_ENTRY();
127
128 exception = acpi_ut_validate_exception(status);
129 if (!exception) {
130
131
132
133 ACPI_ERROR((AE_INFO,
134 "Unknown exception code: 0x%8.8X", status));
135
136 exception = "UNKNOWN_STATUS_CODE";
137 dump_stack();
138 }
139
140 return (ACPI_CAST_PTR(const char, exception));
141}
142
143ACPI_EXPORT_SYMBOL(acpi_format_exception)
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159const struct acpi_predefined_names acpi_gbl_pre_defined_names[] = {
160 {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
161 {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
162 {"_SB_", ACPI_TYPE_DEVICE, NULL},
163 {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
164 {"_TZ_", ACPI_TYPE_THERMAL, NULL},
165 {"_REV", ACPI_TYPE_INTEGER, (char *)ACPI_CA_SUPPORT_LEVEL},
166 {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
167 {"_GL_", ACPI_TYPE_MUTEX, (char *)1},
168
169#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
170 {"_OSI", ACPI_TYPE_METHOD, (char *)1},
171#endif
172
173
174
175 {NULL, ACPI_TYPE_ANY, NULL}
176};
177
178
179
180
181
182const u8 acpi_gbl_ns_properties[] = {
183 ACPI_NS_NORMAL,
184 ACPI_NS_NORMAL,
185 ACPI_NS_NORMAL,
186 ACPI_NS_NORMAL,
187 ACPI_NS_NORMAL,
188 ACPI_NS_NORMAL,
189 ACPI_NS_NEWSCOPE,
190 ACPI_NS_NORMAL,
191 ACPI_NS_NEWSCOPE,
192 ACPI_NS_NORMAL,
193 ACPI_NS_NORMAL,
194 ACPI_NS_NEWSCOPE,
195 ACPI_NS_NEWSCOPE,
196 ACPI_NS_NEWSCOPE,
197 ACPI_NS_NORMAL,
198 ACPI_NS_NORMAL,
199 ACPI_NS_NORMAL,
200 ACPI_NS_NORMAL,
201 ACPI_NS_NORMAL,
202 ACPI_NS_NORMAL,
203 ACPI_NS_NORMAL,
204 ACPI_NS_NORMAL,
205 ACPI_NS_NORMAL,
206 ACPI_NS_NORMAL,
207 ACPI_NS_NORMAL,
208 ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,
209 ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,
210 ACPI_NS_NEWSCOPE,
211 ACPI_NS_NORMAL,
212 ACPI_NS_NORMAL,
213 ACPI_NS_NORMAL
214};
215
216
217
218static const char acpi_gbl_hex_to_ascii[] = {
219 '0', '1', '2', '3', '4', '5', '6', '7',
220 '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
221};
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237char acpi_ut_hex_to_ascii_char(acpi_integer integer, u32 position)
238{
239
240 return (acpi_gbl_hex_to_ascii[(integer >> position) & 0xF]);
241}
242
243
244
245
246
247
248
249struct acpi_bit_register_info acpi_gbl_bit_register_info[ACPI_NUM_BITREG] = {
250
251
252 {ACPI_REGISTER_PM1_STATUS,
253 ACPI_BITPOSITION_TIMER_STATUS,
254 ACPI_BITMASK_TIMER_STATUS},
255 {ACPI_REGISTER_PM1_STATUS,
256 ACPI_BITPOSITION_BUS_MASTER_STATUS,
257 ACPI_BITMASK_BUS_MASTER_STATUS},
258 {ACPI_REGISTER_PM1_STATUS,
259 ACPI_BITPOSITION_GLOBAL_LOCK_STATUS,
260 ACPI_BITMASK_GLOBAL_LOCK_STATUS},
261 {ACPI_REGISTER_PM1_STATUS,
262 ACPI_BITPOSITION_POWER_BUTTON_STATUS,
263 ACPI_BITMASK_POWER_BUTTON_STATUS},
264 {ACPI_REGISTER_PM1_STATUS,
265 ACPI_BITPOSITION_SLEEP_BUTTON_STATUS,
266 ACPI_BITMASK_SLEEP_BUTTON_STATUS},
267 {ACPI_REGISTER_PM1_STATUS,
268 ACPI_BITPOSITION_RT_CLOCK_STATUS,
269 ACPI_BITMASK_RT_CLOCK_STATUS},
270 {ACPI_REGISTER_PM1_STATUS,
271 ACPI_BITPOSITION_WAKE_STATUS,
272 ACPI_BITMASK_WAKE_STATUS},
273 {ACPI_REGISTER_PM1_STATUS,
274 ACPI_BITPOSITION_PCIEXP_WAKE_STATUS,
275 ACPI_BITMASK_PCIEXP_WAKE_STATUS},
276
277 {ACPI_REGISTER_PM1_ENABLE,
278 ACPI_BITPOSITION_TIMER_ENABLE,
279 ACPI_BITMASK_TIMER_ENABLE},
280 {ACPI_REGISTER_PM1_ENABLE,
281 ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE,
282 ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
283 {ACPI_REGISTER_PM1_ENABLE,
284 ACPI_BITPOSITION_POWER_BUTTON_ENABLE,
285 ACPI_BITMASK_POWER_BUTTON_ENABLE},
286 {ACPI_REGISTER_PM1_ENABLE,
287 ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE,
288 ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
289 {ACPI_REGISTER_PM1_ENABLE,
290 ACPI_BITPOSITION_RT_CLOCK_ENABLE,
291 ACPI_BITMASK_RT_CLOCK_ENABLE},
292 {ACPI_REGISTER_PM1_ENABLE,
293 ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE,
294 ACPI_BITMASK_PCIEXP_WAKE_DISABLE},
295
296 {ACPI_REGISTER_PM1_CONTROL,
297 ACPI_BITPOSITION_SCI_ENABLE,
298 ACPI_BITMASK_SCI_ENABLE},
299 {ACPI_REGISTER_PM1_CONTROL,
300 ACPI_BITPOSITION_BUS_MASTER_RLD,
301 ACPI_BITMASK_BUS_MASTER_RLD},
302 {ACPI_REGISTER_PM1_CONTROL,
303 ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE,
304 ACPI_BITMASK_GLOBAL_LOCK_RELEASE},
305 {ACPI_REGISTER_PM1_CONTROL,
306 ACPI_BITPOSITION_SLEEP_TYPE,
307 ACPI_BITMASK_SLEEP_TYPE},
308 {ACPI_REGISTER_PM1_CONTROL,
309 ACPI_BITPOSITION_SLEEP_ENABLE,
310 ACPI_BITMASK_SLEEP_ENABLE},
311
312 {ACPI_REGISTER_PM2_CONTROL,
313 ACPI_BITPOSITION_ARB_DISABLE,
314 ACPI_BITMASK_ARB_DISABLE}
315};
316
317struct acpi_fixed_event_info acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS] = {
318 {ACPI_BITREG_TIMER_STATUS,
319 ACPI_BITREG_TIMER_ENABLE,
320 ACPI_BITMASK_TIMER_STATUS,
321 ACPI_BITMASK_TIMER_ENABLE},
322 {ACPI_BITREG_GLOBAL_LOCK_STATUS,
323 ACPI_BITREG_GLOBAL_LOCK_ENABLE,
324 ACPI_BITMASK_GLOBAL_LOCK_STATUS,
325 ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
326 {ACPI_BITREG_POWER_BUTTON_STATUS,
327 ACPI_BITREG_POWER_BUTTON_ENABLE,
328 ACPI_BITMASK_POWER_BUTTON_STATUS,
329 ACPI_BITMASK_POWER_BUTTON_ENABLE},
330 {ACPI_BITREG_SLEEP_BUTTON_STATUS,
331 ACPI_BITREG_SLEEP_BUTTON_ENABLE,
332 ACPI_BITMASK_SLEEP_BUTTON_STATUS,
333 ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
334 {ACPI_BITREG_RT_CLOCK_STATUS,
335 ACPI_BITREG_RT_CLOCK_ENABLE,
336 ACPI_BITMASK_RT_CLOCK_STATUS,
337 ACPI_BITMASK_RT_CLOCK_ENABLE},
338};
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS] = {
355 "SystemMemory",
356 "SystemIO",
357 "PCI_Config",
358 "EmbeddedControl",
359 "SMBus",
360 "SystemCMOS",
361 "PCIBARTarget",
362 "IPMI",
363 "DataTable"
364};
365
366char *acpi_ut_get_region_name(u8 space_id)
367{
368
369 if (space_id >= ACPI_USER_REGION_BEGIN) {
370 return ("UserDefinedRegion");
371 } else if (space_id >= ACPI_NUM_PREDEFINED_REGIONS) {
372 return ("InvalidSpaceId");
373 }
374
375 return (ACPI_CAST_PTR(char, acpi_gbl_region_types[space_id]));
376}
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = {
393 "PM_Timer",
394 "GlobalLock",
395 "PowerButton",
396 "SleepButton",
397 "RealTimeClock",
398};
399
400char *acpi_ut_get_event_name(u32 event_id)
401{
402
403 if (event_id > ACPI_EVENT_MAX) {
404 return ("InvalidEventID");
405 }
406
407 return (ACPI_CAST_PTR(char, acpi_gbl_event_types[event_id]));
408}
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430static const char acpi_gbl_bad_type[] = "UNDEFINED";
431
432
433
434static const char *acpi_gbl_ns_type_names[] = {
435 "Untyped",
436 "Integer",
437 "String",
438 "Buffer",
439 "Package",
440 "FieldUnit",
441 "Device",
442 "Event",
443 "Method",
444 "Mutex",
445 "Region",
446 "Power",
447 "Processor",
448 "Thermal",
449 "BufferField",
450 "DdbHandle",
451 "DebugObject",
452 "RegionField",
453 "BankField",
454 "IndexField",
455 "Reference",
456 "Alias",
457 "MethodAlias",
458 "Notify",
459 "AddrHandler",
460 "ResourceDesc",
461 "ResourceFld",
462 "Scope",
463 "Extra",
464 "Data",
465 "Invalid"
466};
467
468char *acpi_ut_get_type_name(acpi_object_type type)
469{
470
471 if (type > ACPI_TYPE_INVALID) {
472 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
473 }
474
475 return (ACPI_CAST_PTR(char, acpi_gbl_ns_type_names[type]));
476}
477
478char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
479{
480
481 if (!obj_desc) {
482 return ("[NULL Object Descriptor]");
483 }
484
485 return (acpi_ut_get_type_name(obj_desc->common.type));
486}
487
488
489
490
491
492
493
494
495
496
497
498
499
500char *acpi_ut_get_node_name(void *object)
501{
502 struct acpi_namespace_node *node = (struct acpi_namespace_node *)object;
503
504
505
506 if (!object) {
507 return ("NULL");
508 }
509
510
511
512 if ((object == ACPI_ROOT_OBJECT) || (object == acpi_gbl_root_node)) {
513 return ("\"\\\" ");
514 }
515
516
517
518 if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
519 return ("####");
520 }
521
522
523
524 if (!acpi_ut_valid_acpi_name(node->name.integer)) {
525 node->name.integer = acpi_ut_repair_name(node->name.ascii);
526 }
527
528
529
530 return (node->name.ascii);
531}
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547static const char *acpi_gbl_desc_type_names[] = {
548 "Invalid",
549 "Cached",
550 "State-Generic",
551 "State-Update",
552 "State-Package",
553 "State-Control",
554 "State-RootParseScope",
555 "State-ParseScope",
556 "State-WalkScope",
557 "State-Result",
558 "State-Notify",
559 "State-Thread",
560 "Walk",
561 "Parser",
562 "Operand",
563 "Node"
564};
565
566char *acpi_ut_get_descriptor_name(void *object)
567{
568
569 if (!object) {
570 return ("NULL OBJECT");
571 }
572
573 if (ACPI_GET_DESCRIPTOR_TYPE(object) > ACPI_DESC_TYPE_MAX) {
574 return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
575 }
576
577 return (ACPI_CAST_PTR(char,
578 acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE
579 (object)]));
580
581}
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597static const char *acpi_gbl_ref_class_names[] = {
598 "Local",
599 "Argument",
600 "RefOf",
601 "Index",
602 "DdbHandle",
603 "Named Object",
604 "Debug"
605};
606
607const char *acpi_ut_get_reference_name(union acpi_operand_object *object)
608{
609 if (!object)
610 return "NULL Object";
611
612 if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND)
613 return "Not an Operand object";
614
615 if (object->common.type != ACPI_TYPE_LOCAL_REFERENCE)
616 return "Not a Reference object";
617
618 if (object->reference.class > ACPI_REFCLASS_MAX)
619 return "Unknown Reference class";
620
621 return acpi_gbl_ref_class_names[object->reference.class];
622}
623
624#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642char *acpi_ut_get_mutex_name(u32 mutex_id)
643{
644
645 if (mutex_id > ACPI_MAX_MUTEX) {
646 return ("Invalid Mutex ID");
647 }
648
649 return (acpi_gbl_mutex_names[mutex_id]);
650}
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666static const char *acpi_gbl_notify_value_names[] = {
667 "Bus Check",
668 "Device Check",
669 "Device Wake",
670 "Eject Request",
671 "Device Check Light",
672 "Frequency Mismatch",
673 "Bus Mode Mismatch",
674 "Power Fault",
675 "Capabilities Check",
676 "Device PLD Check",
677 "Reserved",
678 "System Locality Update"
679};
680
681const char *acpi_ut_get_notify_name(u32 notify_value)
682{
683
684 if (notify_value <= ACPI_NOTIFY_MAX) {
685 return (acpi_gbl_notify_value_names[notify_value]);
686 } else if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
687 return ("Reserved");
688 } else {
689
690 return ("**Device Specific**");
691 }
692}
693#endif
694
695
696
697
698
699
700
701
702
703
704
705
706
707u8 acpi_ut_valid_object_type(acpi_object_type type)
708{
709
710 if (type > ACPI_TYPE_LOCAL_MAX) {
711
712
713
714 return (FALSE);
715 }
716
717 return (TRUE);
718}
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733acpi_status acpi_ut_init_globals(void)
734{
735 acpi_status status;
736 u32 i;
737
738 ACPI_FUNCTION_TRACE(ut_init_globals);
739
740
741
742 status = acpi_ut_create_caches();
743 if (ACPI_FAILURE(status)) {
744 return_ACPI_STATUS(status);
745 }
746
747
748
749 for (i = 0; i < ACPI_NUM_MUTEX; i++) {
750 acpi_gbl_mutex_info[i].mutex = NULL;
751 acpi_gbl_mutex_info[i].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
752 acpi_gbl_mutex_info[i].use_count = 0;
753 }
754
755 for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++) {
756 acpi_gbl_owner_id_mask[i] = 0;
757 }
758
759
760
761 acpi_gbl_owner_id_mask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
762
763
764
765 acpi_gbl_gpe_xrupt_list_head = NULL;
766 acpi_gbl_gpe_fadt_blocks[0] = NULL;
767 acpi_gbl_gpe_fadt_blocks[1] = NULL;
768 acpi_current_gpe_count = 0;
769
770
771
772 acpi_gbl_system_notify.handler = NULL;
773 acpi_gbl_device_notify.handler = NULL;
774 acpi_gbl_exception_handler = NULL;
775 acpi_gbl_init_handler = NULL;
776 acpi_gbl_table_handler = NULL;
777
778
779
780 acpi_gbl_global_lock_semaphore = NULL;
781 acpi_gbl_global_lock_mutex = NULL;
782 acpi_gbl_global_lock_acquired = FALSE;
783 acpi_gbl_global_lock_handle = 0;
784 acpi_gbl_global_lock_present = FALSE;
785
786
787
788 acpi_gbl_cm_single_step = FALSE;
789 acpi_gbl_db_terminate_threads = FALSE;
790 acpi_gbl_shutdown = FALSE;
791 acpi_gbl_ns_lookup_count = 0;
792 acpi_gbl_ps_find_count = 0;
793 acpi_gbl_acpi_hardware_present = TRUE;
794 acpi_gbl_last_owner_id_index = 0;
795 acpi_gbl_next_owner_id_offset = 0;
796 acpi_gbl_trace_method_name = 0;
797 acpi_gbl_trace_dbg_level = 0;
798 acpi_gbl_trace_dbg_layer = 0;
799 acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
800 acpi_gbl_db_output_flags = ACPI_DB_CONSOLE_OUTPUT;
801 acpi_gbl_osi_data = 0;
802
803
804
805 acpi_gbl_events_initialized = FALSE;
806 acpi_gbl_system_awake_and_running = TRUE;
807
808
809
810 acpi_gbl_module_code_list = NULL;
811 acpi_gbl_root_node = NULL;
812 acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
813 acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
814 acpi_gbl_root_node_struct.type = ACPI_TYPE_DEVICE;
815 acpi_gbl_root_node_struct.child = NULL;
816 acpi_gbl_root_node_struct.peer = NULL;
817 acpi_gbl_root_node_struct.object = NULL;
818 acpi_gbl_root_node_struct.flags = ANOBJ_END_OF_PEER_LIST;
819
820#ifdef ACPI_DEBUG_OUTPUT
821 acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
822#endif
823
824#ifdef ACPI_DBG_TRACK_ALLOCATIONS
825 acpi_gbl_display_final_mem_stats = FALSE;
826#endif
827
828 return_ACPI_STATUS(AE_OK);
829}
830
831ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
832ACPI_EXPORT_SYMBOL(acpi_dbg_level)
833ACPI_EXPORT_SYMBOL(acpi_dbg_layer)
834ACPI_EXPORT_SYMBOL(acpi_current_gpe_count)
835