Subversion Repositories Kolibri OS

Rev

Rev 9227 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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