Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2014. 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 ?
  14.         device_id       dw ?
  15.         command         dw ?
  16.         status          dw ?
  17.         revision_id     db ?
  18.         prog_if         db ?
  19.         subclass        db ?
  20.         class_code      db ?
  21.         cache_line_size db ?
  22.         latency_timer   db ?
  23.         header_type     db ?
  24.         bist            db ?
  25.  
  26. ends
  27.  
  28. struct  PCI_header00    PCI_header
  29.  
  30.         base_addr_0     dd ?
  31.         base_addr_1     dd ?
  32.         base_addr_2     dd ?
  33.         base_addr_3     dd ?
  34.         base_addr_4     dd ?
  35.         base_addr_5     dd ?
  36.         cardbus_cis_ptr dd ?
  37.         subsys_vendor   dw ?
  38.         subsys_id       dw ?
  39.         exp_rom_addr    dd ?
  40.         cap_ptr         db ?
  41.         reserved        rb 7
  42.         interrupt_line  db ?
  43.         interrupt_pin   db ?
  44.         min_grant       db ?
  45.         max_latency     db ?
  46.  
  47. ends
  48.  
  49. ; Base address bits
  50.         PCI_BASE_ADDRESS_SPACE_IO       = 0x01
  51.         PCI_BASE_ADDRESS_IO_MASK        = 0xFFFFFFFC
  52.         PCI_BASE_ADDRESS_MEM_MASK       = 0xFFFFFFF0
  53.  
  54. ; command bits
  55.         PCI_CMD_PIO                     = 1             ; bit0: io space control
  56.         PCI_CMD_MMIO                    = 2             ; bit1: memory space control
  57.         PCI_CMD_MASTER                  = 4             ; bit2: device acts as a PCI master
  58.  
  59.  
  60. if used PCI_find_io
  61. proc PCI_find_io stdcall bus, dev
  62.  
  63.         push    esi
  64.         xor     eax, eax
  65.         mov     esi, PCI_BASE_ADDRESS_0
  66.   .check:
  67.         invoke  PciRead32, [bus], [dev], esi
  68.  
  69.         test    eax, PCI_BASE_ADDRESS_IO_MASK
  70.         jz      .inc
  71.  
  72.         test    eax, PCI_BASE_ADDRESS_SPACE_IO
  73.         jz      .inc
  74.  
  75.         and     eax, PCI_BASE_ADDRESS_IO_MASK
  76.         pop     esi
  77.         ret
  78.  
  79.   .inc:
  80.         add     esi, 4
  81.         cmp     esi, PCI_BASE_ADDRESS_5
  82.         jbe     .check
  83.         pop     esi
  84.         xor     eax, eax
  85.         ret
  86.  
  87. endp
  88. end if
  89.  
  90.  
  91. if used PCI_find_mmio32
  92. proc PCI_find_mmio32 stdcall bus, dev
  93.  
  94.         push    esi
  95.         mov     esi, PCI_header00.base_addr_0
  96.   .check:
  97.         invoke  PciRead32, [bus], [dev], esi
  98.  
  99.         test    eax, PCI_BASE_ADDRESS_SPACE_IO  ; mmio address?
  100.         jnz     .inc
  101.  
  102.         test    eax, 100b       ; 64 bit?
  103.         jnz     .inc
  104.         and     eax, not 1111b
  105.         pop     esi
  106.         ret
  107.  
  108.   .inc:
  109.         add     esi, 4
  110.         cmp     esi, PCI_header00.base_addr_5
  111.         jbe     .check
  112.         xor     eax, eax
  113.         pop     esi
  114.         ret
  115.  
  116. endp
  117. end if