Subversion Repositories Kolibri OS

Rev

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