Subversion Repositories Kolibri OS

Rev

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

  1. #include <ddk.h>
  2. #include <syscall.h>
  3. #include "acpi.h"
  4.  
  5. extern acpi_rsdp_t* acpi_rsdp;
  6. extern acpi_rsdt_t* acpi_rsdt;
  7.  
  8. addr_t acpi_ioapic;
  9. addr_t acpi_local_apic;
  10.  
  11. u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer);
  12.  
  13. acpi_rsdp_t* acpi_locate()
  14. {
  15.     /** @todo checksum, check version */
  16.     addr_t p;
  17.  
  18.     for (p = ACPI_HI_RSDP_WINDOW_START; p < ACPI_HI_RSDP_WINDOW_END; p+=16)
  19.     {
  20.         acpi_rsdp_t* r = (acpi_rsdp_t*) p;
  21.         if ((r->sig[0] == 0x20445352) &&
  22.             (r->sig[1] == 0x20525450) &&
  23.              acpi_table_checksum(ACPI_RSDP_CHECKSUM_LENGTH, (u8_t*)r)==0 )
  24.         {
  25.             return r;
  26.         };
  27.     };
  28.     /* not found */
  29.     return NULL;
  30. };
  31.  
  32. addr_t __fastcall rsdt_find(acpi_rsdt_t *rsdt, u32_t sig)
  33. {
  34.     addr_t head = 0;
  35.     u32_t i;
  36.  
  37.     for (i = 0; i < ((rsdt->header.len-sizeof(acpi_thead_t))/
  38.                 sizeof(rsdt->ptrs[0])); i++)
  39.     {
  40.         acpi_thead_t* t= (acpi_thead_t*)acpi_remap_table(rsdt->ptrs[i]);
  41.  
  42.         if (t->sig == sig)
  43.         {
  44.            head = rsdt->ptrs[i];
  45.            break;
  46.         };
  47.     }
  48.     return head;
  49. };
  50.  
  51.