summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@penguin.transmeta.com>2002-05-29 03:22:20 -0700
committerLinus Torvalds <torvalds@penguin.transmeta.com>2002-05-29 03:22:20 -0700
commitda55fd6f039fad38780ccd7848959d72118299d1 (patch)
tree7666a475ce5220dc48c6f819b3d4372c35fafb52 /include
parent77c998088e03fc2869444832de71d61595e846cd (diff)
parentf615f385c55b418ade627e889172c3b3c4148301 (diff)
Manual merge
Diffstat (limited to 'include')
-rw-r--r--include/asm-i386/acpi.h125
-rw-r--r--include/asm-i386/io_apic.h7
-rw-r--r--include/asm-i386/mpspec.h9
-rw-r--r--include/linux/acpi.h68
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*/