Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2455 mario79 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
2288 clevermous 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 2455 $
9
 
10
 
11
;***************************************************************************
12
;
13
;  PCI CODE FOLLOWS
14
;
15
;  the following functions provide access to the PCI interface.
16
;  These functions are used by scan_bus, and also some ethernet drivers
17
;
18
;***************************************************************************
19
 
20
; PCI Bus defines
21
PCI_HEADER_TYPE             equ     0x0e  ;8 bit
22
PCI_BASE_ADDRESS_0          equ     0x10  ;32 bit
23
PCI_BASE_ADDRESS_5          equ     0x24  ;32 bits
24
PCI_BASE_ADDRESS_SPACE_IO   equ     0x01
25
PCI_VENDOR_ID               equ     0x00  ;16 bit
26
PCI_BASE_ADDRESS_IO_MASK    equ     0xFFFFFFFC
27
 
28
;***************************************************************************
29
;   Function
30
;      config_cmd
31
;
32
;   Description
33
;       creates a command dword  for use with the PCI bus
34
;       bus # in ebx
35
;      devfn in ecx
36
;       where in edx
37
;
38
;      command dword returned in eax
39
;       Only eax destroyed
40
;***************************************************************************
41
config_cmd:
42
        push    ecx
43
        mov     eax, ebx
44
        shl     eax, 16
45
        or      eax, 0x80000000
46
        shl     ecx, 8
47
        or      eax, ecx
48
        pop     ecx
49
        or      eax, edx
50
        and     eax, 0xFFFFFFFC
51
        ret
52
 
53
;***************************************************************************
54
;   Function
55
;      pcibios_read_config_byte
56
;
57
;   Description
58
;       reads a byte from the PCI config space
59
;       bus # in ebx
60
;      devfn in ecx
61
;       where in edx ( ls 16 bits significant )
62
;
63
;      byte returned in al ( rest of eax zero )
64
;       Only eax/edx destroyed
65
;***************************************************************************
66
pcibios_read_config_byte:
67
        call    config_cmd
68
        push    dx
69
        mov     dx, 0xCF8
70
        out     dx, eax
71
        pop     dx
72
 
73
        xor     eax, eax
74
        and     dx, 0x03
75
        add     dx, 0xCFC
76
;   and     dx, 0xFFC
77
        in      al, dx
78
        ret
79
 
80
;***************************************************************************
81
;   Function
82
;      pcibios_read_config_word
83
;
84
;   Description
85
;       reads a word from the PCI config space
86
;       bus # in ebx
87
;      devfn in ecx
88
;       where in edx ( ls 16 bits significant )
89
;
90
;      word returned in ax ( rest of eax zero )
91
;       Only eax/edx destroyed
92
;***************************************************************************
93
pcibios_read_config_word:
94
        call    config_cmd
95
        push    dx
96
        mov     dx, 0xCF8
97
        out     dx, eax
98
        pop     dx
99
 
100
        xor     eax, eax
101
        and     dx, 0x02
102
        add     dx, 0xCFC
103
;   and     dx, 0xFFC
104
        in      ax, dx
105
        ret
106
 
107
;***************************************************************************
108
;   Function
109
;      pcibios_read_config_dword
110
;
111
;   Description
112
;       reads a dword from the PCI config space
113
;       bus # in ebx
114
;      devfn in ecx
115
;       where in edx ( ls 16 bits significant )
116
;
117
;      dword returned in eax
118
;       Only eax/edx destroyed
119
;***************************************************************************
120
pcibios_read_config_dword:
121
        push    edx
122
        call    config_cmd
123
        push    dx
124
        mov     dx, 0xCF8
125
        out     dx, eax
126
        pop     dx
127
        xor     eax, eax
128
        mov     dx, 0xCFC
129
        in      eax, dx
130
        pop     edx
131
        ret
132
 
133
;***************************************************************************
134
;   Function
135
;      pcibios_write_config_byte
136
;
137
;   Description
138
;       write a byte in al to the PCI config space
139
;       bus # in ebx
140
;      devfn in ecx
141
;       where in edx ( ls 16 bits significant )
142
;
143
;       Only eax/edx destroyed
144
;***************************************************************************
145
pcibios_write_config_byte:
146
        push    ax
147
        call    config_cmd
148
        push    dx
149
        mov     dx, 0xCF8
150
        out     dx, eax
151
        pop     dx
152
        pop     ax
153
 
154
        and     dx, 0x03
155
        add     dx, 0xCFC
156
        out     dx, al
157
        ret
158
 
159
;***************************************************************************
160
;   Function
161
;      pcibios_write_config_word
162
;
163
;   Description
164
;       write a word in ax to the PCI config space
165
;       bus # in ebx
166
;      devfn in ecx
167
;       where in edx ( ls 16 bits significant )
168
;
169
;       Only eax/edx destroyed
170
;***************************************************************************
171
pcibios_write_config_word:
172
        push    ax
173
        call    config_cmd
174
        push    dx
175
        mov     dx, 0xCF8
176
        out     dx, eax
177
        pop     dx
178
        pop     ax
179
 
180
        and     dx, 0x02
181
        add     dx, 0xCFC
182
        out     dx, ax
183
        ret
184
 
