]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/ia64/kernel/acpi.c
[ACPI] merge acpi-2.6.12 branch into latest Linux 2.6.13-rc...
[karo-tx-linux.git] / arch / ia64 / kernel / acpi.c
index 542256e98e604fca899160d7f659ce65db11d85e..9609f243e5d05d2591393a66e1a542cb6058ecbc 100644 (file)
@@ -11,6 +11,7 @@
  *  Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com>
  *  Copyright (C) 2001 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
  *  Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
+ *  Copyright (C) 2004 Ashok Raj <ashok.raj@intel.com>
  *
  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  *
@@ -67,6 +68,11 @@ EXPORT_SYMBOL(pm_power_off);
 unsigned char acpi_kbd_controller_present = 1;
 unsigned char acpi_legacy_devices;
 
+static unsigned int __initdata acpi_madt_rev;
+
+unsigned int acpi_cpei_override;
+unsigned int acpi_cpei_phys_cpuid;
+
 #define MAX_SAPICS 256
 u16 ia64_acpiid_to_sapicid[MAX_SAPICS] =
        { [0 ... MAX_SAPICS - 1] = -1 };
@@ -265,10 +271,56 @@ acpi_parse_plat_int_src (
                                                (plintsrc->flags.trigger == 1) ? IOSAPIC_EDGE : IOSAPIC_LEVEL);
 
        platform_intr_list[plintsrc->type] = vector;
+       if (acpi_madt_rev > 1) {
+               acpi_cpei_override = plintsrc->plint_flags.cpei_override_flag;
+       }
+
+       /*
+        * Save the physical id, so we can check when its being removed
+        */
+       acpi_cpei_phys_cpuid = ((plintsrc->id << 8) | (plintsrc->eid)) & 0xffff;
+
        return 0;
 }
 
 
+unsigned int can_cpei_retarget(void)
+{
+       extern int cpe_vector;
+
+       /*
+        * Only if CPEI is supported and the override flag
+        * is present, otherwise return that its re-targettable
+        * if we are in polling mode.
+        */
+       if (cpe_vector > 0 && !acpi_cpei_override)
+               return 0;
+       else
+               return 1;
+}
+
+unsigned int is_cpu_cpei_target(unsigned int cpu)
+{
+       unsigned int logical_id;
+
+       logical_id = cpu_logical_id(acpi_cpei_phys_cpuid);
+
+       if (logical_id == cpu)
+               return 1;
+       else
+               return 0;
+}
+
+void set_cpei_target_cpu(unsigned int cpu)
+{
+       acpi_cpei_phys_cpuid = cpu_physical_id(cpu);
+}
+
+unsigned int get_cpei_target_cpu(void)
+{
+       return acpi_cpei_phys_cpuid;
+}
+
 static int __init
 acpi_parse_int_src_ovr (
        acpi_table_entry_header *header, const unsigned long end)
@@ -326,6 +378,8 @@ acpi_parse_madt (unsigned long phys_addr, unsigned long size)
 
        acpi_madt = (struct acpi_table_madt *) __va(phys_addr);
 
+       acpi_madt_rev = acpi_madt->header.revision;
+
        /* remember the value for reference after free_initmem() */
 #ifdef CONFIG_ITANIUM
        has_8259 = 1; /* Firmware on old Itanium systems is broken */