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. u8_t __fastcall acpi_table_checksum(u32_t length, u8_t *buffer)
  14. {
  15.     u8_t  sum = 0;
  16.     u8_t *end = buffer + length;
  17.  
  18.     while (buffer < end)
  19.     {
  20.         sum = (u8_t)(sum + *(buffer++));
  21.     }
  22.  
  23.     return sum;
  24. };
  25.  
  26. void* acpi_remap_table(addr_t table)
  27. {
  28.     addr_t ptr;
  29.  
  30.     if( (table >= acpi_rsdp->rsdt_ptr)&&
  31.         (table < acpi_rsdp->rsdt_ptr+0x10000))
  32.         ptr = (table - acpi_rsdp->rsdt_ptr+(addr_t)acpi_rsdt);
  33.     return (void*)ptr;
  34. };
  35.  
  36.  
  37. void print_rsdt(acpi_rsdt_t *rsdt)
  38. {
  39.     u32_t i;
  40.     dbgprintf("ACPI RSD Table\n");
  41.     for (i = 0; i < ((rsdt->header.len-sizeof(acpi_thead_t))/
  42.                 sizeof(rsdt->ptrs[0])); i++)
  43.     {
  44.         acpi_thead_t* t = (acpi_thead_t*)acpi_remap_table(rsdt->ptrs[i]);
  45.         char *p = (char*)&t->sig;
  46.         dbgprintf("sig %d: %c%c%c%c  base %x\n", i,
  47.         p[0],p[1],p[2],p[3], t);
  48.     };
  49. };
  50.  
  51.  
  52. void print_madt (acpi_madt_t * madt)
  53. {
  54.     u32_t i;
  55.  
  56.     acpi_local_apic = madt->local_apic_addr;
  57.  
  58.     dbgprintf ("Local APIC at 0x%x\n\n", acpi_local_apic);
  59.  
  60.     for (i = 0; i < (madt->header.len - sizeof (acpi_madt_t));)
  61.     {
  62.         acpi_madt_hdr_t * h = (acpi_madt_hdr_t*) &madt->data[i];
  63.         switch (h->type)
  64.         {
  65.             case 0:
  66.             {
  67.                 // Local APIC
  68.                 acpi_madt_lapic_t * lapic = (acpi_madt_lapic_t *) h;
  69.                 dbgprintf ("Local APIC  ");
  70.                 dbgprintf ("[Id: 0x%x, CPU Id: 0x%x, %s]\n",
  71.                 lapic->id, lapic->apic_processor_id,
  72.                 lapic->flags.enabled ? "enabled" : "disabled");
  73.                 break;
  74.             }
  75.             case 1:
  76.             {
  77.                 // I/O Apic
  78.                 acpi_madt_ioapic_t * ioapic = (acpi_madt_ioapic_t *) h;
  79.  
  80.                 acpi_ioapic = ioapic->address;
  81.  
  82.                 dbgprintf ("I/O APIC    ");
  83.                 dbgprintf ("[Id: 0x%x, IRQ base: %d, Addr: 0x%x]\n",
  84.                 ioapic->id, ioapic->irq_base, acpi_ioapic);
  85.                 break;
  86.             }
  87.             case 2:
  88.             {
  89.                 // Interrupt Source Override
  90.                 acpi_madt_irq_t * irq = (acpi_madt_irq_t *) h;
  91.                 polarity_t p = irq_get_polarity(irq);
  92.                 trigger_mode_t t = irq_get_trigger_mode(irq);
  93.  
  94.                 dbgprintf ("Interrupt Override  ");
  95.                 dbgprintf ("[%s, Bus IRQ: %d, Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
  96.                 irq->src_bus == 0 ? "ISA" : "unknown bus",
  97.                 irq->src_irq, irq->dest,
  98.                 p == conform_polarity ? "conform" :
  99.                 p == active_high ? "active high" :
  100.                 p == active_low ? "active low" : "?",
  101.                 t == conform_trigger ? "conform" :
  102.                 t == edge ? "edge" :
  103.                 t == level ? "level" : "?");
  104.                 break;
  105.             }
  106.             case 3:
  107.             {
  108.                 // NMI Source
  109.  
  110.                 acpi_madt_nmi_t * nmi = (acpi_madt_nmi_t *) h;
  111.                 polarity_t p = nmi_get_polarity(nmi);
  112.                 trigger_mode_t t = nmi_get_trigger_mode(nmi);
  113.                 dbgprintf ("NMI Source  ");
  114.                 dbgprintf ("[Glob IRQ: %d, Pol: %s, Trigger: %s]\n",
  115.                     nmi->irq,
  116.                     p == conform_polarity ? "conform" :
  117.                     p == active_high ? "active high" :
  118.                     p == active_low ? "active low" : "?",
  119.                     t == conform_trigger ? "conform" :
  120.                     t == edge ? "edge" :
  121.                     t == level ? "level" : "?");
  122.  
  123.                 break;
  124.             }
  125.             case 4:
  126.             {
  127.                 // Local APIC NMI
  128.                 acpi_lapic_nmi_t *nmi = (acpi_lapic_nmi_t *) h;
  129.  
  130.                 polarity_t p = lapic_nmi_get_polarity(nmi);
  131.                 trigger_mode_t t = lapic_nmi_get_trigger_mode(nmi);
  132.  
  133.                 dbgprintf ("Local APIC NMI\n");
  134.  
  135.                 dbgprintf ("[CPU id: %d, LINT#: %d Pol: %s, Trigger: %s]\n",
  136.                     nmi->apic_processor_id,
  137.                     nmi->lint,
  138.                     p == conform_polarity ? "conform" :
  139.                     p == active_high ? "active high" :
  140.                     p == active_low ? "active low" : "?",
  141.                     t == conform_trigger ? "conform" :
  142.                     t == edge ? "edge" :
  143.                     t == level ? "level" : "?");
  144.                 break;
  145.             }
  146.             case 5:
  147.             {
  148.                 // Local APIC Address Override
  149.                 dbgprintf ("Local APIC Address Override\n");
  150.                 break;
  151.             }
  152.             case 8:
  153.             {
  154.                 // Platform Interrupt Source
  155.                 dbgprintf ("Platform Interrupt Source\n");
  156.                 break;
  157.             }
  158.         }
  159.  
  160.         i += h->len;
  161.     }
  162. };
  163.  
  164.  
  165.