Subversion Repositories Kolibri OS

Rev

Rev 8119 | Rev 8991 | 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: 8130 $
  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. acpi_get_root_ptr:
  164.         mov     eax, [acpi_rsdp_base]
  165.         ret
  166.  
  167. align 4
  168. rsdt_find:           ;ecx= rsdt edx= SIG
  169.         push    ebx
  170.         push    esi
  171.  
  172.         lea     ebx, [ecx+ACPI_RSDT.Entry]
  173.         mov     esi, [ecx+ACPI_RSDT.Length]
  174.         add     esi, ecx
  175. align 4
  176. .next:
  177.         mov     eax, [ebx]
  178.         cmp     [eax], edx
  179.         je      .done
  180.  
  181.         add     ebx, 4
  182.         cmp     ebx, esi
  183.         jb      .next
  184.  
  185.         xor     eax, eax
  186.         pop     esi
  187.         pop     ebx
  188.         ret
  189.  
  190. .done:
  191.         mov     eax, [ebx]
  192.         pop     esi
  193.         pop     ebx
  194.         ret
  195.  
  196. align 4
  197. check_acpi:
  198.         cmp     [acpi_rsdp_base], 0
  199.         jz      .done
  200.         stdcall map_io_mem, [acpi_rsdp_base], sizeof.ACPI_RSDP, \
  201.                 PG_GLOBAL+PAT_WB+PG_READ
  202.         mov     [acpi_rsdp_base], eax
  203. .rsdp_done:
  204.         cmp     [acpi_rsdt_base], 0
  205.         jz      .rsdt_done
  206.         stdcall map_io_mem, [acpi_rsdt_base], [acpi_rsdt_size], \
  207.                 PG_GLOBAL+PAT_WB+PG_READ
  208.         mov     [acpi_rsdt_base], eax
  209. .rsdt_done:
  210.         cmp     [acpi_fadt_base], 0
  211.         jz      .fadt_done
  212.         stdcall map_io_mem, [acpi_fadt_base], [acpi_fadt_size], \
  213.                 PG_GLOBAL+PAT_WB+PG_READ
  214.         mov     [acpi_fadt_base], eax
  215. .fadt_done:
  216.         cmp     [acpi_hpet_base], 0
  217.         jz      .hpet_done
  218.         stdcall map_io_mem, [acpi_hpet_base], [acpi_hpet_size], \
  219.                 PG_GLOBAL+PAT_WB+PG_READ
  220.         mov     [acpi_hpet_base], eax
  221.         mov     eax, [eax+ACPI_HPET.Base.Address.lo]
  222.         mov     [hpet_base], eax
  223. .hpet_done:
  224.         cmp     [acpi_madt_base], 0
  225.         jz      .madt_done
  226.         stdcall map_io_mem, [acpi_madt_base], [acpi_madt_size], \
  227.                 PG_GLOBAL+PAT_WB+PG_READ
  228.         mov     [acpi_madt_base], eax
  229.  
  230.         mov     ecx, [eax+ACPI_MADT.Local_IC_Addr]
  231.         mov     [acpi_lapic_base], ecx
  232.         push    eax
  233.         stdcall map_io_mem, ecx, 0x1000, PG_GLOBAL+PG_NOCACHE+PG_SWR
  234.         mov     [LAPIC_BASE], eax
  235.         mov     ecx, eax
  236.         pop     eax
  237.  
  238.         mov     edi, smpt
  239.         mov     ebx, [ecx+APIC_ID]
  240.         shr     ebx, 24              ; read APIC ID
  241.  
  242.         mov     [edi], ebx           ; bootstrap always first
  243.         inc     [cpu_count]
  244.         add     edi, 4
  245.  
  246.         mov     [ioapic_cnt], 0
  247.         lea     edx, [eax+ACPI_MADT.IntController]
  248.         mov     ecx, [eax+ACPI_MADT.Length]
  249.         add     ecx, eax
  250. .check:
  251.         mov     eax, [edx]
  252.         cmp     al, 0
  253.         je      .lapic
  254.         cmp     al, 1
  255.         je      .io_apic
  256.         jmp     .next
  257. .lapic:
  258.         shr     eax, 24              ; get APIC ID
  259.         cmp     eax, ebx             ; skip self
  260.         je      .next
  261.  
  262.         test    [edx+4], byte 1      ; is enabled ?
  263.         jz      .next
  264.  
  265.         cmp     [cpu_count], 16
  266.         jae     .next
  267.  
  268.         stosd                        ; store APIC ID
  269.         inc     [cpu_count]
  270.         jmp     .next
  271.  
  272. .io_apic:
  273.         mov     eax, [ioapic_cnt]
  274.         push    dword[edx+4]
  275.         pop     [acpi_ioapic_base+eax*4]
  276.         push    dword[edx+8]
  277.         pop     [ioapic_gsi_base+eax*4]
  278.         inc     [ioapic_cnt]
  279.         jmp     .next
  280.  
  281. .next:
  282.         mov     eax, [edx]
  283.         movzx   eax, ah
  284.         add     edx, eax
  285.         cmp     edx, ecx
  286.         jb      .check
  287. .madt_done:
  288.  
  289.         xor     ecx, ecx
  290. .next_ssdt:
  291.         cmp     ecx, [acpi_ssdt_cnt]
  292.         jz      .ssdt_done
  293.         push    ecx
  294.         stdcall map_io_mem, [acpi_ssdt_base+ecx*4], [acpi_ssdt_size+ecx*4], \
  295.                 PG_GLOBAL+PAT_WB+PG_READ
  296.         pop     ecx
  297.         mov     [acpi_ssdt_base+ecx*4], eax
  298.         inc     ecx
  299.         jmp     .next_ssdt
  300. .ssdt_done:
  301.  
  302. .done:
  303.         ret
  304.