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