Subversion Repositories Kolibri OS

Rev

Rev 2922 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2012. 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.  
  12. ; PCI Bus defines
  13.  
  14.         PCI_HEADER_TYPE                 = 0x0e          ; 8 bit
  15.         PCI_BASE_ADDRESS_0              = 0x10          ; 32 bit
  16.         PCI_BASE_ADDRESS_5              = 0x24          ; 32 bits
  17.         PCI_BASE_ADDRESS_SPACE_IO       = 0x01
  18.         PCI_VENDOR_ID                   = 0x00          ; 16 bit
  19.         PCI_BASE_ADDRESS_IO_MASK        = 0xFFFFFFFC
  20.  
  21. ; PCI programming
  22.  
  23.         PCI_REG_COMMAND                 = 0x4           ; command register
  24.         PCI_REG_STATUS                  = 0x6           ; status register
  25.         PCI_REG_LATENCY                 = 0xd           ; latency timer register
  26.         PCI_REG_CAP_PTR                 = 0x34          ; capabilities pointer
  27.         PCI_REG_CAPABILITY_ID           = 0x0           ; capapility ID in pm register block
  28.         PCI_REG_PM_STATUS               = 0x4           ; power management status register
  29.         PCI_REG_PM_CTRL                 = 0x4           ; power management control register
  30.         PCI_BIT_PIO                     = 1             ; bit0: io space control
  31.         PCI_BIT_MMIO                    = 2             ; bit1: memory space control
  32.         PCI_BIT_MASTER                  = 4             ; bit2: device acts as a PCI master
  33.  
  34.  
  35. macro   find_io bus, dev, io {
  36.  
  37.         local   .check, .inc, .got
  38.  
  39.         xor     eax, eax
  40.         mov     esi, PCI_BASE_ADDRESS_0
  41.         movzx   ecx, bus
  42.         movzx   edx, dev
  43.   .check:
  44.         push    ecx edx
  45.         stdcall PciRead32, ecx ,edx ,esi
  46.         pop     edx ecx
  47.  
  48.         test    eax, PCI_BASE_ADDRESS_IO_MASK
  49.         jz      .inc
  50.  
  51.         test    eax, PCI_BASE_ADDRESS_SPACE_IO
  52.         jz      .inc
  53.  
  54.         and     eax, PCI_BASE_ADDRESS_IO_MASK
  55.         jmp     .got
  56.  
  57.   .inc:
  58.         add     esi, 4
  59.         cmp     esi, PCI_BASE_ADDRESS_5
  60.         jbe     .check
  61.         xor     eax, eax
  62.  
  63.   .got:
  64.         mov     io, eax
  65.  
  66. }
  67.  
  68.  
  69. macro   find_mmio32 bus, dev, io {
  70.  
  71.         local   .check, .inc, .got
  72.  
  73.         mov     esi, PCI_BASE_ADDRESS_0
  74.   .check:
  75.         stdcall PciRead32, bus, dev, esi
  76.  
  77.         test    eax, PCI_BASE_ADDRESS_SPACE_IO  ; mmio address?
  78.         jnz     .inc
  79.  
  80.         test    eax, 100b       ; 64 bit?
  81.         jnz     .inc
  82.         and     eax, not 1111b
  83.         jmp     .got
  84.  
  85.   .inc:
  86.         add     esi, 4
  87.         cmp     esi, PCI_BASE_ADDRESS_5
  88.         jbe     .check
  89.         xor     eax, eax
  90.  
  91.   .got:
  92.         mov     io, eax
  93.  
  94. }
  95.  
  96. macro   find_irq bus, dev, irq {
  97.  
  98.         push    eax edx ecx
  99.         movzx   ecx, bus
  100.         movzx   edx, dev
  101.         stdcall PciRead8, ecx ,edx ,0x3c                                ; 0x3c is the offset where irq can be found
  102.         mov     irq, al
  103.         pop     ecx edx eax
  104.  
  105. }
  106.  
  107. macro   find_rev bus, dev, rev {
  108.  
  109.         push    eax edx ecx
  110.         movzx   ecx, bus
  111.         movzx   edx, dev
  112.         stdcall PciRead8, ecx ,edx ,0x8
  113.         mov     rev, al
  114.         pop     ecx edx eax
  115.  
  116. }
  117.  
  118. macro   make_bus_master bus, dev {
  119.  
  120.         movzx   ecx, bus
  121.         movzx   edx, dev
  122.         stdcall PciRead32, ecx ,edx, PCI_REG_COMMAND
  123.         or      al, PCI_BIT_MASTER
  124.         stdcall PciWrite32, ecx, edx, PCI_REG_COMMAND, eax
  125.  
  126. }
  127.  
  128. macro   adjust_latency bus, dev, min {
  129.  
  130.         movzx   ecx, bus
  131.         movzx   edx, dev
  132.         stdcall PciRead8, ecx ,edx, PCI_REG_LATENCY
  133.         cmp     al, min
  134.         ja      @f
  135.         mov     al, min
  136.         stdcall PciWrite8, ecx, edx, PCI_REG_LATENCY, eax
  137.   @@:
  138.  
  139. }
  140.