]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/ia64/kernel/efi.c
always reserve elfcore header memory in crash kernel
[linux-2.6-omap-h63xx.git] / arch / ia64 / kernel / efi.c
index 728d7247a1a69688da32f12386d8fcb2165a1439..efaff15d8cf1dc9cad35a767a53b3865d51037b4 100644 (file)
@@ -37,6 +37,7 @@
 #include <asm/pgtable.h>
 #include <asm/processor.h>
 #include <asm/mca.h>
+#include <asm/tlbflush.h>
 
 #define EFI_DEBUG      0
 
@@ -403,6 +404,41 @@ efi_get_pal_addr (void)
        return NULL;
 }
 
+
+static u8 __init palo_checksum(u8 *buffer, u32 length)
+{
+       u8 sum = 0;
+       u8 *end = buffer + length;
+
+       while (buffer < end)
+               sum = (u8) (sum + *(buffer++));
+
+       return sum;
+}
+
+/*
+ * Parse and handle PALO table which is published at:
+ * http://www.dig64.org/home/DIG64_PALO_R1_0.pdf
+ */
+static void __init handle_palo(unsigned long palo_phys)
+{
+       struct palo_table *palo = __va(palo_phys);
+       u8  checksum;
+
+       if (strncmp(palo->signature, PALO_SIG, sizeof(PALO_SIG) - 1)) {
+               printk(KERN_INFO "PALO signature incorrect.\n");
+               return;
+       }
+
+       checksum = palo_checksum((u8 *)palo, palo->length);
+       if (checksum) {
+               printk(KERN_INFO "PALO checksum incorrect.\n");
+               return;
+       }
+
+       setup_ptcg_sem(palo->max_tlb_purges, NPTCG_FROM_PALO);
+}
+
 void
 efi_map_pal_code (void)
 {
@@ -432,6 +468,7 @@ efi_init (void)
        u64 efi_desc_size;
        char *cp, vendor[100] = "unknown";
        int i;
+       unsigned long palo_phys;
 
        /*
         * It's too early to be able to use the standard kernel command line
@@ -496,6 +533,8 @@ efi_init (void)
        efi.hcdp       = EFI_INVALID_TABLE_ADDR;
        efi.uga        = EFI_INVALID_TABLE_ADDR;
 
+       palo_phys      = EFI_INVALID_TABLE_ADDR;
+
        for (i = 0; i < (int) efi.systab->nr_tables; i++) {
                if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) {
                        efi.mps = config_tables[i].table;
@@ -515,10 +554,17 @@ efi_init (void)
                } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) {
                        efi.hcdp = config_tables[i].table;
                        printk(" HCDP=0x%lx", config_tables[i].table);
+               } else if (efi_guidcmp(config_tables[i].guid,
+                        PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID) == 0) {
+                       palo_phys = config_tables[i].table;
+                       printk(" PALO=0x%lx", config_tables[i].table);
                }
        }
        printk("\n");
 
+       if (palo_phys != EFI_INVALID_TABLE_ADDR)
+               handle_palo(palo_phys);
+
        runtime = __va(efi.systab->runtime);
        efi.get_time = phys_get_time;
        efi.set_time = phys_set_time;
@@ -1186,9 +1232,10 @@ efi_initialize_iomem_resources(struct resource *code_resource,
                                if (md->attribute & EFI_MEMORY_WP) {
                                        name = "System ROM";
                                        flags |= IORESOURCE_READONLY;
-                               } else {
+                               } else if (md->attribute == EFI_MEMORY_UC)
+                                       name = "Uncached RAM";
+                               else
                                        name = "System RAM";
-                               }
                                break;
 
                        case EFI_ACPI_MEMORY_NVS:
@@ -1288,7 +1335,7 @@ kdump_find_rsvd_region (unsigned long size, struct rsvd_region *r, int n)
 }
 #endif
 
-#ifdef CONFIG_PROC_VMCORE
+#ifdef CONFIG_CRASH_DUMP
 /* locate the size find a the descriptor at a certain address */
 unsigned long __init
 vmcore_find_descriptor_size (unsigned long address)