diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-05-29 03:22:20 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-05-29 03:22:20 -0700 |
| commit | da55fd6f039fad38780ccd7848959d72118299d1 (patch) | |
| tree | 7666a475ce5220dc48c6f819b3d4372c35fafb52 /include | |
| parent | 77c998088e03fc2869444832de71d61595e846cd (diff) | |
| parent | f615f385c55b418ade627e889172c3b3c4148301 (diff) | |
Manual merge
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-i386/acpi.h | 125 | ||||
| -rw-r--r-- | include/asm-i386/io_apic.h | 7 | ||||
| -rw-r--r-- | include/asm-i386/mpspec.h | 9 | ||||
| -rw-r--r-- | include/linux/acpi.h | 68 |
4 files changed, 139 insertions, 70 deletions
diff --git a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h index 0c5d1f4678a7..084e6baf9b95 100644 --- a/include/asm-i386/acpi.h +++ b/include/asm-i386/acpi.h @@ -3,7 +3,7 @@ * * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> * Copyright (C) 2001 Patrick Mochel <mochel@osdl.org> - * + * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * This program is free software; you can redistribute it and/or modify @@ -28,48 +28,106 @@ #ifdef __KERNEL__ -#ifdef CONFIG_ACPI_BOOT +#define COMPILER_DEPENDENT_INT64 long long +#define COMPILER_DEPENDENT_UINT64 unsigned long long + +/* + * Calling conventions: + * + * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads) + * ACPI_EXTERNAL_XFACE - External ACPI interfaces + * ACPI_INTERNAL_XFACE - Internal ACPI interfaces + * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces + */ +#define ACPI_SYSTEM_XFACE +#define ACPI_EXTERNAL_XFACE +#define ACPI_INTERNAL_XFACE +#define ACPI_INTERNAL_VAR_XFACE + +/* Asm macros */ + +#define ACPI_ASM_MACROS +#define BREAKPOINT3 +#define ACPI_DISABLE_IRQS() __cli() +#define ACPI_ENABLE_IRQS() __sti() +#define ACPI_FLUSH_CPU_CACHE() wbinvd() + +/* + * A brief explanation as GNU inline assembly is a bit hairy + * %0 is the output parameter in EAX ("=a") + * %1 and %2 are the input parameters in ECX ("c") + * and an immediate value ("i") respectively + * All actual register references are preceded with "%%" as in "%%edx" + * Immediate values in the assembly are preceded by "$" as in "$0x1" + * The final asm parameter are the operation altered non-output registers. + */ +#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ + do { \ + int dummy; \ + asm("1: movl (%1),%%eax;" \ + "movl %%eax,%%edx;" \ + "andl %2,%%edx;" \ + "btsl $0x1,%%edx;" \ + "adcl $0x0,%%edx;" \ + "lock; cmpxchgl %%edx,(%1);" \ + "jnz 1b;" \ + "cmpb $0x3,%%dl;" \ + "sbbl %%eax,%%eax" \ + :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \ + } while(0) + +#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ + do { \ + int dummy; \ + asm("1: movl (%1),%%eax;" \ + "movl %%eax,%%edx;" \ + "andl %2,%%edx;" \ + "lock; cmpxchgl %%edx,(%1);" \ + "jnz 1b;" \ + "andl $0x1,%%eax" \ + :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ + } while(0) -/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ -#define FIX_ACPI_PAGES 4 -extern int acpi_mp_config; +/* + * Math helper asm macros + */ +#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ + asm("divl %2;" \ + :"=a"(q32), "=d"(r32) \ + :"r"(d32), \ + "0"(n_lo), "1"(n_hi)) + -char * __acpi_map_table (unsigned long phys_addr, unsigned long size); -extern int acpi_find_rsdp (unsigned long *phys_addr); -extern int acpi_parse_madt (unsigned long phys_addr, unsigned long size); -extern int acpi_boot_init (char *cmdline); +#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ + asm("shrl $1,%2;" \ + "rcrl $1,%3;" \ + :"=r"(n_hi), "=r"(n_lo) \ + :"0"(n_hi), "1"(n_lo)) + +#ifndef CONFIG_ACPI_BOOT +#define acpi_lapic 0 +#define acpi_ioapic 0 #else -#define acpi_mp_config 0 -#endif /*CONFIG_ACPI_BOOT*/ +#ifdef CONFIG_X86_LOCAL_APIC +extern int acpi_lapic; +#else +#define acpi_lapic 0 +#endif +#ifdef CONFIG_X86_IO_APIC +extern int acpi_ioapic; +#else +#define acpi_ioapic 0 +#endif -#ifdef CONFIG_ACPI_PCI -int acpi_get_interrupt_model (int *type); -#endif /*CONFIG_ACPI_PCI*/ +/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ +#define FIX_ACPI_PAGES 4 +#endif /*CONFIG_ACPI_BOOT*/ #ifdef CONFIG_ACPI_SLEEP -extern unsigned long saved_eip; -extern unsigned long saved_esp; -extern unsigned long saved_ebp; -extern unsigned long saved_ebx; -extern unsigned long saved_esi; -extern unsigned long saved_edi; - -static inline void acpi_save_register_state(unsigned long return_point) -{ - saved_eip = return_point; - asm volatile ("movl %%esp,(%0)" : "=m" (saved_esp)); - asm volatile ("movl %%ebp,(%0)" : "=m" (saved_ebp)); - asm volatile ("movl %%ebx,(%0)" : "=m" (saved_ebx)); - asm volatile ("movl %%edi,(%0)" : "=m" (saved_edi)); - asm volatile ("movl %%esi,(%0)" : "=m" (saved_esi)); -} - -#define acpi_restore_register_state() do {} while (0) - /* routines for saving/restoring kernel state */ extern int acpi_save_state_mem(void); extern int acpi_save_state_disk(void); @@ -82,7 +140,6 @@ extern void acpi_reserve_bootmem(void); #endif /*CONFIG_ACPI_SLEEP*/ - #endif /*__KERNEL__*/ #endif /*_ASM_ACPI_H*/ diff --git a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h index 3e90f195defc..865d995c4312 100644 --- a/include/asm-i386/io_apic.h +++ b/include/asm-i386/io_apic.h @@ -141,6 +141,13 @@ extern int skip_ioapic_setup; */ #define io_apic_assign_pci_irqs (mp_irq_entries && !skip_ioapic_setup) +#ifdef CONFIG_ACPI_BOOT +extern int io_apic_get_unique_id (int ioapic, int apic_id); +extern int io_apic_get_version (int ioapic); +extern int io_apic_get_redir_entries (int ioapic); +extern int io_apic_set_pci_routing (int ioapic, int pin, int irq); +#endif /*CONFIG_ACPI_BOOT*/ + #else /* !CONFIG_X86_IO_APIC */ #define io_apic_assign_pci_irqs 0 #endif diff --git a/include/asm-i386/mpspec.h b/include/asm-i386/mpspec.h index fe838c12ea9d..91ac8d8a5ad0 100644 --- a/include/asm-i386/mpspec.h +++ b/include/asm-i386/mpspec.h @@ -220,5 +220,14 @@ extern unsigned long mp_lapic_addr; extern int pic_mode; extern int using_apic_timer; +#ifdef CONFIG_ACPI_BOOT +extern void mp_register_lapic (u8 id, u8 enabled); +extern void mp_register_lapic_address (u64 address); +extern void mp_register_ioapic (u8 id, u32 address, u32 irq_base); +extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 global_irq); +extern void mp_config_acpi_legacy_irqs (void); +extern void mp_parse_prt (void); +#endif /*CONFIG_ACPI_BOOT*/ + #endif diff --git a/include/linux/acpi.h b/include/linux/acpi.h index a8a4794bb2b0..cdfbe7471df5 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -29,22 +29,28 @@ #define _LINUX #endif +#include <linux/list.h> + /* - * YES this is ugly. - * But, moving all of ACPI's private headers to include/acpi isn't the right - * answer either. - * Please just ignore it for now. + * Yes this is ugly, but moving all of ACPI's private headers to include/acpi + * isn't the right answer either. Please just ignore it for now. */ #include "../../drivers/acpi/include/acpi.h" #include <asm/acpi.h> -/* -------------------------------------------------------------------------- - Boot-Time Table Parsing - -------------------------------------------------------------------------- */ - #ifdef CONFIG_ACPI_BOOT +enum acpi_irq_model_id { + ACPI_IRQ_MODEL_PIC = 0, + ACPI_IRQ_MODEL_IOAPIC, + ACPI_IRQ_MODEL_IOSAPIC, + ACPI_IRQ_MODEL_COUNT +}; + +extern enum acpi_irq_model_id acpi_irq_model; + + /* Root System Description Pointer (RSDP) */ struct acpi_table_rsdp { @@ -327,10 +333,9 @@ extern acpi_table_handler acpi_table_ops[ACPI_TABLE_COUNT]; typedef int (*acpi_madt_entry_handler) (acpi_table_entry_header *header); -struct acpi_boot_flags { - u8 madt:1; - u8 reserved:7; -}; +char * __acpi_map_table (unsigned long phys_addr, unsigned long size); +unsigned long acpi_find_rsdp (void); +int acpi_boot_init (char *cmdline); int acpi_table_init (char *cmdline); int acpi_table_parse (enum acpi_table_id, acpi_table_handler); @@ -338,31 +343,26 @@ int acpi_table_parse_madt (enum acpi_table_id, acpi_madt_entry_handler); void acpi_table_print (struct acpi_table_header *, unsigned long); void acpi_table_print_madt_entry (acpi_table_entry_header *); -#endif /*CONFIG_ACPI_BOOT*/ +extern int acpi_mp_config; +#else /*!CONFIG_ACPI_BOOT*/ -/* -------------------------------------------------------------------------- - PCI Interrupt Routing (PRT) - -------------------------------------------------------------------------- */ +#define acpi_mp_config 0 -#ifdef CONFIG_ACPI_PCI +#endif /*CONFIG_ACPI_BOOT*/ -#define ACPI_INT_MODEL_PIC 0 -#define ACPI_INT_MODEL_IOAPIC 1 -#define ACPI_INT_MODEL_IOSAPIC 2 + +#ifdef CONFIG_ACPI_PCI struct acpi_prt_entry { struct list_head node; - struct { - u8 seg; - u8 bus; - u8 dev; - u8 pin; - } id; + acpi_pci_id id; + u8 pin; struct { acpi_handle handle; u32 index; - } source; + } link; + u32 irq; }; struct acpi_prt_list { @@ -370,25 +370,21 @@ struct acpi_prt_list { struct list_head entries; }; -extern struct acpi_prt_list acpi_prts; +extern struct acpi_prt_list acpi_prt; struct pci_dev; -int acpi_prt_get_irq (struct pci_dev *dev, u8 pin, int *irq); -int acpi_prt_set_irq (struct pci_dev *dev, u8 pin, int irq); +int acpi_pci_irq_enable (struct pci_dev *dev); +int acpi_pci_irq_init (void); #endif /*CONFIG_ACPI_PCI*/ -/* -------------------------------------------------------------------------- - ACPI Interpreter (Core) - -------------------------------------------------------------------------- */ - -#ifdef CONFIG_ACPI_INTERPRETER +#ifdef CONFIG_ACPI int acpi_init(void); -#endif /*CONFIG_ACPI_INTERPRETER*/ +#endif /*CONFIG_ACPI*/ #endif /*_LINUX_ACPI_H*/ |
