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