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#include <linux/module.h>
27#include <linux/kernel.h>
28#include <linux/slab.h>
29#include <linux/mm.h>
30#include <linux/highmem.h>
31#include <linux/pci.h>
32#include <linux/interrupt.h>
33#include <linux/kmod.h>
34#include <linux/delay.h>
35#include <linux/workqueue.h>
36#include <linux/nmi.h>
37#include <linux/acpi.h>
38#include <linux/efi.h>
39#include <linux/ioport.h>
40#include <linux/list.h>
41#include <linux/jiffies.h>
42#include <linux/semaphore.h>
43
44#include <asm/io.h>
45#include <asm/uaccess.h>
46#include <linux/io-64-nonatomic-lo-hi.h>
47
48#include "internal.h"
49
50#define _COMPONENT ACPI_OS_SERVICES
51ACPI_MODULE_NAME("osl");
52
53struct acpi_os_dpc {
54 acpi_osd_exec_callback function;
55 void *context;
56 struct work_struct work;
57};
58
59#ifdef CONFIG_ACPI_CUSTOM_DSDT
60#include CONFIG_ACPI_CUSTOM_DSDT_FILE
61#endif
62
63#ifdef ENABLE_DEBUGGER
64#include <linux/kdb.h>
65
66
67int acpi_in_debugger;
68EXPORT_SYMBOL(acpi_in_debugger);
69#endif
70
71static int (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl,
72 u32 pm1b_ctrl);
73static int (*__acpi_os_prepare_extended_sleep)(u8 sleep_state, u32 val_a,
74 u32 val_b);
75
76static acpi_osd_handler acpi_irq_handler;
77static void *acpi_irq_context;
78static struct workqueue_struct *kacpid_wq;
79static struct workqueue_struct *kacpi_notify_wq;
80static struct workqueue_struct *kacpi_hotplug_wq;
81static bool acpi_os_initialized;
82unsigned int acpi_sci_irq = INVALID_ACPI_IRQ;
83
84
85
86
87
88struct acpi_ioremap {
89 struct list_head list;
90 void __iomem *virt;
91 acpi_physical_address phys;
92 acpi_size size;
93 unsigned long refcount;
94};
95
96static LIST_HEAD(acpi_ioremaps);
97static DEFINE_MUTEX(acpi_ioremap_lock);
98
99static void __init acpi_osi_setup_late(void);
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134static struct osi_linux {
135 unsigned int enable:1;
136 unsigned int dmi:1;
137 unsigned int cmdline:1;
138 unsigned int default_disabling:1;
139} osi_linux = {0, 0, 0, 0};
140
141static u32 acpi_osi_handler(acpi_string interface, u32 supported)
142{
143 if (!strcmp("Linux", interface)) {
144
145 printk_once(KERN_NOTICE FW_BUG PREFIX
146 "BIOS _OSI(Linux) query %s%s\n",
147 osi_linux.enable ? "honored" : "ignored",
148 osi_linux.cmdline ? " via cmdline" :
149 osi_linux.dmi ? " via DMI" : "");
150 }
151
152 if (!strcmp("Darwin", interface)) {
153
154
155
156
157
158 acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
159 supported = ACPI_UINT32_MAX;
160 }
161
162 return supported;
163}
164
165static void __init acpi_request_region (struct acpi_generic_address *gas,
166 unsigned int length, char *desc)
167{
168 u64 addr;
169
170
171 memcpy(&addr, &gas->address, sizeof(addr));
172 if (!addr || !length)
173 return;
174
175
176 if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO)
177 request_region(addr, length, desc);
178 else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
179 request_mem_region(addr, length, desc);
180}
181
182static int __init acpi_reserve_resources(void)
183{
184 acpi_request_region(&acpi_gbl_FADT.xpm1a_event_block, acpi_gbl_FADT.pm1_event_length,
185 "ACPI PM1a_EVT_BLK");
186
187 acpi_request_region(&acpi_gbl_FADT.xpm1b_event_block, acpi_gbl_FADT.pm1_event_length,
188 "ACPI PM1b_EVT_BLK");
189
190 acpi_request_region(&acpi_gbl_FADT.xpm1a_control_block, acpi_gbl_FADT.pm1_control_length,
191 "ACPI PM1a_CNT_BLK");
192
193 acpi_request_region(&acpi_gbl_FADT.xpm1b_control_block, acpi_gbl_FADT.pm1_control_length,
194 "ACPI PM1b_CNT_BLK");
195
196 if (acpi_gbl_FADT.pm_timer_length == 4)
197 acpi_request_region(&acpi_gbl_FADT.xpm_timer_block, 4, "ACPI PM_TMR");
198
199 acpi_request_region(&acpi_gbl_FADT.xpm2_control_block, acpi_gbl_FADT.pm2_control_length,
200 "ACPI PM2_CNT_BLK");
201
202
203
204 if (!(acpi_gbl_FADT.gpe0_block_length & 0x1))
205 acpi_request_region(&acpi_gbl_FADT.xgpe0_block,
206 acpi_gbl_FADT.gpe0_block_length, "ACPI GPE0_BLK");
207
208 if (!(acpi_gbl_FADT.gpe1_block_length & 0x1))
209 acpi_request_region(&acpi_gbl_FADT.xgpe1_block,
210 acpi_gbl_FADT.gpe1_block_length, "ACPI GPE1_BLK");
211
212 return 0;
213}
214fs_initcall_sync(acpi_reserve_resources);
215
216void acpi_os_printf(const char *fmt, ...)
217{
218 va_list args;
219 va_start(args, fmt);
220 acpi_os_vprintf(fmt, args);
221 va_end(args);
222}
223
224void acpi_os_vprintf(const char *fmt, va_list args)
225{
226 static char buffer[512];
227
228 vsprintf(buffer, fmt, args);
229
230#ifdef ENABLE_DEBUGGER
231 if (acpi_in_debugger) {
232 kdb_printf("%s", buffer);
233 } else {
234 printk(KERN_CONT "%s", buffer);
235 }
236#else
237 printk(KERN_CONT "%s", buffer);
238#endif
239}
240
241#ifdef CONFIG_KEXEC
242static unsigned long acpi_rsdp;
243static int __init setup_acpi_rsdp(char *arg)
244{
245 if (kstrtoul(arg, 16, &acpi_rsdp))
246 return -EINVAL;
247 return 0;
248}
249early_param("acpi_rsdp", setup_acpi_rsdp);
250#endif
251
252acpi_physical_address __init acpi_os_get_root_pointer(void)
253{
254#ifdef CONFIG_KEXEC
255 if (acpi_rsdp)
256 return acpi_rsdp;
257#endif
258
259 if (efi_enabled(EFI_CONFIG_TABLES)) {
260 if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
261 return efi.acpi20;
262 else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
263 return efi.acpi;
264 else {
265 printk(KERN_ERR PREFIX
266 "System description tables not found\n");
267 return 0;
268 }
269 } else if (IS_ENABLED(CONFIG_ACPI_LEGACY_TABLES_LOOKUP)) {
270 acpi_physical_address pa = 0;
271
272 acpi_find_root_pointer(&pa);
273 return pa;
274 }
275
276 return 0;
277}
278
279
280static struct acpi_ioremap *
281acpi_map_lookup(acpi_physical_address phys, acpi_size size)
282{
283 struct acpi_ioremap *map;
284
285 list_for_each_entry_rcu(map, &acpi_ioremaps, list)
286 if (map->phys <= phys &&
287 phys + size <= map->phys + map->size)
288 return map;
289
290 return NULL;
291}
292
293
294static void __iomem *
295acpi_map_vaddr_lookup(acpi_physical_address phys, unsigned int size)
296{
297 struct acpi_ioremap *map;
298
299 map = acpi_map_lookup(phys, size);
300 if (map)
301 return map->virt + (phys - map->phys);
302
303 return NULL;
304}
305
306void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size)
307{
308 struct acpi_ioremap *map;
309 void __iomem *virt = NULL;
310
311 mutex_lock(&acpi_ioremap_lock);
312 map = acpi_map_lookup(phys, size);
313 if (map) {
314 virt = map->virt + (phys - map->phys);
315 map->refcount++;
316 }
317 mutex_unlock(&acpi_ioremap_lock);
318 return virt;
319}
320EXPORT_SYMBOL_GPL(acpi_os_get_iomem);
321
322
323static struct acpi_ioremap *
324acpi_map_lookup_virt(void __iomem *virt, acpi_size size)
325{
326 struct acpi_ioremap *map;
327
328 list_for_each_entry_rcu(map, &acpi_ioremaps, list)
329 if (map->virt <= virt &&
330 virt + size <= map->virt + map->size)
331 return map;
332
333 return NULL;
334}
335
336#if defined(CONFIG_IA64) || defined(CONFIG_ARM64)
337
338#define should_use_kmap(pfn) 0
339#else
340#define should_use_kmap(pfn) page_is_ram(pfn)
341#endif
342
343static void __iomem *acpi_map(acpi_physical_address pg_off, unsigned long pg_sz)
344{
345 unsigned long pfn;
346
347 pfn = pg_off >> PAGE_SHIFT;
348 if (should_use_kmap(pfn)) {
349 if (pg_sz > PAGE_SIZE)
350 return NULL;
351 return (void __iomem __force *)kmap(pfn_to_page(pfn));
352 } else
353 return acpi_os_ioremap(pg_off, pg_sz);
354}
355
356static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr)
357{
358 unsigned long pfn;
359
360 pfn = pg_off >> PAGE_SHIFT;
361 if (should_use_kmap(pfn))
362 kunmap(pfn_to_page(pfn));
363 else
364 iounmap(vaddr);
365}
366
367void __iomem *__init_refok
368acpi_os_map_iomem(acpi_physical_address phys, acpi_size size)
369{
370 struct acpi_ioremap *map;
371 void __iomem *virt;
372 acpi_physical_address pg_off;
373 acpi_size pg_sz;
374
375 if (phys > ULONG_MAX) {
376 printk(KERN_ERR PREFIX "Cannot map memory that high\n");
377 return NULL;
378 }
379
380 if (!acpi_gbl_permanent_mmap)
381 return __acpi_map_table((unsigned long)phys, size);
382
383 mutex_lock(&acpi_ioremap_lock);
384
385 map = acpi_map_lookup(phys, size);
386 if (map) {
387 map->refcount++;
388 goto out;
389 }
390
391 map = kzalloc(sizeof(*map), GFP_KERNEL);
392 if (!map) {
393 mutex_unlock(&acpi_ioremap_lock);
394 return NULL;
395 }
396
397 pg_off = round_down(phys, PAGE_SIZE);
398 pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off;
399 virt = acpi_map(pg_off, pg_sz);
400 if (!virt) {
401 mutex_unlock(&acpi_ioremap_lock);
402 kfree(map);
403 return NULL;
404 }
405
406 INIT_LIST_HEAD(&map->list);
407 map->virt = virt;
408 map->phys = pg_off;
409 map->size = pg_sz;
410 map->refcount = 1;
411
412 list_add_tail_rcu(&map->list, &acpi_ioremaps);
413
414out:
415 mutex_unlock(&acpi_ioremap_lock);
416 return map->virt + (phys - map->phys);
417}
418EXPORT_SYMBOL_GPL(acpi_os_map_iomem);
419
420void *__init_refok
421acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
422{
423 return (void *)acpi_os_map_iomem(phys, size);
424}
425EXPORT_SYMBOL_GPL(acpi_os_map_memory);
426
427static void acpi_os_drop_map_ref(struct acpi_ioremap *map)
428{
429 if (!--map->refcount)
430 list_del_rcu(&map->list);
431}
432
433static void acpi_os_map_cleanup(struct acpi_ioremap *map)
434{
435 if (!map->refcount) {
436 synchronize_rcu_expedited();
437 acpi_unmap(map->phys, map->virt);
438 kfree(map);
439 }
440}
441
442void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
443{
444 struct acpi_ioremap *map;
445
446 if (!acpi_gbl_permanent_mmap) {
447 __acpi_unmap_table(virt, size);
448 return;
449 }
450
451 mutex_lock(&acpi_ioremap_lock);
452 map = acpi_map_lookup_virt(virt, size);
453 if (!map) {
454 mutex_unlock(&acpi_ioremap_lock);
455 WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
456 return;
457 }
458 acpi_os_drop_map_ref(map);
459 mutex_unlock(&acpi_ioremap_lock);
460
461 acpi_os_map_cleanup(map);
462}
463EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem);
464
465void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
466{
467 return acpi_os_unmap_iomem((void __iomem *)virt, size);
468}
469EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
470
471void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
472{
473 if (!acpi_gbl_permanent_mmap)
474 __acpi_unmap_table(virt, size);
475}
476
477int acpi_os_map_generic_address(struct acpi_generic_address *gas)
478{
479 u64 addr;
480 void __iomem *virt;
481
482 if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
483 return 0;
484
485
486 memcpy(&addr, &gas->address, sizeof(addr));
487 if (!addr || !gas->bit_width)
488 return -EINVAL;
489
490 virt = acpi_os_map_iomem(addr, gas->bit_width / 8);
491 if (!virt)
492 return -EIO;
493
494 return 0;
495}
496EXPORT_SYMBOL(acpi_os_map_generic_address);
497
498void acpi_os_unmap_generic_address(struct acpi_generic_address *gas)
499{
500 u64 addr;
501 struct acpi_ioremap *map;
502
503 if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
504 return;
505
506
507 memcpy(&addr, &gas->address, sizeof(addr));
508 if (!addr || !gas->bit_width)
509 return;
510
511 mutex_lock(&acpi_ioremap_lock);
512 map = acpi_map_lookup(addr, gas->bit_width / 8);
513 if (!map) {
514 mutex_unlock(&acpi_ioremap_lock);
515 return;
516 }
517 acpi_os_drop_map_ref(map);
518 mutex_unlock(&acpi_ioremap_lock);
519
520 acpi_os_map_cleanup(map);
521}
522EXPORT_SYMBOL(acpi_os_unmap_generic_address);
523
524#ifdef ACPI_FUTURE_USAGE
525acpi_status
526acpi_os_get_physical_address(void *virt, acpi_physical_address * phys)
527{
528 if (!phys || !virt)
529 return AE_BAD_PARAMETER;
530
531 *phys = virt_to_phys(virt);
532
533 return AE_OK;
534}
535#endif
536
537#ifdef CONFIG_ACPI_REV_OVERRIDE_POSSIBLE
538static bool acpi_rev_override;
539
540int __init acpi_rev_override_setup(char *str)
541{
542 acpi_rev_override = true;
543 return 1;
544}
545__setup("acpi_rev_override", acpi_rev_override_setup);
546#else
547#define acpi_rev_override false
548#endif
549
550#define ACPI_MAX_OVERRIDE_LEN 100
551
552static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
553
554acpi_status
555acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
556 char **new_val)
557{
558 if (!init_val || !new_val)
559 return AE_BAD_PARAMETER;
560
561 *new_val = NULL;
562 if (!memcmp(init_val->name, "_OS_", 4) && strlen(acpi_os_name)) {
563 printk(KERN_INFO PREFIX "Overriding _OS definition to '%s'\n",
564 acpi_os_name);
565 *new_val = acpi_os_name;
566 }
567
568 if (!memcmp(init_val->name, "_REV", 4) && acpi_rev_override) {
569 printk(KERN_INFO PREFIX "Overriding _REV return value to 5\n");
570 *new_val = (char *)5;
571 }
572
573 return AE_OK;
574}
575
576#ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE
577#include <linux/earlycpio.h>
578#include <linux/memblock.h>
579
580static u64 acpi_tables_addr;
581static int all_tables_size;
582
583
584static u8 __init acpi_table_checksum(u8 *buffer, u32 length)
585{
586 u8 sum = 0;
587 u8 *end = buffer + length;
588
589 while (buffer < end)
590 sum = (u8) (sum + *(buffer++));
591 return sum;
592}
593
594
595static const char * const table_sigs[] = {
596 ACPI_SIG_BERT, ACPI_SIG_CPEP, ACPI_SIG_ECDT, ACPI_SIG_EINJ,
597 ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT, ACPI_SIG_MSCT,
598 ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT, ACPI_SIG_ASF,
599 ACPI_SIG_BOOT, ACPI_SIG_DBGP, ACPI_SIG_DMAR, ACPI_SIG_HPET,
600 ACPI_SIG_IBFT, ACPI_SIG_IVRS, ACPI_SIG_MCFG, ACPI_SIG_MCHI,
601 ACPI_SIG_SLIC, ACPI_SIG_SPCR, ACPI_SIG_SPMI, ACPI_SIG_TCPA,
602 ACPI_SIG_UEFI, ACPI_SIG_WAET, ACPI_SIG_WDAT, ACPI_SIG_WDDT,
603 ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT, ACPI_SIG_PSDT,
604 ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT, NULL };
605
606#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
607
608#define ACPI_OVERRIDE_TABLES 64
609static struct cpio_data __initdata acpi_initrd_files[ACPI_OVERRIDE_TABLES];
610
611#define MAP_CHUNK_SIZE (NR_FIX_BTMAPS << PAGE_SHIFT)
612
613void __init acpi_initrd_override(void *data, size_t size)
614{
615 int sig, no, table_nr = 0, total_offset = 0;
616 long offset = 0;
617 struct acpi_table_header *table;
618 char cpio_path[32] = "kernel/firmware/acpi/";
619 struct cpio_data file;
620
621 if (data == NULL || size == 0)
622 return;
623
624 for (no = 0; no < ACPI_OVERRIDE_TABLES; no++) {
625 file = find_cpio_data(cpio_path, data, size, &offset);
626 if (!file.data)
627 break;
628
629 data += offset;
630 size -= offset;
631
632 if (file.size < sizeof(struct acpi_table_header)) {
633 pr_err("ACPI OVERRIDE: Table smaller than ACPI header [%s%s]\n",
634 cpio_path, file.name);
635 continue;
636 }
637
638 table = file.data;
639
640 for (sig = 0; table_sigs[sig]; sig++)
641 if (!memcmp(table->signature, table_sigs[sig], 4))
642 break;
643
644 if (!table_sigs[sig]) {
645 pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
646 cpio_path, file.name);
647 continue;
648 }
649 if (file.size != table->length) {
650 pr_err("ACPI OVERRIDE: File length does not match table length [%s%s]\n",
651 cpio_path, file.name);
652 continue;
653 }
654 if (acpi_table_checksum(file.data, table->length)) {
655 pr_err("ACPI OVERRIDE: Bad table checksum [%s%s]\n",
656 cpio_path, file.name);
657 continue;
658 }
659
660 pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n",
661 table->signature, cpio_path, file.name, table->length);
662
663 all_tables_size += table->length;
664 acpi_initrd_files[table_nr].data = file.data;
665 acpi_initrd_files[table_nr].size = file.size;
666 table_nr++;
667 }
668 if (table_nr == 0)
669 return;
670
671 acpi_tables_addr =
672 memblock_find_in_range(0, max_low_pfn_mapped << PAGE_SHIFT,
673 all_tables_size, PAGE_SIZE);
674 if (!acpi_tables_addr) {
675 WARN_ON(1);
676 return;
677 }
678
679
680
681
682
683
684
685
686
687
688 memblock_reserve(acpi_tables_addr, all_tables_size);
689 arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
690
691
692
693
694
695
696 for (no = 0; no < table_nr; no++) {
697 unsigned char *src_p = acpi_initrd_files[no].data;
698 phys_addr_t size = acpi_initrd_files[no].size;
699 phys_addr_t dest_addr = acpi_tables_addr + total_offset;
700 phys_addr_t slop, clen;
701 char *dest_p;
702
703 total_offset += size;
704
705 while (size) {
706 slop = dest_addr & ~PAGE_MASK;
707 clen = size;
708 if (clen > MAP_CHUNK_SIZE - slop)
709 clen = MAP_CHUNK_SIZE - slop;
710 dest_p = early_ioremap(dest_addr & PAGE_MASK,
711 clen + slop);
712 memcpy(dest_p + slop, src_p, clen);
713 early_iounmap(dest_p, clen + slop);
714 src_p += clen;
715 dest_addr += clen;
716 size -= clen;
717 }
718 }
719}
720#endif
721
722static void acpi_table_taint(struct acpi_table_header *table)
723{
724 pr_warn(PREFIX
725 "Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
726 table->signature, table->oem_table_id);
727 add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
728}
729
730
731acpi_status
732acpi_os_table_override(struct acpi_table_header * existing_table,
733 struct acpi_table_header ** new_table)
734{
735 if (!existing_table || !new_table)
736 return AE_BAD_PARAMETER;
737
738 *new_table = NULL;
739
740#ifdef CONFIG_ACPI_CUSTOM_DSDT
741 if (strncmp(existing_table->signature, "DSDT", 4) == 0)
742 *new_table = (struct acpi_table_header *)AmlCode;
743#endif
744 if (*new_table != NULL)
745 acpi_table_taint(existing_table);
746 return AE_OK;
747}
748
749acpi_status
750acpi_os_physical_table_override(struct acpi_table_header *existing_table,
751 acpi_physical_address *address,
752 u32 *table_length)
753{
754#ifndef CONFIG_ACPI_INITRD_TABLE_OVERRIDE
755 *table_length = 0;
756 *address = 0;
757 return AE_OK;
758#else
759 int table_offset = 0;
760 struct acpi_table_header *table;
761
762 *table_length = 0;
763 *address = 0;
764
765 if (!acpi_tables_addr)
766 return AE_OK;
767
768 do {
769 if (table_offset + ACPI_HEADER_SIZE > all_tables_size) {
770 WARN_ON(1);
771 return AE_OK;
772 }
773
774 table = acpi_os_map_memory(acpi_tables_addr + table_offset,
775 ACPI_HEADER_SIZE);
776
777 if (table_offset + table->length > all_tables_size) {
778 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
779 WARN_ON(1);
780 return AE_OK;
781 }
782
783 table_offset += table->length;
784
785 if (memcmp(existing_table->signature, table->signature, 4)) {
786 acpi_os_unmap_memory(table,
787 ACPI_HEADER_SIZE);
788 continue;
789 }
790
791
792 if (memcmp(table->oem_table_id, existing_table->oem_table_id,
793 ACPI_OEM_TABLE_ID_SIZE)) {
794 acpi_os_unmap_memory(table,
795 ACPI_HEADER_SIZE);
796 continue;
797 }
798
799 table_offset -= table->length;
800 *table_length = table->length;
801 acpi_os_unmap_memory(table, ACPI_HEADER_SIZE);
802 *address = acpi_tables_addr + table_offset;
803 break;
804 } while (table_offset + ACPI_HEADER_SIZE < all_tables_size);
805
806 if (*address != 0)
807 acpi_table_taint(existing_table);
808 return AE_OK;
809#endif
810}
811
812static irqreturn_t acpi_irq(int irq, void *dev_id)
813{
814 u32 handled;
815
816 handled = (*acpi_irq_handler) (acpi_irq_context);
817
818 if (handled) {
819 acpi_irq_handled++;
820 return IRQ_HANDLED;
821 } else {
822 acpi_irq_not_handled++;
823 return IRQ_NONE;
824 }
825}
826
827acpi_status
828acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler,
829 void *context)
830{
831 unsigned int irq;
832
833 acpi_irq_stats_init();
834
835
836
837
838
839 if (gsi != acpi_gbl_FADT.sci_interrupt)
840 return AE_BAD_PARAMETER;
841
842 if (acpi_irq_handler)
843 return AE_ALREADY_ACQUIRED;
844
845 if (acpi_gsi_to_irq(gsi, &irq) < 0) {
846 printk(KERN_ERR PREFIX "SCI (ACPI GSI %d) not registered\n",
847 gsi);
848 return AE_OK;
849 }
850
851 acpi_irq_handler = handler;
852 acpi_irq_context = context;
853 if (request_irq(irq, acpi_irq, IRQF_SHARED, "acpi", acpi_irq)) {
854 printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq);
855 acpi_irq_handler = NULL;
856 return AE_NOT_ACQUIRED;
857 }
858 acpi_sci_irq = irq;
859
860 return AE_OK;
861}
862
863acpi_status acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler handler)
864{
865 if (gsi != acpi_gbl_FADT.sci_interrupt || !acpi_sci_irq_valid())
866 return AE_BAD_PARAMETER;
867
868 free_irq(acpi_sci_irq, acpi_irq);
869 acpi_irq_handler = NULL;
870 acpi_sci_irq = INVALID_ACPI_IRQ;
871
872 return AE_OK;
873}
874
875
876
877
878
879void acpi_os_sleep(u64 ms)
880{
881 msleep(ms);
882}
883
884void acpi_os_stall(u32 us)
885{
886 while (us) {
887 u32 delay = 1000;
888
889 if (delay > us)
890 delay = us;
891 udelay(delay);
892 touch_nmi_watchdog();
893 us -= delay;
894 }
895}
896
897
898
899
900
901
902u64 acpi_os_get_timer(void)
903{
904 u64 time_ns = ktime_to_ns(ktime_get());
905 do_div(time_ns, 100);
906 return time_ns;
907}
908
909acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
910{
911 u32 dummy;
912
913 if (!value)
914 value = &dummy;
915
916 *value = 0;
917 if (width <= 8) {
918 *(u8 *) value = inb(port);
919 } else if (width <= 16) {
920 *(u16 *) value = inw(port);
921 } else if (width <= 32) {
922 *(u32 *) value = inl(port);
923 } else {
924 BUG();
925 }
926
927 return AE_OK;
928}
929
930EXPORT_SYMBOL(acpi_os_read_port);
931
932acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width)
933{
934 if (width <= 8) {
935 outb(value, port);
936 } else if (width <= 16) {
937 outw(value, port);
938 } else if (width <= 32) {
939 outl(value, port);
940 } else {
941 BUG();
942 }
943
944 return AE_OK;
945}
946
947EXPORT_SYMBOL(acpi_os_write_port);
948
949acpi_status
950acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width)
951{
952 void __iomem *virt_addr;
953 unsigned int size = width / 8;
954 bool unmap = false;
955 u64 dummy;
956
957 rcu_read_lock();
958 virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
959 if (!virt_addr) {
960 rcu_read_unlock();
961 virt_addr = acpi_os_ioremap(phys_addr, size);
962 if (!virt_addr)
963 return AE_BAD_ADDRESS;
964 unmap = true;
965 }
966
967 if (!value)
968 value = &dummy;
969
970 switch (width) {
971 case 8:
972 *(u8 *) value = readb(virt_addr);
973 break;
974 case 16:
975 *(u16 *) value = readw(virt_addr);
976 break;
977 case 32:
978 *(u32 *) value = readl(virt_addr);
979 break;
980 case 64:
981 *(u64 *) value = readq(virt_addr);
982 break;
983 default:
984 BUG();
985 }
986
987 if (unmap)
988 iounmap(virt_addr);
989 else
990 rcu_read_unlock();
991
992 return AE_OK;
993}
994
995acpi_status
996acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width)
997{
998 void __iomem *virt_addr;
999 unsigned int size = width / 8;
1000 bool unmap = false;
1001
1002 rcu_read_lock();
1003 virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
1004 if (!virt_addr) {
1005 rcu_read_unlock();
1006 virt_addr = acpi_os_ioremap(phys_addr, size);
1007 if (!virt_addr)
1008 return AE_BAD_ADDRESS;
1009 unmap = true;
1010 }
1011
1012 switch (width) {
1013 case 8:
1014 writeb(value, virt_addr);
1015 break;
1016 case 16:
1017 writew(value, virt_addr);
1018 break;
1019 case 32:
1020 writel(value, virt_addr);
1021 break;
1022 case 64:
1023 writeq(value, virt_addr);
1024 break;
1025 default:
1026 BUG();
1027 }
1028
1029 if (unmap)
1030 iounmap(virt_addr);
1031 else
1032 rcu_read_unlock();
1033
1034 return AE_OK;
1035}
1036
1037acpi_status
1038acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
1039 u64 *value, u32 width)
1040{
1041 int result, size;
1042 u32 value32;
1043
1044 if (!value)
1045 return AE_BAD_PARAMETER;
1046
1047 switch (width) {
1048 case 8:
1049 size = 1;
1050 break;
1051 case 16:
1052 size = 2;
1053 break;
1054 case 32:
1055 size = 4;
1056 break;
1057 default:
1058 return AE_ERROR;
1059 }
1060
1061 result = raw_pci_read(pci_id->segment, pci_id->bus,
1062 PCI_DEVFN(pci_id->device, pci_id->function),
1063 reg, size, &value32);
1064 *value = value32;
1065
1066 return (result ? AE_ERROR : AE_OK);
1067}
1068
1069acpi_status
1070acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
1071 u64 value, u32 width)
1072{
1073 int result, size;
1074
1075 switch (width) {
1076 case 8:
1077 size = 1;
1078 break;
1079 case 16:
1080 size = 2;
1081 break;
1082 case 32:
1083 size = 4;
1084 break;
1085 default:
1086 return AE_ERROR;
1087 }
1088
1089 result = raw_pci_write(pci_id->segment, pci_id->bus,
1090 PCI_DEVFN(pci_id->device, pci_id->function),
1091 reg, size, value);
1092
1093 return (result ? AE_ERROR : AE_OK);
1094}
1095
1096static void acpi_os_execute_deferred(struct work_struct *work)
1097{
1098 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
1099
1100 dpc->function(dpc->context);
1101 kfree(dpc);
1102}
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119acpi_status acpi_os_execute(acpi_execute_type type,
1120 acpi_osd_exec_callback function, void *context)
1121{
1122 acpi_status status = AE_OK;
1123 struct acpi_os_dpc *dpc;
1124 struct workqueue_struct *queue;
1125 int ret;
1126 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
1127 "Scheduling function [%p(%p)] for deferred execution.\n",
1128 function, context));
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139 dpc = kzalloc(sizeof(struct acpi_os_dpc), GFP_ATOMIC);
1140 if (!dpc)
1141 return AE_NO_MEMORY;
1142
1143 dpc->function = function;
1144 dpc->context = context;
1145
1146
1147
1148
1149
1150
1151 if (type == OSL_NOTIFY_HANDLER) {
1152 queue = kacpi_notify_wq;
1153 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
1154 } else {
1155 queue = kacpid_wq;
1156 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
1157 }
1158
1159
1160
1161
1162
1163
1164
1165
1166 ret = queue_work_on(0, queue, &dpc->work);
1167
1168 if (!ret) {
1169 printk(KERN_ERR PREFIX
1170 "Call to queue_work() failed.\n");
1171 status = AE_ERROR;
1172 kfree(dpc);
1173 }
1174 return status;
1175}
1176EXPORT_SYMBOL(acpi_os_execute);
1177
1178void acpi_os_wait_events_complete(void)
1179{
1180
1181
1182
1183
1184 if (acpi_sci_irq_valid())
1185 synchronize_hardirq(acpi_sci_irq);
1186 flush_workqueue(kacpid_wq);
1187 flush_workqueue(kacpi_notify_wq);
1188}
1189
1190struct acpi_hp_work {
1191 struct work_struct work;
1192 struct acpi_device *adev;
1193 u32 src;
1194};
1195
1196static void acpi_hotplug_work_fn(struct work_struct *work)
1197{
1198 struct acpi_hp_work *hpw = container_of(work, struct acpi_hp_work, work);
1199
1200 acpi_os_wait_events_complete();
1201 acpi_device_hotplug(hpw->adev, hpw->src);
1202 kfree(hpw);
1203}
1204
1205acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src)
1206{
1207 struct acpi_hp_work *hpw;
1208
1209 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
1210 "Scheduling hotplug event (%p, %u) for deferred execution.\n",
1211 adev, src));
1212
1213 hpw = kmalloc(sizeof(*hpw), GFP_KERNEL);
1214 if (!hpw)
1215 return AE_NO_MEMORY;
1216
1217 INIT_WORK(&hpw->work, acpi_hotplug_work_fn);
1218 hpw->adev = adev;
1219 hpw->src = src;
1220
1221
1222
1223
1224
1225
1226 if (!queue_work(kacpi_hotplug_wq, &hpw->work)) {
1227 kfree(hpw);
1228 return AE_ERROR;
1229 }
1230 return AE_OK;
1231}
1232
1233bool acpi_queue_hotplug_work(struct work_struct *work)
1234{
1235 return queue_work(kacpi_hotplug_wq, work);
1236}
1237
1238acpi_status
1239acpi_os_create_semaphore(u32 max_units, u32 initial_units, acpi_handle * handle)
1240{
1241 struct semaphore *sem = NULL;
1242
1243 sem = acpi_os_allocate_zeroed(sizeof(struct semaphore));
1244 if (!sem)
1245 return AE_NO_MEMORY;
1246
1247 sema_init(sem, initial_units);
1248
1249 *handle = (acpi_handle *) sem;
1250
1251 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Creating semaphore[%p|%d].\n",
1252 *handle, initial_units));
1253
1254 return AE_OK;
1255}
1256
1257
1258
1259
1260
1261
1262
1263
1264acpi_status acpi_os_delete_semaphore(acpi_handle handle)
1265{
1266 struct semaphore *sem = (struct semaphore *)handle;
1267
1268 if (!sem)
1269 return AE_BAD_PARAMETER;
1270
1271 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Deleting semaphore[%p].\n", handle));
1272
1273 BUG_ON(!list_empty(&sem->wait_list));
1274 kfree(sem);
1275 sem = NULL;
1276
1277 return AE_OK;
1278}
1279
1280
1281
1282
1283acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
1284{
1285 acpi_status status = AE_OK;
1286 struct semaphore *sem = (struct semaphore *)handle;
1287 long jiffies;
1288 int ret = 0;
1289
1290 if (!acpi_os_initialized)
1291 return AE_OK;
1292
1293 if (!sem || (units < 1))
1294 return AE_BAD_PARAMETER;
1295
1296 if (units > 1)
1297 return AE_SUPPORT;
1298
1299 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Waiting for semaphore[%p|%d|%d]\n",
1300 handle, units, timeout));
1301
1302 if (timeout == ACPI_WAIT_FOREVER)
1303 jiffies = MAX_SCHEDULE_TIMEOUT;
1304 else
1305 jiffies = msecs_to_jiffies(timeout);
1306
1307 ret = down_timeout(sem, jiffies);
1308 if (ret)
1309 status = AE_TIME;
1310
1311 if (ACPI_FAILURE(status)) {
1312 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
1313 "Failed to acquire semaphore[%p|%d|%d], %s",
1314 handle, units, timeout,
1315 acpi_format_exception(status)));
1316 } else {
1317 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
1318 "Acquired semaphore[%p|%d|%d]", handle,
1319 units, timeout));
1320 }
1321
1322 return status;
1323}
1324
1325
1326
1327
1328acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
1329{
1330 struct semaphore *sem = (struct semaphore *)handle;
1331
1332 if (!acpi_os_initialized)
1333 return AE_OK;
1334
1335 if (!sem || (units < 1))
1336 return AE_BAD_PARAMETER;
1337
1338 if (units > 1)
1339 return AE_SUPPORT;
1340
1341 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "Signaling semaphore[%p|%d]\n", handle,
1342 units));
1343
1344 up(sem);
1345
1346 return AE_OK;
1347}
1348
1349acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read)
1350{
1351#ifdef ENABLE_DEBUGGER
1352 if (acpi_in_debugger) {
1353 u32 chars;
1354
1355 kdb_read(buffer, buffer_length);
1356
1357
1358 chars = strlen(buffer) - 1;
1359 buffer[chars] = '\0';
1360 }
1361#endif
1362
1363 return AE_OK;
1364}
1365
1366acpi_status acpi_os_signal(u32 function, void *info)
1367{
1368 switch (function) {
1369 case ACPI_SIGNAL_FATAL:
1370 printk(KERN_ERR PREFIX "Fatal opcode executed\n");
1371 break;
1372 case ACPI_SIGNAL_BREAKPOINT:
1373
1374
1375
1376
1377
1378
1379
1380
1381 break;
1382 default:
1383 break;
1384 }
1385
1386 return AE_OK;
1387}
1388
1389static int __init acpi_os_name_setup(char *str)
1390{
1391 char *p = acpi_os_name;
1392 int count = ACPI_MAX_OVERRIDE_LEN - 1;
1393
1394 if (!str || !*str)
1395 return 0;
1396
1397 for (; count-- && *str; str++) {
1398 if (isalnum(*str) || *str == ' ' || *str == ':')
1399 *p++ = *str;
1400 else if (*str == '\'' || *str == '"')
1401 continue;
1402 else
1403 break;
1404 }
1405 *p = 0;
1406
1407 return 1;
1408
1409}
1410
1411__setup("acpi_os_name=", acpi_os_name_setup);
1412
1413#define OSI_STRING_LENGTH_MAX 64
1414#define OSI_STRING_ENTRIES_MAX 16
1415
1416struct osi_setup_entry {
1417 char string[OSI_STRING_LENGTH_MAX];
1418 bool enable;
1419};
1420
1421static struct osi_setup_entry
1422 osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
1423 {"Module Device", true},
1424 {"Processor Device", true},
1425 {"3.0 _SCP Extensions", true},
1426 {"Processor Aggregator Device", true},
1427};
1428
1429void __init acpi_osi_setup(char *str)
1430{
1431 struct osi_setup_entry *osi;
1432 bool enable = true;
1433 int i;
1434
1435 if (!acpi_gbl_create_osi_method)
1436 return;
1437
1438 if (str == NULL || *str == '\0') {
1439 printk(KERN_INFO PREFIX "_OSI method disabled\n");
1440 acpi_gbl_create_osi_method = FALSE;
1441 return;
1442 }
1443
1444 if (*str == '!') {
1445 str++;
1446 if (*str == '\0') {
1447 osi_linux.default_disabling = 1;
1448 return;
1449 } else if (*str == '*') {
1450 acpi_update_interfaces(ACPI_DISABLE_ALL_STRINGS);
1451 for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
1452 osi = &osi_setup_entries[i];
1453 osi->enable = false;
1454 }
1455 return;
1456 }
1457 enable = false;
1458 }
1459
1460 for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
1461 osi = &osi_setup_entries[i];
1462 if (!strcmp(osi->string, str)) {
1463 osi->enable = enable;
1464 break;
1465 } else if (osi->string[0] == '\0') {
1466 osi->enable = enable;
1467 strncpy(osi->string, str, OSI_STRING_LENGTH_MAX);
1468 break;
1469 }
1470 }
1471}
1472
1473static void __init set_osi_linux(unsigned int enable)
1474{
1475 if (osi_linux.enable != enable)
1476 osi_linux.enable = enable;
1477
1478 if (osi_linux.enable)
1479 acpi_osi_setup("Linux");
1480 else
1481 acpi_osi_setup("!Linux");
1482
1483 return;
1484}
1485
1486static void __init acpi_cmdline_osi_linux(unsigned int enable)
1487{
1488 osi_linux.cmdline = 1;
1489 osi_linux.dmi = 0;
1490 set_osi_linux(enable);
1491
1492 return;
1493}
1494
1495void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
1496{
1497 printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
1498
1499 if (enable == -1)
1500 return;
1501
1502 osi_linux.dmi = 1;
1503 set_osi_linux(enable);
1504
1505 return;
1506}
1507
1508
1509
1510
1511
1512
1513
1514
1515static void __init acpi_osi_setup_late(void)
1516{
1517 struct osi_setup_entry *osi;
1518 char *str;
1519 int i;
1520 acpi_status status;
1521
1522 if (osi_linux.default_disabling) {
1523 status = acpi_update_interfaces(ACPI_DISABLE_ALL_VENDOR_STRINGS);
1524
1525 if (ACPI_SUCCESS(status))
1526 printk(KERN_INFO PREFIX "Disabled all _OSI OS vendors\n");
1527 }
1528
1529 for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
1530 osi = &osi_setup_entries[i];
1531 str = osi->string;
1532
1533 if (*str == '\0')
1534 break;
1535 if (osi->enable) {
1536 status = acpi_install_interface(str);
1537
1538 if (ACPI_SUCCESS(status))
1539 printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
1540 } else {
1541 status = acpi_remove_interface(str);
1542
1543 if (ACPI_SUCCESS(status))
1544 printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
1545 }
1546 }
1547}
1548
1549static int __init osi_setup(char *str)
1550{
1551 if (str && !strcmp("Linux", str))
1552 acpi_cmdline_osi_linux(1);
1553 else if (str && !strcmp("!Linux", str))
1554 acpi_cmdline_osi_linux(0);
1555 else
1556 acpi_osi_setup(str);
1557
1558 return 1;
1559}
1560
1561__setup("acpi_osi=", osi_setup);
1562
1563
1564
1565
1566
1567
1568
1569static int __init acpi_no_auto_serialize_setup(char *str)
1570{
1571 acpi_gbl_auto_serialize_methods = FALSE;
1572 pr_info("ACPI: auto-serialization disabled\n");
1573
1574 return 1;
1575}
1576
1577__setup("acpi_no_auto_serialize", acpi_no_auto_serialize_setup);
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595#define ENFORCE_RESOURCES_STRICT 2
1596#define ENFORCE_RESOURCES_LAX 1
1597#define ENFORCE_RESOURCES_NO 0
1598
1599static unsigned int acpi_enforce_resources = ENFORCE_RESOURCES_STRICT;
1600
1601static int __init acpi_enforce_resources_setup(char *str)
1602{
1603 if (str == NULL || *str == '\0')
1604 return 0;
1605
1606 if (!strcmp("strict", str))
1607 acpi_enforce_resources = ENFORCE_RESOURCES_STRICT;
1608 else if (!strcmp("lax", str))
1609 acpi_enforce_resources = ENFORCE_RESOURCES_LAX;
1610 else if (!strcmp("no", str))
1611 acpi_enforce_resources = ENFORCE_RESOURCES_NO;
1612
1613 return 1;
1614}
1615
1616__setup("acpi_enforce_resources=", acpi_enforce_resources_setup);
1617
1618
1619
1620int acpi_check_resource_conflict(const struct resource *res)
1621{
1622 acpi_adr_space_type space_id;
1623 acpi_size length;
1624 u8 warn = 0;
1625 int clash = 0;
1626
1627 if (acpi_enforce_resources == ENFORCE_RESOURCES_NO)
1628 return 0;
1629 if (!(res->flags & IORESOURCE_IO) && !(res->flags & IORESOURCE_MEM))
1630 return 0;
1631
1632 if (res->flags & IORESOURCE_IO)
1633 space_id = ACPI_ADR_SPACE_SYSTEM_IO;
1634 else
1635 space_id = ACPI_ADR_SPACE_SYSTEM_MEMORY;
1636
1637 length = resource_size(res);
1638 if (acpi_enforce_resources != ENFORCE_RESOURCES_NO)
1639 warn = 1;
1640 clash = acpi_check_address_range(space_id, res->start, length, warn);
1641
1642 if (clash) {
1643 if (acpi_enforce_resources != ENFORCE_RESOURCES_NO) {
1644 if (acpi_enforce_resources == ENFORCE_RESOURCES_LAX)
1645 printk(KERN_NOTICE "ACPI: This conflict may"
1646 " cause random problems and system"
1647 " instability\n");
1648 printk(KERN_INFO "ACPI: If an ACPI driver is available"
1649 " for this device, you should use it instead of"
1650 " the native driver\n");
1651 }
1652 if (acpi_enforce_resources == ENFORCE_RESOURCES_STRICT)
1653 return -EBUSY;
1654 }
1655 return 0;
1656}
1657EXPORT_SYMBOL(acpi_check_resource_conflict);
1658
1659int acpi_check_region(resource_size_t start, resource_size_t n,
1660 const char *name)
1661{
1662 struct resource res = {
1663 .start = start,
1664 .end = start + n - 1,
1665 .name = name,
1666 .flags = IORESOURCE_IO,
1667 };
1668
1669 return acpi_check_resource_conflict(&res);
1670}
1671EXPORT_SYMBOL(acpi_check_region);
1672
1673
1674
1675
1676int acpi_resources_are_enforced(void)
1677{
1678 return acpi_enforce_resources == ENFORCE_RESOURCES_STRICT;
1679}
1680EXPORT_SYMBOL(acpi_resources_are_enforced);
1681
1682bool acpi_osi_is_win8(void)
1683{
1684 return acpi_gbl_osi_data >= ACPI_OSI_WIN_8;
1685}
1686EXPORT_SYMBOL(acpi_osi_is_win8);
1687
1688
1689
1690
1691void acpi_os_delete_lock(acpi_spinlock handle)
1692{
1693 ACPI_FREE(handle);
1694}
1695
1696
1697
1698
1699
1700
1701
1702acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
1703{
1704 acpi_cpu_flags flags;
1705 spin_lock_irqsave(lockp, flags);
1706 return flags;
1707}
1708
1709
1710
1711
1712
1713void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
1714{
1715 spin_unlock_irqrestore(lockp, flags);
1716}
1717
1718#ifndef ACPI_USE_LOCAL_CACHE
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735acpi_status
1736acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t ** cache)
1737{
1738 *cache = kmem_cache_create(name, size, 0, 0, NULL);
1739 if (*cache == NULL)
1740 return AE_ERROR;
1741 else
1742 return AE_OK;
1743}
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757acpi_status acpi_os_purge_cache(acpi_cache_t * cache)
1758{
1759 kmem_cache_shrink(cache);
1760 return (AE_OK);
1761}
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776acpi_status acpi_os_delete_cache(acpi_cache_t * cache)
1777{
1778 kmem_cache_destroy(cache);
1779 return (AE_OK);
1780}
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
1797{
1798 kmem_cache_free(cache, object);
1799 return (AE_OK);
1800}
1801#endif
1802
1803static int __init acpi_no_static_ssdt_setup(char *s)
1804{
1805 acpi_gbl_disable_ssdt_table_install = TRUE;
1806 pr_info("ACPI: static SSDT installation disabled\n");
1807
1808 return 0;
1809}
1810
1811early_param("acpi_no_static_ssdt", acpi_no_static_ssdt_setup);
1812
1813static int __init acpi_disable_return_repair(char *s)
1814{
1815 printk(KERN_NOTICE PREFIX
1816 "ACPI: Predefined validation mechanism disabled\n");
1817 acpi_gbl_disable_auto_repair = TRUE;
1818
1819 return 1;
1820}
1821
1822__setup("acpica_no_return_repair", acpi_disable_return_repair);
1823
1824acpi_status __init acpi_os_initialize(void)
1825{
1826 acpi_os_map_generic_address(&acpi_gbl_FADT.xpm1a_event_block);
1827 acpi_os_map_generic_address(&acpi_gbl_FADT.xpm1b_event_block);
1828 acpi_os_map_generic_address(&acpi_gbl_FADT.xgpe0_block);
1829 acpi_os_map_generic_address(&acpi_gbl_FADT.xgpe1_block);
1830 if (acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) {
1831
1832
1833
1834
1835 int rv;
1836
1837 rv = acpi_os_map_generic_address(&acpi_gbl_FADT.reset_register);
1838 pr_debug(PREFIX "%s: map reset_reg status %d\n", __func__, rv);
1839 }
1840 acpi_os_initialized = true;
1841
1842 return AE_OK;
1843}
1844
1845acpi_status __init acpi_os_initialize1(void)
1846{
1847 kacpid_wq = alloc_workqueue("kacpid", 0, 1);
1848 kacpi_notify_wq = alloc_workqueue("kacpi_notify", 0, 1);
1849 kacpi_hotplug_wq = alloc_ordered_workqueue("kacpi_hotplug", 0);
1850 BUG_ON(!kacpid_wq);
1851 BUG_ON(!kacpi_notify_wq);
1852 BUG_ON(!kacpi_hotplug_wq);
1853 acpi_install_interface_handler(acpi_osi_handler);
1854 acpi_osi_setup_late();
1855 return AE_OK;
1856}
1857
1858acpi_status acpi_os_terminate(void)
1859{
1860 if (acpi_irq_handler) {
1861 acpi_os_remove_interrupt_handler(acpi_gbl_FADT.sci_interrupt,
1862 acpi_irq_handler);
1863 }
1864
1865 acpi_os_unmap_generic_address(&acpi_gbl_FADT.xgpe1_block);
1866 acpi_os_unmap_generic_address(&acpi_gbl_FADT.xgpe0_block);
1867 acpi_os_unmap_generic_address(&acpi_gbl_FADT.xpm1b_event_block);
1868 acpi_os_unmap_generic_address(&acpi_gbl_FADT.xpm1a_event_block);
1869 if (acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER)
1870 acpi_os_unmap_generic_address(&acpi_gbl_FADT.reset_register);
1871
1872 destroy_workqueue(kacpid_wq);
1873 destroy_workqueue(kacpi_notify_wq);
1874 destroy_workqueue(kacpi_hotplug_wq);
1875
1876 return AE_OK;
1877}
1878
1879acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
1880 u32 pm1b_control)
1881{
1882 int rc = 0;
1883 if (__acpi_os_prepare_sleep)
1884 rc = __acpi_os_prepare_sleep(sleep_state,
1885 pm1a_control, pm1b_control);
1886 if (rc < 0)
1887 return AE_ERROR;
1888 else if (rc > 0)
1889 return AE_CTRL_SKIP;
1890
1891 return AE_OK;
1892}
1893
1894void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
1895 u32 pm1a_ctrl, u32 pm1b_ctrl))
1896{
1897 __acpi_os_prepare_sleep = func;
1898}
1899
1900acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a,
1901 u32 val_b)
1902{
1903 int rc = 0;
1904 if (__acpi_os_prepare_extended_sleep)
1905 rc = __acpi_os_prepare_extended_sleep(sleep_state,
1906 val_a, val_b);
1907 if (rc < 0)
1908 return AE_ERROR;
1909 else if (rc > 0)
1910 return AE_CTRL_SKIP;
1911
1912 return AE_OK;
1913}
1914
1915void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
1916 u32 val_a, u32 val_b))
1917{
1918 __acpi_os_prepare_extended_sleep = func;
1919}
1920