Rev 1551 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1551 | art_zh | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) 2010 KolibriOS team. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;; HT.inc ;; ;; |
||
7 | ;; ;; |
||
8 | ;; AMD HyperTransport bus control ;; |
||
9 | ;; ;; |
||
10 | ;; art_zh |
||
11 | ;; ;; |
||
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
13 | |||
1560 | art_zh | 14 | $Revision: 1554 $ |
1551 | art_zh | 15 | |
16 | |||
17 | |||
18 | ;============================================================================= |
||
19 | ; |
||
20 | ; This code is a part of Kolibri-A and will only work with AMD RS760+ chipsets |
||
21 | ; |
||
22 | ;============================================================================= |
||
1560 | art_zh | 23 | align 4 |
1551 | art_zh | 24 | |
25 | ;------------------------------------------ |
||
26 | ; params: al = nbconfig register# |
||
27 | ; returns: eax = register content |
||
28 | ; |
||
29 | rs7xx_nbconfig_read_pci: |
||
30 | and eax, 0x0FC ; leave register# only |
||
31 | or eax, 0x80000000 ; bdf = 0:0.0 |
||
32 | mov dx, 0x0CF8 ; write to index reg |
||
33 | out dx, eax |
||
34 | add dl, 4 |
||
35 | in eax, dx |
||
36 | ret |
||
1560 | art_zh | 37 | align 4 |
1551 | art_zh | 38 | |
39 | rs7xx_nbconfig_flush_pci: |
||
40 | mov eax, 0x0B0 ; a scratch reg |
||
41 | mov dx, 0xCF8 |
||
42 | out dx, eax |
||
43 | ret |
||
44 | |||
1560 | art_zh | 45 | align 4 |
1551 | art_zh | 46 | |
47 | rs7xx_nbconfig_write_pci: |
||
48 | and eax, 0x0FC ; leave register# only |
||
49 | or eax, 0x80000000 ; bdf = 0:0.0 |
||
50 | mov dx, 0x0CF8 ; write to index reg |
||
51 | out dx, eax |
||
52 | add dl, 4 |
||
53 | mov eax, ebx |
||
54 | out dx, eax |
||
55 | ret |
||
56 | |||
57 | ;*************************************************************************** |
||
58 | ; Function |
||
59 | ; rs7xx_pcie_init: |
||
60 | ; |
||
61 | ; Description |
||
62 | ; PCIe extended (memory-mapped) config space detection |
||
63 | ; |
||
64 | ;*************************************************************************** |
||
65 | |||
1560 | art_zh | 66 | align 4 |
67 | |||
1551 | art_zh | 68 | rs7xx_pcie_init: |
69 | mov al, 0x7C ; NB_IOC_CFG_CNTL |
||
70 | call rs7xx_nbconfig_read_pci |
||
71 | mov ebx, eax |
||
72 | call rs7xx_nbconfig_flush_pci |
||
73 | test ebx, 0x20000000 ; BAR3 locked? |
||
74 | jz .rs7xx_pcie_blocked |
||
75 | mov al, 0x84 ; NB_PCI_ARB |
||
76 | call rs7xx_nbconfig_read_pci |
||
77 | shr eax,16 |
||
78 | and ax, 7 ; the Bus range lays here: |
||
79 | jnz @f |
||
80 | mov ax, 8 ; 1=2Mb, 2=4MB, 3=8MB, 4=16MB |
||
81 | @@: |
||
82 | mov [PCIe_bus_range], ax ; 5=32Mb, 6=64MB, 7=128Mb, 8=256Mb |
||
83 | mov cl, al |
||
84 | call rs7xx_nbconfig_flush_pci |
||
85 | dec cl ; <4M ? |
||
86 | jnz @f |
||
87 | inc cl ; one PDE needed anyway |
||
88 | @@: |
||
89 | dec cl |
||
90 | mov ebx, 1 |
||
91 | shl ebx, cl |
||
92 | mov [mmio_pcie_cfg_pdes], bx ; 1..64 PDE(s) needed, |
||
93 | shl ebx, 22 |
||
94 | mov [mmio_pcie_cfg_lim], ebx ; or 4..256Mb space to map |
||
95 | dec [mmio_pcie_cfg_lim] |
||
96 | |||
97 | mov al, 0x1C ; NB_BAR3_PCIEXP_MMCFG |
||
98 | call rs7xx_nbconfig_read_pci |
||
99 | mov ebx, eax |
||
100 | call rs7xx_nbconfig_flush_pci |
||
101 | mov eax, ebx |
||
102 | and eax, 0xFFE00000 ; valid bits [31..21] |
||
1560 | art_zh | 103 | jz .rs7xx_pcie_blocked ; NB BAR3 may be invisible! |
104 | ; try to get pcie ecfg address indirectly |
||
105 | .addr_found: |
||
1551 | art_zh | 106 | mov [mmio_pcie_cfg_addr], eax ; physical address (lower 32 bits) |
107 | add [mmio_pcie_cfg_lim], eax |
||
108 | |||
109 | or eax, (PG_SHARED + PG_LARGE + PG_UW) ; by the way, UW is unsafe! |
||
110 | mov ecx, PCIe_CONFIG_SPACE ; linear address |
||
111 | mov ebx, ecx |
||
112 | shr ebx, 20 |
||
113 | add ebx, sys_pgdir ; PgDir entry @ |
||
1560 | art_zh | 114 | mov dl, byte[mmio_pcie_cfg_pdes] ; 1 page = 4M in address space |
115 | cmp dl, (USER_DMA_BUFFER - PCIe_CONFIG_SPACE) / 4194304 |
||
116 | jb @f |
||
117 | mov dl, ((USER_DMA_BUFFER - PCIe_CONFIG_SPACE) / 4194304) - 1 |
||
118 | mov byte[mmio_pcie_cfg_pdes], dl |
||
1551 | art_zh | 119 | @@: |
1560 | art_zh | 120 | xor dx, dx ; PDEs counter |
121 | @@: |
||
122 | mov dword[ebx], eax ; map 4 buses |
||
1551 | art_zh | 123 | invlpg [ecx] ; next PgDir entry |
124 | add bx, 4 ; new PDE |
||
125 | add eax, 0x400000 ; +4M phys. |
||
126 | add ecx, 0x400000 ; +4M lin. |
||
1560 | art_zh | 127 | cmp dl, byte[mmio_pcie_cfg_pdes] |
128 | jnc .pcie_cfg_mapped |
||
129 | inc dl |
||
130 | jmp @b |
||
1551 | art_zh | 131 | .pcie_cfg_mapped: |
132 | mov esi, boot_pcie_ok |
||
133 | call boot_log |
||
1560 | art_zh | 134 | ret ; <<< OK >>> |
1551 | art_zh | 135 | .rs7xx_pcie_fail: |
136 | mov esi, boot_rs7xx_fail |
||
137 | call boot_log |
||
138 | ret |
||
139 | .rs7xx_pcie_blocked: |
||
140 | mov esi, boot_rs7xx_blkd |
||
141 | call boot_log |
||
1560 | art_zh | 142 | call pci_ext_config |
143 | jmp .addr_found |
||
144 | ret><><<>4M> |
||
1551 | art_zh | 145 |