Subversion Repositories Kolibri OS

Rev

Rev 1487 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) 2010 KolibriOS team.     All rights reserved.  ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;                                                              ;;
  7. ;;  PCIe.INC                                                    ;;
  8. ;;                                                              ;;
  9. ;;  Extended PCI express services                               ;;
  10. ;;                                                              ;;
  11. ;;  Author:                                                     ;;
  12. ;;                  art_zh  <artem@jerdev.co.uk>                ;;
  13. ;;                                                              ;;
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  15.  
  16. $Revision: 1463 $
  17.  
  18. ;***************************************************************************
  19. ;   Function
  20. ;      pci_ext_config:
  21. ;
  22. ;   Description
  23. ;       PCIe extended (memory-mapped) config space detection
  24. ;
  25. ;   WARNINGs:
  26. ;       1) Very Experimental!
  27. ;       2) direct HT-detection (no ACPI or BIOS service used)
  28. ;       3) Only AMD/HT processors currently supported
  29. ;
  30. ;***************************************************************************
  31.  
  32. PCIe_CONFIG_SPACE       equ     0xF0000000      ; to be moved to const.inc
  33. mmio_pcie_cfg_addr      dd      0x0             ; not defined by default
  34. mmio_pcie_cfg_lim       dd      0x0             ; each bus needs 1Mb
  35.  
  36.  
  37. align 4
  38.  
  39. pci_ext_config:
  40.  
  41.         push    ebx
  42.         mov     bx, 0xC184              ; dev = 24, fn = 01, reg = 84h
  43.  
  44. .check_HT_mmio:
  45.         mov     cx, bx
  46.         mov     ax, 0x0002              ; bus = 0, 1dword to read
  47.         call    pci_read_reg
  48.         mov     bx, cx
  49.         sub     bl, 4
  50.         and     al, 0x80                ; check the NP bit
  51.         jz      .not_pcie_cfg
  52.         shl     eax, 8                  ; bus:[27..20], dev:[19:15]
  53.         or      eax, 0x00007FFC         ; fun:[14..12], reg:[11:2]
  54.         mov     [mmio_pcie_cfg_lim], eax
  55.         mov     cl, bl
  56.         mov     ax, 0x0002              ; bus = 0, 1dword to read
  57.         call    pci_read_reg
  58.         mov     bx, cx
  59.         test    al, 0x03                ; MMIO Base RW enabled?
  60.         jz      .not_pcie_cfg
  61.         test    al, 0x0C                ; MMIO Base locked?
  62.         jnz     .not_pcie_cfg
  63.         xor     al, al
  64.         shl     eax, 8
  65. ;       test    eax, 0x000F0000         ; MMIO Base must be bus0-aligned
  66. ;       jnz     .not_pcie_cfg
  67.         mov     [mmio_pcie_cfg_addr], eax
  68.         add     eax, 0x000FFFFC
  69.         sub     eax,[mmio_pcie_cfg_lim] ; MMIO must cover at least one bus
  70.         ja      .not_pcie_cfg
  71.  
  72. ;       -- it looks like a true PCIe config space;
  73.         mov     eax,[mmio_pcie_cfg_addr]        ; physical address
  74.         or      eax, (PG_SHARED + PG_LARGE + PG_USER)
  75.         mov     ebx, PCIe_CONFIG_SPACE          ; linear address
  76.         mov     ecx, ebx
  77.         shr     ebx, 20        
  78.         add     ebx, sys_pgdir                  ; PgDir entry @
  79. @@:
  80.         mov     dword[ebx], eax                 ; map 4 buses
  81.         invlpg  [ecx]
  82.         cmp     bl, 4
  83.         jz      .pcie_cfg_mapped                ; fix it later
  84.         add     bl, 4                           ; next PgDir entry
  85.         add     eax, 0x400000                   ; eax += 4M
  86.         add     ecx, 0x400000
  87.         jmp     @b     
  88.  
  89. .pcie_cfg_mapped:
  90.        
  91. ;       -- glad to have the extended PCIe config field found
  92.         mov     esi, boot_pcie_ok
  93.         pop     ebx
  94.         call    boot_log
  95.         ret     ; <<<<<<<<<<< OK >>>>>>>>>>>
  96.        
  97. .not_pcie_cfg:
  98.  
  99.         xor     eax, eax
  100.         mov     [mmio_pcie_cfg_addr], eax
  101.         mov     [mmio_pcie_cfg_lim],  eax
  102.         add     bl, 12
  103.         cmp     bl, 0xC0                ; MMIO regs lay below this offset
  104.         jb      .check_HT_mmio
  105.         mov     esi, boot_pcie_fail
  106.         pop     ebx
  107.         call    boot_log
  108.         ret     ; <<<<<<<<< FAILURE >>>>>>>>>
  109.  
  110.