Subversion Repositories Kolibri OS

Rev

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