Subversion Repositories Kolibri OS

Rev

Rev 387 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ha 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                           ;;
3
;;  PCI32.INC                                                ;;
4
;;                                                           ;;
5
;;  32 bit PCI driver code                                   ;;
6
;;                                                           ;;
7
;;  Version 0.2  December 21st, 2002                         ;;
8
;;                                                           ;;
9
;;  Author: Victor Prodan, victorprodan@yahoo.com            ;;
10
;;    Credits:                                               ;;
11
;;          Ralf Brown                                       ;;
12
;;          Mike Hibbett, mikeh@oceanfree.net                ;;
13
;;                                                           ;;
14
;;  See file COPYING for details                             ;;
15
;;                                                           ;;
16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17
 
18
 
19
;***************************************************************************
20
;   Function
21
;      pci_api:
22
;
23
;   Description
24
;       entry point for system PCI calls
25
;***************************************************************************
26
 
27
align 4
28
 
29
pci_api:
30
 
31
        cmp  [pci_access_enabled],1
32
        jne  no_pci_access_for_applications
33
 
34
        or al,al
35
        jnz pci_fn_1
36
        ; PCI function 0: get pci version (AH.AL)
417 serge 37
        movzx eax,word [BOOT_VAR+0x9022]
1 ha 38
        ret
39
 
40
pci_fn_1:
41
        cmp al,1
42
        jnz pci_fn_2
43
 
44
        ; PCI function 1: get last bus in AL
417 serge 45
        mov al,[BOOT_VAR+0x9021]
1 ha 46
        ret
47
 
48
pci_fn_2:
49
        cmp al,2
50
        jne pci_fn_3
51
        ; PCI function 2: get pci access mechanism
417 serge 52
        mov al,[BOOT_VAR+0x9020]
1 ha 53
        ret
54
pci_fn_3:
55
 
56
        cmp al,4
57
        jz pci_read_reg   ;byte
58
        cmp al,5
59
        jz pci_read_reg   ;word
60
        cmp al,6
61
        jz pci_read_reg   ;dword
62
 
63
        cmp al,8
64
        jz pci_write_reg  ;byte
65
        cmp al,9
66
        jz pci_write_reg  ;word
67
        cmp al,10
68
        jz pci_write_reg  ;dword
69
 
70
      no_pci_access_for_applications:
71
 
72
        mov eax,-1
73
 
74
        ret
75
 
76
;***************************************************************************
77
;   Function
78
;      pci_make_config_cmd
79
;
80
;   Description
81
;       creates a command dword  for use with the PCI bus
82
;       bus # in ah
83
;       device+func in bh (dddddfff)
84
;       register in bl
85
;
86
;      command dword returned in eax ( 10000000 bbbbbbbb dddddfff rrrrrr00 )
87
;***************************************************************************
88
 
89
align 4
90
 
91
pci_make_config_cmd:
92
    shl     eax,8          ; move bus to bits 16-23
93
    mov     ax,bx          ; combine all
94
    and     eax,0xffffff
95
    or      eax,0x80000000
96
    ret
97
 
98
;***************************************************************************
99
;   Function
100
;      pci_read_reg:
101
;
102
;   Description
103
;       read a register from the PCI config space into EAX/AX/AL
104
;       IN: ah=bus,device+func=bh,register address=bl
105
;           number of bytes to read (1,2,4) coded into AL, bits 0-1
106
;***************************************************************************
107
 
108
align 4
109
 
110
pci_read_reg:
417 serge 111
        cmp     byte [BOOT_VAR+0x9020],2 ;what mechanism will we use?
1 ha 112
        je      pci_read_reg_2
113
 
114
                ; mechanism 1
115
        push    esi   ; save register size into ESI
116
        mov     esi,eax
117
        and     esi,3
118
 
119
        call    pci_make_config_cmd
120
        mov     ebx,eax
121
                ; get current state
122
        mov     dx,0xcf8
123
        in      eax, dx
124
        push    eax
125
                ; set up addressing to config data
126
        mov     eax,ebx
127
        and     al,0xfc ; make address dword-aligned
128
        out     dx,eax
129
                ; get requested DWORD of config data
130
        mov     dl,0xfc
131
        and     bl,3
132
        or      dl,bl    ; add to port address first 2 bits of register address
133
 
134
        or      esi,esi
135
        jz      pci_read_byte1
136
        cmp     esi,1
137
        jz      pci_read_word1
138
        cmp     esi,2
139
        jz      pci_read_dword1
140
        jmp     pci_fin_read1
141
 
142
pci_read_byte1:
143
        in      al,dx
144
        jmp pci_fin_read1
145
pci_read_word1:
146
        in      ax,dx
147
        jmp pci_fin_read1
148
pci_read_dword1:
149
        in      eax,dx
150
        jmp     pci_fin_read1
151
pci_fin_read1:
152
                ; restore configuration control
153
        xchg    eax,[esp]
154
        mov     dx,0xcf8
155
        out     dx,eax
156
 
157
        pop     eax
158
        pop     esi
159
        ret
160
pci_read_reg_2:
161
 
162
        test    bh,128  ;mech#2 only supports 16 devices per bus
163
        jnz     pci_read_reg_err
164
 
165
        push esi   ; save register size into ESI
166
        mov esi,eax
167
        and esi,3
168
 
169
        push    eax
170
                ;store current state of config space
171
        mov     dx,0xcf8
172
        in      al,dx
173
        mov     ah,al
