Rev 5363 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2900 | hidnplayr | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
5363 | yogev_ezra | 3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
2900 | hidnplayr | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;; simple AGP driver for KolibriOS ;; |
||
7 | ;; ;; |
||
8 | ;; Written by hidnplayr@kolibrios.org ;; |
||
9 | ;; ;; |
||
10 | ;; GNU GENERAL PUBLIC LICENSE ;; |
||
11 | ;; Version 2, June 1991 ;; |
||
12 | ;; ;; |
||
13 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
2899 | hidnplayr | 14 | |
15 | |||
5066 | hidnplayr | 16 | format PE DLL native |
17 | entry START |
||
2899 | hidnplayr | 18 | |
5066 | hidnplayr | 19 | CURRENT_API = 0x0200 |
20 | COMPATIBLE_API = 0x0100 |
||
21 | API_VERSION = (COMPATIBLE_API shl 16) + CURRENT_API |
||
2899 | hidnplayr | 22 | |
5066 | hidnplayr | 23 | FAST_WRITE = 0 ; may cause problems with some motherboards |
2899 | hidnplayr | 24 | |
5066 | hidnplayr | 25 | section '.flat' readable writable executable |
2899 | hidnplayr | 26 | |
5066 | hidnplayr | 27 | include '../proc32.inc' |
28 | include '../struct.inc' |
||
29 | include '../macros.inc' |
||
5074 | hidnplayr | 30 | include '../pci.inc' |
2899 | hidnplayr | 31 | |
5066 | hidnplayr | 32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
33 | ;; ;; |
||
34 | ;; proc START ;; |
||
35 | ;; ;; |
||
36 | ;; (standard driver proc) ;; |
||
37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
2899 | hidnplayr | 38 | |
5066 | hidnplayr | 39 | proc START c, reason:dword, cmdline:dword |
2899 | hidnplayr | 40 | |
5066 | hidnplayr | 41 | cmp [reason], DRV_ENTRY |
42 | jne .fail |
||
2899 | hidnplayr | 43 | |
5066 | hidnplayr | 44 | mov esi, msgInit |
45 | invoke SysMsgBoardStr |
||
46 | invoke RegService, my_service, service_proc |
||
2900 | hidnplayr | 47 | |
5066 | hidnplayr | 48 | call detect |
2899 | hidnplayr | 49 | |
5066 | hidnplayr | 50 | ret |
2899 | hidnplayr | 51 | |
5066 | hidnplayr | 52 | .fail: |
2899 | hidnplayr | 53 | xor eax, eax |
54 | ret |
||
5066 | hidnplayr | 55 | |
2899 | hidnplayr | 56 | endp |
57 | |||
5066 | hidnplayr | 58 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
59 | ;; ;; |
||
60 | ;; proc SERVICE_PROC ;; |
||
61 | ;; ;; |
||
62 | ;; (standard driver proc) ;; |
||
63 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
2899 | hidnplayr | 64 | |
65 | proc service_proc stdcall, ioctl:dword |
||
66 | |||
5066 | hidnplayr | 67 | mov edx, [ioctl] |
68 | mov eax, [edx + IOCTL.io_code] |
||
2899 | hidnplayr | 69 | |
5066 | hidnplayr | 70 | ;------------------------------------------------------ |
71 | |||
72 | cmp eax, 0 ;SRV_GETVERSION |
||
2899 | hidnplayr | 73 | jne .fail |
5066 | hidnplayr | 74 | |
75 | cmp [edx + IOCTL.out_size], 4 |
||
76 | jb .fail |
||
77 | mov eax, [edx + IOCTL.output] |
||
2899 | hidnplayr | 78 | mov [eax], dword API_VERSION |
5066 | hidnplayr | 79 | |
2899 | hidnplayr | 80 | xor eax, eax |
81 | ret |
||
5066 | hidnplayr | 82 | |
83 | .fail: |
||
2899 | hidnplayr | 84 | or eax, -1 |
85 | ret |
||
5066 | hidnplayr | 86 | |
2899 | hidnplayr | 87 | endp |
88 | |||
89 | align 4 |
||
90 | proc detect |
||
91 | |||
2901 | hidnplayr | 92 | mov esi, msgSearch |
5066 | hidnplayr | 93 | invoke SysMsgBoardStr |
2901 | hidnplayr | 94 | |
5544 | hidnplayr | 95 | invoke GetPCIList |
96 | mov edx, eax |
||
2899 | hidnplayr | 97 | |
5544 | hidnplayr | 98 | .loop: |
99 | mov ebx, [eax + PCIDEV.class] |
||
100 | cmp bx, 0x0300 ; display controller - vga compatible controller |
||
2901 | hidnplayr | 101 | je .found |
5544 | hidnplayr | 102 | cmp bx, 0x0302 ; display controller - 3d controller |
2899 | hidnplayr | 103 | je .found |
5544 | hidnplayr | 104 | cmp bx, 0x0380 ; display controller - other display controller |
2899 | hidnplayr | 105 | je .found |
106 | |||
107 | .next: |
||
5544 | hidnplayr | 108 | mov eax, [eax + PCIDEV.fd] |
109 | cmp eax, edx |
||
110 | jne .loop |
||
2900 | hidnplayr | 111 | |
5544 | hidnplayr | 112 | mov esi, msgDone |
5066 | hidnplayr | 113 | invoke SysMsgBoardStr |
2900 | hidnplayr | 114 | |
5544 | hidnplayr | 115 | or eax, -1 |
2899 | hidnplayr | 116 | ret |
117 | |||
118 | .found: |
||
5544 | hidnplayr | 119 | push eax edx |
120 | movzx ebx, [eax + PCIDEV.bus] |
||
121 | mov [bus], ebx |
||
122 | movzx ebx, [eax + PCIDEV.devfn] |
||
123 | mov [devfn], ebx |
||
5066 | hidnplayr | 124 | invoke PciRead8, [bus], [devfn], PCI_header00.prog_if |
2899 | hidnplayr | 125 | test al, 1 shl 4 ; got capabilities list? |
126 | jnz .got_capabilities_list |
||
127 | |||
2900 | hidnplayr | 128 | ; TODO: Do it the old way: detect device and check with a list of known capabilities |
129 | ; stupid pre PCI 2.2 board.... |
||
130 | |||
5544 | hidnplayr | 131 | pop edx eax |
2900 | hidnplayr | 132 | jmp .next |
133 | |||
2899 | hidnplayr | 134 | .got_capabilities_list: |
5066 | hidnplayr | 135 | invoke PciRead8, [bus], [devfn], PCI_header00.cap_ptr |
2899 | hidnplayr | 136 | and eax, 11111100b ; always dword aligned |
2901 | hidnplayr | 137 | mov edi, eax |
2899 | hidnplayr | 138 | |
139 | .read_capability: |
||
5066 | hidnplayr | 140 | invoke PciRead32, [bus], [devfn], edi ; read capability |
2899 | hidnplayr | 141 | cmp al, 0x02 ; AGP |
142 | je .got_agp |
||
2901 | hidnplayr | 143 | movzx edi, ah ; pointer to next capability |
144 | test edi, edi |
||
2899 | hidnplayr | 145 | jnz .read_capability |
2900 | hidnplayr | 146 | jmp .next |
2899 | hidnplayr | 147 | |
148 | .got_agp: |
||
2901 | hidnplayr | 149 | shr eax, 16 |
2899 | hidnplayr | 150 | mov [revision], al ; high nibble = major revision |
151 | ; low nibble = minor revision |
||
2901 | hidnplayr | 152 | add edi, 4 |
2899 | hidnplayr | 153 | and al, 0xf0 |
154 | cmp al, 0x30 |
||
155 | je .agp_3 |
||
156 | |||
157 | .agp_2: |
||
2901 | hidnplayr | 158 | mov esi, msgAGP2 |
5066 | hidnplayr | 159 | invoke SysMsgBoardStr |
2901 | hidnplayr | 160 | |
5066 | hidnplayr | 161 | invoke PciRead32, [bus], [devfn], edi ; read AGP status |
2901 | hidnplayr | 162 | .agp_2_: |
2899 | hidnplayr | 163 | test al, 100b |
164 | jnz .100b |
||
165 | test al, 10b |
||
166 | jnz .010b |
||
167 | test al, 1b |
||
168 | |||
5544 | hidnplayr | 169 | pop edx eax |
170 | jz .next |
||
171 | |||
2899 | hidnplayr | 172 | .001b: |
2900 | hidnplayr | 173 | mov [cmd], 001b |
2901 | hidnplayr | 174 | mov esi, msg1 |
5066 | hidnplayr | 175 | invoke SysMsgBoardStr |
2899 | hidnplayr | 176 | jmp .agp_go |
177 | |||
178 | .010b: |
||
2900 | hidnplayr | 179 | mov [cmd], 010b |
2901 | hidnplayr | 180 | mov esi, msg2 |
5066 | hidnplayr | 181 | invoke SysMsgBoardStr |
2899 | hidnplayr | 182 | jmp .agp_go |
183 | |||
184 | .100b: |
||
2900 | hidnplayr | 185 | mov [cmd], 100b |
2901 | hidnplayr | 186 | mov esi, msg4 |
5066 | hidnplayr | 187 | invoke SysMsgBoardStr |
2899 | hidnplayr | 188 | jmp .agp_go |
189 | |||
2901 | hidnplayr | 190 | .agp_2m: |
191 | mov esi, msgAGP2m |
||
5066 | hidnplayr | 192 | invoke SysMsgBoardStr |
2901 | hidnplayr | 193 | jmp .agp_2_ |
194 | |||
2899 | hidnplayr | 195 | .agp_3: |
2901 | hidnplayr | 196 | mov esi, msgAGP3 |
5066 | hidnplayr | 197 | invoke SysMsgBoardStr |
2901 | hidnplayr | 198 | |
5066 | hidnplayr | 199 | invoke PciRead32, [bus], [devfn], edi ; read AGP status |
2899 | hidnplayr | 200 | test al, 1 shl 3 |
2901 | hidnplayr | 201 | jz .agp_2m |
2902 | hidnplayr | 202 | |
2901 | hidnplayr | 203 | test eax, 10b |
204 | jnz .8x |
||
205 | mov [cmd], 01b |
||
206 | mov esi, msg4 |
||
5066 | hidnplayr | 207 | invoke SysMsgBoardStr |
2901 | hidnplayr | 208 | jmp .agp_go |
209 | |||
210 | .8x: |
||
2900 | hidnplayr | 211 | mov [cmd], 10b |
2901 | hidnplayr | 212 | mov esi, msg8 |
5066 | hidnplayr | 213 | invoke SysMsgBoardStr |
2899 | hidnplayr | 214 | |
215 | .agp_go: |
||
2900 | hidnplayr | 216 | |
217 | if FAST_WRITE |
||
218 | test ax, 1 shl 4 |
||
219 | jz @f |
||
220 | or [cmd], 1 shl 4 |
||
2901 | hidnplayr | 221 | mov esi, msgfast |
5066 | hidnplayr | 222 | invoke SysMsgBoardStr |
2900 | hidnplayr | 223 | @@: |
224 | end if |
||
2902 | hidnplayr | 225 | |
226 | test ax, 1 shl 9 ; Side band addressing |
||
2900 | hidnplayr | 227 | jz @f |
228 | or [cmd], 1 shl 9 |
||
2901 | hidnplayr | 229 | mov esi, msgside |
5066 | hidnplayr | 230 | invoke SysMsgBoardStr |
2900 | hidnplayr | 231 | @@: |
2902 | hidnplayr | 232 | |
2901 | hidnplayr | 233 | add edi, 4 |
2900 | hidnplayr | 234 | mov eax, [cmd] |
2899 | hidnplayr | 235 | or eax, 1 shl 8 ; enable AGP |
5066 | hidnplayr | 236 | invoke PciWrite32, [bus], [devfn], edi, eax ; write AGP cmd |
2899 | hidnplayr | 237 | |
2900 | hidnplayr | 238 | mov esi, msgOK |
5066 | hidnplayr | 239 | invoke SysMsgBoardStr |
2900 | hidnplayr | 240 | |
5544 | hidnplayr | 241 | pop edx eax |
242 | jmp .next |
||
2899 | hidnplayr | 243 | |
244 | endp |
||
245 | |||
246 | |||
5066 | hidnplayr | 247 | ; End of code |
2899 | hidnplayr | 248 | |
5066 | hidnplayr | 249 | data fixups |
250 | end data |
||
2899 | hidnplayr | 251 | |
5066 | hidnplayr | 252 | include '../peimport.inc' |
253 | |||
2899 | hidnplayr | 254 | my_service db 'AGP', 0 ; max 16 chars include zero |
255 | |||
2901 | hidnplayr | 256 | msgInit db 'AGP driver loaded.', 13, 10, 0 |
257 | msgSearch db 'Searching for AGP card...', 13, 10, 0 |
||
5544 | hidnplayr | 258 | msgDone db 'Done', 13, 10, 0 |
2900 | hidnplayr | 259 | msgOK db 'AGP device enabled', 13, 10, 0 |
2901 | hidnplayr | 260 | msgAGP2 db 'AGP2 device found', 13, 10, 0 |
261 | msgAGP3 db 'AGP3 device found', 13, 10, 0 |
||
262 | msgAGP2m db 'Running in AGP2 mode', 13, 10, 0 |
||
263 | msg8 db '8x speed', 13, 10, 0 |
||
264 | msg4 db '4x speed', 13, 10, 0 |
||
265 | msg2 db '2x speed', 13, 10, 0 |
||
266 | msg1 db '1x speed', 13, 10, 0 |
||
267 | msgfast db 'Fast Write', 13, 10, 0 |
||
268 | msgside db 'Side band addressing', 13, 10, 0 |
||
2899 | hidnplayr | 269 | |
2900 | hidnplayr | 270 | ; uninitialized data |
2899 | hidnplayr | 271 | |
272 | revision db ? |
||
2900 | hidnplayr | 273 | cmd dd ? |
2899 | hidnplayr | 274 | bus dd ? |
275 | devfn dd ? |
||
276 |