diff options
Diffstat (limited to 'arch/ia64/kernel/efi.c')
| -rw-r--r-- | arch/ia64/kernel/efi.c | 46 | 
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 728d7247a1a6..d45f215bc8fc 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c  | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> | 
| 38 | #include <asm/processor.h> | 38 | #include <asm/processor.h> | 
| 39 | #include <asm/mca.h> | 39 | #include <asm/mca.h> | 
| 40 | #include <asm/tlbflush.h> | ||
| 40 | 41 | ||
| 41 | #define EFI_DEBUG 0 | 42 | #define EFI_DEBUG 0 | 
| 42 | 43 | ||
| @@ -403,6 +404,41 @@ efi_get_pal_addr (void) | |||
| 403 | return NULL; | 404 | return NULL; | 
| 404 | } | 405 | } | 
| 405 | 406 | ||
| 407 | |||
| 408 | static u8 __init palo_checksum(u8 *buffer, u32 length) | ||
| 409 | { | ||
| 410 | u8 sum = 0; | ||
| 411 | u8 *end = buffer + length; | ||
| 412 | |||
| 413 | while (buffer < end) | ||
| 414 | sum = (u8) (sum + *(buffer++)); | ||
| 415 | |||
| 416 | return sum; | ||
| 417 | } | ||
| 418 | |||
| 419 | /* | ||
| 420 | * Parse and handle PALO table which is published at: | ||
| 421 | * http://www.dig64.org/home/DIG64_PALO_R1_0.pdf | ||
| 422 | */ | ||
| 423 | static void __init handle_palo(unsigned long palo_phys) | ||
| 424 | { | ||
| 425 | struct palo_table *palo = __va(palo_phys); | ||
| 426 | u8 checksum; | ||
| 427 | |||
| 428 | if (strncmp(palo->signature, PALO_SIG, sizeof(PALO_SIG) - 1)) { | ||
| 429 | printk(KERN_INFO "PALO signature incorrect.\n"); | ||
| 430 | return; | ||
| 431 | } | ||
| 432 | |||
| 433 | checksum = palo_checksum((u8 *)palo, palo->length); | ||
| 434 | if (checksum) { | ||
| 435 | printk(KERN_INFO "PALO checksum incorrect.\n"); | ||
| 436 | return; | ||
| 437 | } | ||
| 438 | |||
| 439 | setup_ptcg_sem(palo->max_tlb_purges, NPTCG_FROM_PALO); | ||
| 440 | } | ||
| 441 | |||
| 406 | void | 442 | void | 
| 407 | efi_map_pal_code (void) | 443 | efi_map_pal_code (void) | 
| 408 | { | 444 | { | 
| @@ -432,6 +468,7 @@ efi_init (void) | |||
| 432 | u64 efi_desc_size; | 468 | u64 efi_desc_size; | 
| 433 | char *cp, vendor[100] = "unknown"; | 469 | char *cp, vendor[100] = "unknown"; | 
| 434 | int i; | 470 | int i; | 
| 471 | unsigned long palo_phys; | ||
| 435 | 472 | ||
| 436 | /* | 473 | /* | 
| 437 | * It's too early to be able to use the standard kernel command line | 474 | * It's too early to be able to use the standard kernel command line | 
| @@ -496,6 +533,8 @@ efi_init (void) | |||
| 496 | efi.hcdp = EFI_INVALID_TABLE_ADDR; | 533 | efi.hcdp = EFI_INVALID_TABLE_ADDR; | 
| 497 | efi.uga = EFI_INVALID_TABLE_ADDR; | 534 | efi.uga = EFI_INVALID_TABLE_ADDR; | 
| 498 | 535 | ||
| 536 | palo_phys = EFI_INVALID_TABLE_ADDR; | ||
| 537 | |||
| 499 | for (i = 0; i < (int) efi.systab->nr_tables; i++) { | 538 | for (i = 0; i < (int) efi.systab->nr_tables; i++) { | 
| 500 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { | 539 | if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { | 
| 501 | efi.mps = config_tables[i].table; | 540 | efi.mps = config_tables[i].table; | 
| @@ -515,10 +554,17 @@ efi_init (void) | |||
| 515 | } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { | 554 | } else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { | 
| 516 | efi.hcdp = config_tables[i].table; | 555 | efi.hcdp = config_tables[i].table; | 
| 517 | printk(" HCDP=0x%lx", config_tables[i].table); | 556 | printk(" HCDP=0x%lx", config_tables[i].table); | 
| 557 | } else if (efi_guidcmp(config_tables[i].guid, | ||
| 558 | PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID) == 0) { | ||
| 559 | palo_phys = config_tables[i].table; | ||
| 560 | printk(" PALO=0x%lx", config_tables[i].table); | ||
| 518 | } | 561 | } | 
| 519 | } | 562 | } | 
| 520 | printk("\n"); | 563 | printk("\n"); | 
| 521 | 564 | ||
| 565 | if (palo_phys != EFI_INVALID_TABLE_ADDR) | ||
| 566 | handle_palo(palo_phys); | ||
| 567 | |||
| 522 | runtime = __va(efi.systab->runtime); | 568 | runtime = __va(efi.systab->runtime); | 
| 523 | efi.get_time = phys_get_time; | 569 | efi.get_time = phys_get_time; | 
| 524 | efi.set_time = phys_set_time; | 570 | efi.set_time = phys_set_time; | 
