Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  *  acpi_tables.c - ACPI Boot-Time Table Parsing
  3.  *
  4.  *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  5.  *
  6.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7.  *
  8.  *  This program is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19.  *
  20.  */
  21.  
  22. /* Uncomment next line to get verbose printout */
  23. /* #define DEBUG */
  24. #define pr_fmt(fmt) "ACPI: " fmt
  25.  
  26. #include <linux/init.h>
  27. #include <linux/kernel.h>
  28. #include <linux/string.h>
  29. #include <linux/types.h>
  30. #include <linux/errno.h>
  31. #include <linux/acpi.h>
  32.  
  33. #define ACPI_MAX_TABLES         128
  34. static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;
  35.  
  36. static int acpi_apic_instance __initdata;
  37.  
  38. /*
  39.  * Disable table checksum verification for the early stage due to the size
  40.  * limitation of the current x86 early mapping implementation.
  41.  */
  42. static bool acpi_verify_table_checksum __initdata = false;
  43. /**
  44.  * acpi_table_parse - find table with @id, run @handler on it
  45.  * @id: table id to find
  46.  * @handler: handler to run
  47.  *
  48.  * Scan the ACPI System Descriptor Table (STD) for a table matching @id,
  49.  * run @handler on it.
  50.  *
  51.  * Return 0 if table found, -errno if not.
  52.  */
  53. int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler)
  54. {
  55.         struct acpi_table_header *table = NULL;
  56.         acpi_size tbl_size;
  57.  
  58.         if (acpi_disabled)
  59.                 return -ENODEV;
  60.  
  61.         if (!id || !handler)
  62.                 return -EINVAL;
  63.  
  64.         if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
  65.                 acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size);
  66.         else
  67.                 acpi_get_table_with_size(id, 0, &table, &tbl_size);
  68.  
  69.         if (table) {
  70.                 handler(table);
  71.                 early_acpi_os_unmap_memory(table, tbl_size);
  72.                 return 0;
  73.         } else
  74.                 return -ENODEV;
  75. }
  76.  
  77. /*
  78.  * acpi_table_init()
  79.  *
  80.  * find RSDP, find and checksum SDT/XSDT.
  81.  * checksum all tables, print SDT/XSDT
  82.  *
  83.  * result: sdt_entry[] is initialized
  84.  */
  85.  
  86. int __init acpi_table_init(void)
  87. {
  88.         acpi_status status;
  89.  
  90.         if (acpi_verify_table_checksum) {
  91.                 pr_info("Early table checksum verification enabled\n");
  92.                 acpi_gbl_verify_table_checksum = TRUE;
  93.         } else {
  94.                 pr_info("Early table checksum verification disabled\n");
  95.                 acpi_gbl_verify_table_checksum = FALSE;
  96.         }
  97.  
  98.         status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
  99.         if (ACPI_FAILURE(status))
  100.                 return -EINVAL;
  101.  
  102.         return 0;
  103. }
  104.