Subversion Repositories Kolibri OS

Rev

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 ?