174
        mov     dl,0xfa
175
        in      al,dx
176
 
177
        xchg    eax,[esp]
178
                ; out 0xcfa,bus
179
        mov     al,ah
180
        out     dx,al
181
                ; out 0xcf8,0x80
182
        mov     dl,0xf8
183
        mov     al,0x80
184
        out     dx,al
185
                ; compute addr
186
        shr     bh,3 ; func is ignored in mechanism 2
187
        or      bh,0xc0
188
        mov     dx,bx
189
 
190
        or      esi,esi
191
        jz      pci_read_byte2
192
        cmp     esi,1
193
        jz      pci_read_word2
194
        cmp     esi,2
195
        jz      pci_read_dword2
196
        jmp     pci_fin_read2
197
 
198
pci_read_byte2:
199
        in      al,dx
200
        jmp pci_fin_read2
201
pci_read_word2:
202
        in      ax,dx
203
        jmp pci_fin_read2
204
pci_read_dword2:
205
        in      eax,dx
206
;       jmp pci_fin_read2
207
pci_fin_read2:
208
 
209
                ; restore configuration space
210
        xchg    eax,[esp]
211
        mov     dx,0xcfa
212
        out     dx,al
213
        mov     dl,0xf8
214
        mov     al,ah
215
        out     dx,al
216
 
217
        pop     eax
218
        pop     esi
219
        ret
220
 
221
pci_read_reg_err:
222
        xor     eax,eax
223
        dec     eax
224
        ret
225
 
226
 
227
;***************************************************************************
228
;   Function
229
;      pci_write_reg:
230
;
231
;   Description
232
;       write a register from ECX/CX/CL into the PCI config space
233
;       IN: ah=bus,device+func=bh,register address (dword aligned)=bl,
234
;           value to write in ecx
235
;           number of bytes to write (1,2,4) coded into AL, bits 0-1
236
;***************************************************************************
237
 
238
align 4
239
 
240
pci_write_reg:
417 serge 241
        cmp byte [BOOT_VAR+0x9020],2 ;what mechanism will we use?
1 ha 242
        je pci_write_reg_2
243
 
244
                ; mechanism 1
245
        push    esi   ; save register size into ESI
246
        mov     esi,eax
247
        and     esi,3
248
 
249
        call    pci_make_config_cmd
250
        mov     ebx,eax
251
                ; get current state into ecx
252
        mov     dx,0xcf8
253
        in      eax, dx
254
        push    eax
255
                ; set up addressing to config data
256
        mov     eax,ebx
257
        and     al,0xfc ; make address dword-aligned
258
        out     dx,eax
259
                ; write DWORD of config data
260
        mov     dl,0xfc
261
        and     bl,3
262
        or      dl,bl
263
        mov     eax,ecx
264
 
265
        or      esi,esi
266
        jz      pci_write_byte1
267
        cmp     esi,1
268
        jz      pci_write_word1
269
        cmp     esi,2
270
        jz      pci_write_dword1
271
        jmp     pci_fin_write1
272
 
273
pci_write_byte1:
274
        out     dx,al
275
        jmp pci_fin_write1
276
pci_write_word1:
277
        out     dx,ax
278
        jmp pci_fin_write1
279
pci_write_dword1:
280
        out     dx,eax
281
        jmp     pci_fin_write1
282
pci_fin_write1:
283
 
284
                ; restore configuration control
285
        pop     eax
286
        mov     dl,0xf8
287
        out     dx,eax
288
 
289
        xor     eax,eax
290
        pop     esi
291
 
292
        ret
293
pci_write_reg_2:
294
 
295
        test    bh,128  ;mech#2 only supports 16 devices per bus
296
        jnz     pci_write_reg_err
297
 
298
 
299
        push esi   ; save register size into ESI
300
        mov esi,eax
301
        and esi,3
302
 
303
        push    eax
304
                ;store current state of config space
305
        mov     dx,0xcf8
306
        in      al,dx
307
        mov     ah,al
308
        mov     dl,0xfa
309
        in      al,dx
310
        xchg    eax,[esp]
311
                ; out 0xcfa,bus
312
        mov     al,ah
313
        out     dx,al
314
                ; out 0xcf8,0x80
315
        mov     dl,0xf8
316
        mov     al,0x80
317
        out     dx,al
318
                ; compute addr
319
        shr     bh,3 ; func is ignored in mechanism 2
320
        or      bh,0xc0
321
        mov     dx,bx
322
                ; write register
323
        mov     eax,ecx
324
 
325
        or      esi,esi
326
        jz      pci_write_byte2
327
        cmp     esi,1
328
        jz      pci_write_word2
329
        cmp     esi,2
330
        jz      pci_write_dword2
331
        jmp     pci_fin_write2
332
 
333
pci_write_byte2:
334
        out     dx,al
335
        jmp pci_fin_write2
336
pci_write_word2:
337
        out     dx,ax
338
        jmp pci_fin_write2
339
pci_write_dword2:
340
        out     dx,eax
341
        jmp     pci_fin_write2
342
pci_fin_write2:
343
                ; restore configuration space
344
        pop     eax
345
        mov     dx,0xcfa
346
        out     dx,al
347
        mov     dl,0xf8
348
        mov     al,ah
349
        out     dx,al
350
 
351
        xor     eax,eax
352
        pop     esi
353
        ret
354
 
355
pci_write_reg_err:
356
        xor     eax,eax
357
        dec     eax
358
        ret