Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2018. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  7. ;;             Version 2, June 1991                                ;;
  8. ;;                                                                 ;;
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.  
  11. struct  PCI_header
  12.  
  13.         vendor_id       dw ?    ; 0x00
  14.         device_id       dw ?    ; 0x02
  15.         command         dw ?    ; 0x04
  16.         status          dw ?    ; 0x06
  17.         revision_id     db ?    ; 0x08
  18.         prog_if         db ?    ; 0x09
  19.         subclass        db ?    ; 0x0A
  20.         class_code      db ?    ; 0x0B
  21.         cache_line_size db ?    ; 0x0C
  22.         latency_timer   db ?    ; 0x0D
  23.         header_type     db ?    ; 0x0E
  24.         bist            db ?    ; 0x0F
  25.  
  26. ends
  27.  
  28. struct  PCI_header00    PCI_header
  29.  
  30.         base_addr_0     dd ?    ; 0x10
  31.         base_addr_1     dd ?    ; 0x14
  32.         base_addr_2     dd ?    ; 0x18
  33.         base_addr_3     dd ?    ; 0x1C
  34.         base_addr_4     dd ?    ; 0x20
  35.         base_addr_5     dd ?    ; 0x24
  36.         cardbus_cis_ptr dd ?    ; 0x28
  37.         subsys_vendor   dw ?    ; 0x2C
  38.         subsys_id       dw ?    ; 0x2E
  39.         exp_rom_addr    dd ?    ; 0x30
  40.         cap_ptr         db ?    ; 0x34
  41.                         rb 7    ; reserved
  42.         interrupt_line  db ?    ; 0x3C
  43.         interrupt_pin   db ?    ; 0x3D
  44.         min_grant       db ?    ; 0x3E
  45.         max_latency     db ?    ; 0x3F
  46.  
  47. ends
  48.  
  49. struct  PCI_header01    PCI_header
  50.  
  51.         base_addr_0     dd ?    ; 0x10
  52.         base_addr_1     dd ?    ; 0x14
  53.         prim_bus_nr     db ?    ; 0x18
  54.         sec_bus_nr      db ?    ; 0x19
  55.         sub_bus_nr      db ?    ; 0x1A
  56.         sec_lat_tmr     db ?    ; 0x1B
  57.         io_base         db ?    ; 0x1C
  58.         io_limit        db ?    ; 0x1D
  59.         sec_status      dw ?    ; 0x1E
  60.         mem_base        dw ?    ; 0x20
  61.         mem_limit       dw ?    ; 0x22
  62.         pref_mem_base   dw ?    ; 0x24
  63.         pref_mem_limit  dw ?    ; 0x26
  64.         pref_base_up    dd ?    ; 0x28
  65.         pref_limit_up   dd ?    ; 0x2C
  66.         io_base_up      dw ?    ; 0x30
  67.         io_limit_up     dw ?    ; 0x32
  68.         cap_ptr         db ?    ; 0x34
  69.                         rb 3    ; reserved
  70.         exp_rom_addr    dd ?    ; 0x38
  71.         interrupt_line  db ?    ; 0x3C
  72.         interrupt_pin   db ?    ; 0x3E
  73.         bridge_ctrl     dw ?    ; 0x3F
  74.  
  75. ends
  76.  
  77. struct  PCI_header02    PCI_header
  78.  
  79.         base_addr       dd ?    ; 0x10
  80.         cap_list_offs   db ?    ; 0x14
  81.                         rb 1    ; reserved
  82.         sec_stat        dw ?    ; 0x16
  83.         pci_bus_nr      db ?    ; 0x18
  84.         cardbus_bus_nr  db ?    ; 0x19
  85.         sub_bus_nr      db ?    ; 0x1A
  86.         cardbus_lat_tmr db ?    ; 0x1B
  87.         mbar_0          dd ?    ; 0x1C
  88.         mlimit_0        dd ?    ; 0x20
  89.         mbar_1          dd ?    ; 0x24
  90.         mlimit_1        dd ?    ; 0x28
  91.         iobar_0         dd ?    ; 0x2C
  92.         iolimit_0       dd ?    ; 0x30
  93.         iobar_1         dd ?    ; 0x34
  94.         iolimit_1       dd ?    ; 0x38
  95.         interrupt_line  db ?    ; 0x3C
  96.         interrupt_pin   db ?    ; 0x3D
  97.         bridge_ctrl     dw ?    ; 0x3E
  98.         subs_did        dw ?    ; 0x40
  99.         subs_vid        dw ?    ; 0x42
  100.         legacy_bar      dd ?    ; 0x44
  101.  
  102. ends
  103.  
  104. ; Base address bits
  105.         PCI_BASE_ADDRESS_SPACE_IO               = 0x01
  106.         PCI_BASE_ADDRESS_IO_MASK                = 0xFFFFFFFC
  107.         PCI_BASE_ADDRESS_MEM_MASK               = 0xFFFFFFF0
  108.         PCI_BASE_ADDRESS_MEM_TYPE_MASK          = 0x00000006
  109.         PCI_BASE_ADDRESS_MEM_TYPE_32            = 0x0
  110.         PCI_BASE_ADDRESS_MEM_TYPE_RESERVED      = 0x02
  111.         PCI_BASE_ADDRESS_MEM_TYPE_64            = 0x4
  112.  
  113.  
  114. ; command bits
  115.         PCI_CMD_PIO                     = 0x01          ; bit0: io space control
  116.         PCI_CMD_MMIO                    = 0x02          ; bit1: memory space control
  117.         PCI_CMD_MASTER                  = 0x04          ; bit2: device acts as a PCI master
  118.         PCI_CMD_INTX_DISABLE            = 0x400         ; INTx emulation disable
  119.  
  120. ; status bits
  121.         PCI_STATUS_CAPA                 = 0x10          ; bit4: new capabilities available
  122.  
  123.  
  124. if used PCI_find_io
  125. proc PCI_find_io stdcall bus, dev
  126.  
  127.         push    esi
  128.         xor     eax, eax
  129.         mov     esi, PCI_header00.base_addr_0
  130.   .check:
  131.         invoke  PciRead32, [bus], [dev], esi
  132.         test    eax, PCI_BASE_ADDRESS_IO_MASK
  133.         jz      .inc
  134.         test    eax, PCI_BASE_ADDRESS_SPACE_IO
  135.         jz      .inc
  136.         and     eax, PCI_BASE_ADDRESS_IO_MASK
  137.         pop     esi
  138.         ret
  139.  
  140.   .inc:
  141.         add     esi, 4
  142.         cmp     esi, PCI_header00.base_addr_5
  143.         jbe     .check
  144.         pop     esi
  145.         xor     eax, eax
  146.         ret
  147.  
  148. endp
  149. end if
  150.  
  151.  
  152. if used PCI_find_mmio
  153. proc PCI_find_mmio stdcall bus, dev
  154.  
  155.         push    esi ebx
  156.         mov     esi, PCI_header00.base_addr_0
  157.   .check:
  158.         invoke  PciRead32, [bus], [dev], esi
  159.         DEBUGF  1, "BAR: 0x%x\n", eax
  160.         mov     ebx, eax
  161.         test    eax, PCI_BASE_ADDRESS_SPACE_IO  ; MMIO address?
  162.         jnz     .next
  163.         and     ebx, PCI_BASE_ADDRESS_MEM_TYPE_MASK
  164.         cmp     bl, PCI_BASE_ADDRESS_MEM_TYPE_64
  165.         je      .is64
  166.         cmp     bl, PCI_BASE_ADDRESS_MEM_TYPE_32
  167.         jne     .next
  168.         ; Ok, we have a 32-bit BAR.
  169.         and     eax, PCI_BASE_ADDRESS_MEM_MASK
  170.         pop     ebx esi
  171.         DEBUGF  1, "32-bit MMIO address found: 0x%x\n", eax
  172.         ret
  173.  
  174.   .is64:
  175.         ; Ok, we have a 64-bit BAR, check if the upper 32-bits are 0, then we can use it..
  176.         push    eax
  177.         add     esi, 4
  178.         cmp     esi, PCI_header00.base_addr_5
  179.         ja      .fail
  180.         invoke  PciRead32, [bus], [dev], esi
  181.         test    eax, eax
  182.         pop     eax
  183.         jnz     .next
  184.         and     eax, PCI_BASE_ADDRESS_MEM_MASK
  185.         pop     ebx esi
  186.         DEBUGF  1, "64-bit MMIO address found: 0x00000000%x\n", eax
  187.         ret
  188.  
  189.   .next:
  190.         add     esi, 4
  191.         cmp     esi, PCI_header00.base_addr_5
  192.         jbe     .check
  193.   .fail:
  194.         xor     eax, eax
  195.         pop     ebx esi
  196.         DEBUGF  1, "No usable MMIO addresses found!\n"
  197.         ret
  198.  
  199. endp
  200. end if