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