Subversion Repositories Kolibri OS

Rev

Rev 8130 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2020. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 8991 $
  9.  
  10. ; ACPI Generic Address Structure
  11. struct GAS
  12.         ASID       db ? ; address space id
  13.         BitWidth   db ?
  14.         BitOffset  db ?
  15.         AccessSize db ?
  16.         Address    DQ ?
  17. ends
  18.  
  19. ASID.SYSTEM_MEMORY = 0
  20. ASID.SYSTEM_IO     = 1
  21. ASID.PCI_CONFIG    = 2
  22. ASID.PCI_EC        = 3
  23. ASID.PCI_SMBUS     = 4
  24.  
  25. ACCESS_SIZE.UNDEFINED = 0
  26. ACCESS_SIZE.BYTE      = 1
  27. ACCESS_SIZE.WORD      = 2
  28. ACCESS_SIZE.DWORD     = 3
  29. ACCESS_SIZE.QWORD     = 4
  30.  
  31.  
  32. struct ACPI_RSDP
  33.     Signature   DQ ?
  34.     Checksum    db ?
  35.     OEMID       rb 6
  36.     Revision    db ?
  37.     RsdtAddress dd ?
  38.     ; for Revision >= 2
  39.     Length      dd ?
  40.     XsdtAddress DQ ?
  41.     ExtChecksum db ?
  42.     Reserved    rb 3
  43. ends
  44.  
  45. struct ACPI_TABLE       ; DESCRIPTION_HEADER
  46.     Signature       dd ?
  47.     Length          dd ?
  48.     Revision        db ?
  49.     Checksum        db ?
  50.     OEMID           rb 6
  51.     OEMTableID      rb 8
  52.     OEMRevision     rb 4
  53.     CreatorID       rb 4
  54.     CreatorRevision rb 4
  55. ends
  56.  
  57. struct ACPI_RSDT ACPI_TABLE
  58.     Entry           rd (0x1000-sizeof.ACPI_TABLE)/4
  59. ends
  60.  
  61. struct ACPI_HPET ACPI_TABLE
  62.     ID                  dd ?
  63.     Base                GAS
  64.     SeqNumber           db ?
  65.     MainCounterMinimum  dw ?
  66.     PageProtectionOEM   db ?
  67. ends
  68.  
  69. struct ACPI_MADT ACPI_TABLE
  70.     Local_IC_Addr dd ?
  71.     Flags         dd ?
  72.     IntController rb 0x1000-sizeof.ACPI_TABLE-ACPI_MADT.IntController
  73. ends
  74.  
  75. struct ACPI_FADT ACPI_TABLE
  76.     FirmwareCtrl        dd ?
  77.     DSDT                dd ?
  78.                         db ?
  79.     PreferredPMProfile  db ?
  80.     SCI_INT             dw ?
  81.     SMI_CMD             dd ?
  82.     ACPI_ENABLE         db ?
  83.     ACPI_DISABLE        db ?
  84.     S4BIOS_REQ          db ?
  85.     PSTATE_CNT          db ?
  86.     PM1a_EVT_BLK        dd ?
  87.     PM1b_EVT_BLK        dd ?
  88.     PM1a_CNT_BLK        dd ?
  89.     PM1b_CNT_BLK        dd ?
  90.     PM2_CNT_BLK         dd ?
  91.     PM_TMR_BLK          dd ?
  92.     GPE0_BLK            dd ?
  93.     GPE1_BLK            dd ?
  94.     PM1_EVT_LEN         db ?
  95.     PM1_CNT_LEN         db ?
  96.     PM2_CNT_LEN         db ?
  97.     PM_TMR_LEN          db ?
  98.     GPE0_BLK_LEN        db ?
  99.     GPE1_BLK_LEN        db ?
  100.     GPE1_BASE           db ?
  101.     CST_CNT             db ?
  102.     P_LVL2_LAT          dw ?
  103.     P_LVL3_LAT          dw ?
  104.     FLUSH_SIZE          dw ?
  105.     FLUSH_STRIDE        dw ?
  106.     DUTY_OFFSET         db ?
  107.     DUTY_WIDTH          db ?
  108.     DAY_ALRM            db ?
  109.     MON_ALRM            db ?
  110.     CENTURY             db ?
  111.     IAPC_BOOT_ARCH      dw ?
  112.                         db ?
  113.     Flags               dd ?
  114.     RESET_REG           GAS
  115.     RESET_VALUE         db ?
  116.     ARM_BOOT_ARCH       dw ?
  117.     FADT_Minor_Version  db ?
  118.     X_FIRMWARE_CTRL     DQ ?
  119.     X_DSDT              DQ ?
  120.     X_PM1a_EVT_BLK      GAS
  121.     X_PM1b_EVT_BLK      GAS
  122.     X_PM1a_CNT_BLK      GAS
  123.     X_PM1b_CNT_BLK      GAS
  124.     X_PM2_CNT_BLK       GAS
  125.     X_PM_TMR_BLK        GAS
  126.     X_GPE0_BLK          GAS
  127.     X_GPE1_BLK          GAS
  128.     SLEEP_CONTROL_REG   GAS
  129.     SLEEP_STATUS_REG    GAS
  130.     HypervisorVendorID  rb 8
  131. ends
  132.  
  133. MAX_SSDTS = 32
  134.  
  135. iglobal
  136. align 4
  137. acpi_lapic_base   dd 0xfee00000   ; default local apic base
  138. endg
  139.  
  140. uglobal
  141. align 4
  142. acpi_dev_data     rd 1
  143. acpi_dev_size     rd 1
  144.  
  145. acpi_rsdp_base    rd 1
  146. acpi_rsdt_base    rd 1
  147. acpi_rsdt_size    rd 1
  148. acpi_fadt_base    rd 1
  149. acpi_fadt_size    rd 1
  150. acpi_ssdt_base    rd MAX_SSDTS
  151. acpi_ssdt_size    rd MAX_SSDTS
  152. acpi_ssdt_cnt     rd 1
  153. acpi_madt_base    rd 1
  154. acpi_madt_size    rd 1
  155. acpi_ioapic_base  rd MAX_IOAPICS
  156. acpi_hpet_base    rd 1
  157. acpi_hpet_size    rd 1
  158. cpu_count         rd 1
  159. smpt              rd 16
  160. endg
  161.  
  162. align 4
  163. ; @returns ACPI Root System Description Pointer
  164. acpi_get_root_ptr:
  165.         mov     eax, [acpi_rsdp_base]
  166.         ret
  167.  
  168. align 4
  169. rsdt_find:           ;ecx= rsdt edx= SIG
  170.         push    ebx
  171.         push    esi
  172.  
  173.         lea     ebx, [ecx+ACPI_RSDT.Entry]
  174.         mov     esi, [ecx+ACPI_RSDT.Length]
  175.         add     esi, ecx
  176. align 4
  177. .next:
  178.         mov     eax, [ebx]
  179.         cmp     [eax], edx
  180.         je      .done
  181.  
  182.         add     ebx, 4
  183.         cmp     ebx, esi
  184.         jb      .next
  185.  
  186.         xor     eax, eax
  187.         pop     esi
  188.         pop     ebx
  189.         ret
  190.  
  191. .done:
  192.         mov     eax, [ebx]
  193.         pop     esi
  194.         pop     ebx
  195.         ret
  196.  
  197. align 4
  198. check_acpi:
  199.         cmp     [acpi_rsdp_base], 0
  200.         jz      .done
  201.         stdcall map_io_mem, [acpi_rsdp_base], sizeof.ACPI_RSDP, \
  202.                 PG_GLOBAL+PAT_WB+PG_READ
  203.         mov     [acpi_rsdp_base], eax
  204. .rsdp_done:
  205.         cmp     [acpi_rsdt_base], 0
  206.         jz      .rsdt_done
  207.         stdcall map_io_mem, [acpi_rsdt_base], [acpi_rsdt_size], \
  208.                 PG_GLOBAL+PAT_WB+PG_READ
  209.         mov     [acpi_rsdt_base], eax
  210. .rsdt_done:
  211.         cmp     [acpi_fadt_base], 0
  212.         jz      .fadt_done
  213.         stdcall map_io_mem, [acpi_fadt_base], [acpi_fadt_size], \
  214.                 PG_GLOBAL+PAT_WB+PG_READ
  215.         mov     [acpi_fadt_base], eax
  216. .fadt_done:
  217.         cmp     [acpi_hpet_base], 0
  218.         jz      .hpet_done
  219.         stdcall map_io_mem, [acpi_hpet_base], [acpi_hpet_size], \
  220.                 PG_GLOBAL+PAT_WB+PG_READ
  221.         mov     [acpi_hpet_base], eax
  222.         mov     eax, [eax+ACPI_HPET.Base.Address.lo]
  223.         mov     [hpet_base], eax
  224. .hpet_done:
  225.         cmp     [acpi_madt_base], 0
  226.         jz      .madt_done
  227.         stdcall map_io_mem, [acpi_madt_base], [acpi_madt_size], \
  228.                 PG_GLOBAL+PAT_WB+PG_READ
  229.         mov     [acpi_madt_base], eax
  230.  
  231.         mov     ecx, [eax+ACPI_MADT.Local_IC_Addr]
  232.         mov     [acpi_lapic_base], ecx
  233.         push    eax
  234.         stdcall map_io_mem, ecx, 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
  235.         mov     [LAPIC_BASE], eax
  236.         mov     ecx, eax
  237.         pop     eax
  238.  
  239.         mov     edi, smpt
  240.         mov     ebx, [ecx+APIC_ID]
  241.         shr     ebx, 24              ; read APIC ID
  242.  
  243.         mov     [edi], ebx           ; bootstrap always first
  244.         inc     [cpu_count]
  245.         add     edi, 4
  246.  
  247.         mov     [ioapic_cnt], 0
  248.         lea     edx, [eax+ACPI_MADT.IntController]
  249.         mov     ecx, [eax+ACPI_MADT.Length]
  250.         add     ecx, eax
  251. .check:
  252.         mov     eax, [edx]
  253.         cmp     al, 0
  254.         je      .lapic
  255.         cmp     al, 1
  256.         je      .io_apic
  257.         jmp     .next
  258. .lapic:
  259.         shr     eax, 24              ; get APIC ID
  260.         cmp     eax, ebx             ; skip self
  261.         je      .next
  262.  
  263.         test    [edx+4], byte 1      ; is enabled ?
  264.         jz      .next
  265.  
  266.         cmp     [cpu_count], 16
  267.         jae     .next
  268.  
  269.         stosd                        ; store APIC ID
  270.         inc     [cpu_count]
  271.         jmp     .next
  272.  
  273. .io_apic:
  274.         mov     eax, [ioapic_cnt]
  275.         push    dword[edx+4]
  276.         pop     [acpi_ioapic_base+eax*4]
  277.         push    dword[edx+8]
  278.         pop     [ioapic_gsi_base+eax*4]
  279.         inc     [ioapic_cnt]
  280.         jmp     .next
  281.  
  282. .next:
  283.         mov     eax, [edx]
  284.         movzx   eax, ah
  285.         add     edx, eax
  286.         cmp     edx, ecx
  287.         jb      .check
  288. .madt_done:
  289.  
  290.         xor     ecx, ecx
  291. .next_ssdt:
  292.         cmp     ecx, [acpi_ssdt_cnt]
  293.         jz      .ssdt_done
  294.         push    ecx
  295.         stdcall map_io_mem, [acpi_ssdt_base+ecx*4], [acpi_ssdt_size+ecx*4], \
  296.                 PG_GLOBAL+PAT_WB+PG_READ
  297.         pop     ecx
  298.         mov     [acpi_ssdt_base+ecx*4], eax
  299.         inc     ecx
  300.         jmp     .next_ssdt
  301. .ssdt_done:
  302.  
  303. .done:
  304.         ret
  305.