Subversion Repositories Kolibri OS

Rev

Rev 2434 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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