185
;***************************************************************************
186
;   Function
187
;      delay_us
188
;
189
;   Description
190
;       delays for 30 to 60 us
191
;
192
;        I would prefer this routine to be able to delay for
193
;       a selectable number of microseconds, but this works for now.
194
;
195
;       If you know a better way to do 2us delay, pleae tell me!
196
;***************************************************************************
197
delay_us:
198
        push    eax
199
        push    ecx
200
 
201
        mov     ecx, 2
202
 
203
        in      al, 0x61
204
        and     al, 0x10
205
        mov     ah, al
206
        cld
207
 
208
dcnt1:
209
        in      al, 0x61
210
        and     al, 0x10
211
        cmp     al, ah
212
        jz      dcnt1
213
 
214
        mov     ah, al
215
        loop    dcnt1
216
 
217
        pop     ecx
218
        pop     eax
219
 
220
        ret
221
 
222
;***************************************************************************
223
;   Function
224
;      scan_bus
225
;
226
;   Description
227
;       Scans the PCI bus for a supported device
228
;        If a supported device is found, the drvr_ variables are initialised
229
;       to that drivers functions ( as defined in the PCICards table)
230
;
231
;        io_addr   holds card I/O space. 32 bit, but only LS 16 bits valid
232
;        pci_data  holds the PCI vendor + device code
233
;       pci_dev   holds PCI bus dev #
234
;       pci_bus   holds PCI bus #
235
;
236
;        io_addr will be zero if no card found
237
;
238
;***************************************************************************
239
scan_bus:
240
        xor     eax, eax
241
        mov     [hdrtype], al
242
        mov     [pci_data], eax
243
 
244
        xor     ebx, ebx     ; ebx = bus# 0 .. 255
245
 
246
sb_bus_loop:
247
        xor     ecx, ecx     ; ecx = devfn# 0 .. 254  ( not 255? )
248
 
249
sb_devf_loop:
250
        mov     eax, ecx
251
        and     eax, 0x07
252
 
253
        cmp     eax, 0
254
        jne     sb_001
255
 
256
        mov     edx, PCI_HEADER_TYPE
257
        call    pcibios_read_config_byte
258
        mov     [hdrtype], al
259
        jmp     sb_002
260
 
261
sb_001:
262
        mov     al, [hdrtype]
263
        and     al, 0x80
264
        cmp     al, 0x80
265
        jne     sb_inc_devf
266
 
267
sb_002:
268
        mov     edx, PCI_VENDOR_ID
269
        call    pcibios_read_config_dword
270
        mov     [vendor_device], eax
271
        cmp     eax, 0xffffffff
272
        je      sb_empty
273
        cmp     eax, 0
274
        jne     sb_check_vendor
275
 
276
sb_empty:
277
        mov     [hdrtype], byte 0
278
        jmp     sb_inc_devf
279
 
280
sb_check_vendor:
281
    ; iterate though PCICards until end or match found
282
        mov     esi, PCICards
283
 
284
sb_check:
285
        cmp     [esi], dword 0
286
        je      sb_inc_devf            ; Quit if at last entry
287
        cmp     eax, [esi]
288
        je      sb_got_card
289
        add     esi, PCICARDS_ENTRY_SIZE
290
        jmp     sb_check
291
 
292
sb_got_card:
293
    ; indicate that we have found the card
294
        mov     [pci_data], eax
295
        mov     [pci_dev], ecx
296
        mov     [pci_bus], ebx
297
 
298
    ; Define the driver functions
299
        push    eax
300
        mov     eax, [esi+4]
301
        mov     [drvr_probe], eax
302
        mov     eax, [esi+8]
303
        mov     [drvr_reset], eax
304
        mov     eax, [esi+12]
305
        mov     [drvr_poll], eax
306
        mov     eax, [esi+16]
307
        mov     [drvr_transmit], eax
308
        mov     eax, [esi+20]
309
        mov     [drvr_cable], eax
310
        pop     eax
311
 
312
        mov     edx, PCI_BASE_ADDRESS_0
313
 
314
sb_reg_check:
315
        call    pcibios_read_config_dword
316
        mov     [io_addr], eax
317
        and     eax, PCI_BASE_ADDRESS_IO_MASK
318
        cmp     eax, 0
319
        je      sb_inc_reg
320
        mov     eax, [io_addr]
321
        and     eax, PCI_BASE_ADDRESS_SPACE_IO
322
        cmp     eax, 0
323
        je      sb_inc_reg
324
 
325
        mov     eax, [io_addr]
326
        and     eax, PCI_BASE_ADDRESS_IO_MASK
327
        mov     [io_addr], eax
328
 
329
sb_exit1:
330
        ret
331
 
332
sb_inc_reg:
333
        add     edx, 4
334
        cmp     edx, PCI_BASE_ADDRESS_5
335
        jbe     sb_reg_check
336
 
337
sb_inc_devf:
338
        inc     ecx
339
        cmp     ecx, 255
340
        jb      sb_devf_loop
341
        inc     ebx
342
        cmp     ebx, 256
343
        jb      sb_bus_loop
344
 
345
    ; We get here if we didn't find our card
346
    ; set io_addr to 0 as an indication
347
        xor     eax, eax
348
        mov     [io_addr], eax
349
 
350
sb_exit2:
351
        ret