http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.2.tar.gz
[rpld.git] / nics / dm9102 / dmfix.S,v
1 head    1.1;
2 access;
3 symbols;
4 locks
5         root:1.1; strict;
6 comment @# @;
7
8
9 1.1
10 date    2000.07.16.13.16.40;    author root;    state Exp;
11 branches;
12 next    ;
13
14
15 desc
16 @@
17
18
19 1.1
20 log
21 @#
22 @
23 text
24 @! Davicom Bootloader fixup, switches off the DAVICOM fast ethernet chip
25 ! before transfering control to the RPL'd image, so that the chip
26 ! doesn't scribble all over it while it relocates
27 !
28 ! This image needs 2k of memory, and can be loaded anywhere, after
29 ! it does its stuff it does jmp 0x9020:0x0
30 !
31
32 !
33 ! $Id: dmfix.S,v 1.4 1999/09/14 17:18:27 root Exp $ll rights reserved
34 !
35 !  Copyright (c) 1999, James McKenzie.
36 !                       All rights reserved
37 !  Copyright (c) 1999, Christopher Lightfoot.
38 !                       All rights reserved
39
40 !  By using this file, you agree to the terms and conditions set
41 !  forth in the LICENCE file which can be found at the top level of
42 !  the rpld distribution.
43
44 !  DAVICOM is a trademark of DAVICOM semiconductor inc.
45
46 !
47 !
48 ! $Log: dmfix.S,v $
49 ! Revision 1.4  1999/09/14 17:18:27  root
50 ! #
51 !
52 ! Revision 1.3  1999/09/13 12:32:26  root
53 ! #
54 !
55 ! Revision 1.2  1999/09/12 05:07:29  root
56 ! *** empty log message ***
57 !
58 !
59
60 ! Offsets into the PCI config space
61 #define PCI_VENDOR_ID                   0x00
62 #define PCI_DEVICE_ID                   0x02
63 #define PCI_HEADER_TYPE                 0x0e
64 #define PCI_BASE_ADDRESS_0              0x10
65
66 !PCI constants
67 #define PCI_BASE_ADDRESS_IO_MASK        0xfffc
68 #define PCI_VENDOR_ID_DAVICOM           0x1282
69 #define PCI_DEVICE_ID_DAVICOM_9102      0x9102
70
71
72 .globl begtext, begdata, begbss, endtext, enddata, endbss
73 .text
74 begtext:
75 .data
76 begdata:
77 .bss
78 begbss:
79 .text
80
81 entry start
82 start:
83         mov ax,cs
84         mov es,ax
85         mov ds,ax
86         mov ss,ax
87
88 ! Put the stack at us+2k
89         mov di,#0x800-12
90         mov sp,di
91
92 ! Say hello
93         lea si,hello
94         call prtstr
95         call print_nl
96
97         lea si,top
98         call prtstr
99         call print_nl
100
101 ! Scan the pci bus
102         mov byte (devfn),#0
103
104 dev_loop:
105                 mov bh, byte (devfn)            !Device number
106                 mov bl,#PCI_VENDOR_ID           !Offset into config space
107                 mov cl, byte (bus)              !Bus number
108                 call pci_read_config_word
109
110                 cmp ax,#0xffff
111                 beq dull
112                 cmp ax,#0x0000
113                 beq dull
114
115                         mov (vid),ax
116
117                         xor dh,dh       
118                         mov dl,byte (bus)
119         
120                         call print_2hex
121                         call print_sp   
122         
123                         mov dl, byte (devfn)
124                         sar dl,#3
125                         and dx,#0x1f
126         
127                         call print_2hex
128                         call print_sp
129         
130                         mov dl, byte (devfn)
131                         and dl,#7
132         
133                         call print_2hex
134                         call print_sp
135                 
136                         mov dx,(vid)
137                         call print_hex
138                         call print_sp
139         
140                         mov bh, byte (devfn)    !Device number
141                         mov bl,#PCI_DEVICE_ID   !Offset into config space
142                         mov cl,byte (bus)       !Bus number
143                         call pci_read_config_word
144         
145                         mov (did),ax
146                 
147                         mov dx,ax
148                         call print_hex
149                         call print_sp
150         
151                         mov bh, byte (devfn)  !Device number
152                         mov bl,#PCI_BASE_ADDRESS_0 !Offset into config space
153                         mov cl, byte (bus)      !Bus number
154                         call pci_read_config_word
155         
156                         and ax,#PCI_BASE_ADDRESS_IO_MASK
157                         mov (dad),ax
158         
159                         mov dx,ax
160                         call print_hex
161                         call print_sp
162         
163         
164                         cmp (vid),#PCI_VENDOR_ID_DAVICOM
165                         bne skipfix
166                         cmp (did),#PCI_DEVICE_ID_DAVICOM_9102
167                         bne skipfix
168         
169                                 mov dx,(dad) !Hit the Reset bit
170                                 in eax,dx
171                                 or eax,#1
172                                 out dx,eax
173                 
174                                 lea si,fixed
175                                 call prtstr
176         
177 skipfix:
178         
179         
180                         mov bh, byte (devfn)    !Device number
181                         mov bl,#PCI_HEADER_TYPE !Offset into config space
182                         mov cl,byte (bus)       !Bus number
183                         call pci_read_config_byte
184         
185                         and al,#0x80
186                         cmp al,#0x80
187                         beq multi
188                                 inc byte (devfn)
189                                 inc byte (devfn)
190                                 inc byte (devfn)
191                                 inc byte (devfn)
192                                 inc byte (devfn)
193                                 inc byte (devfn)
194                                 inc byte (devfn)
195 multi:
196
197                         call print_nl
198
199 dull:
200
201
202                 inc byte (devfn)
203                 mov dl, byte (devfn)
204                 cmp dl,#0
205                 beq dev_loop_skip
206                         br dev_loop
207 dev_loop_skip:
208
209         lea si,done
210         call prtstr
211         call print_nl
212
213 ! Hand over control to the linux 2ndary boot loader
214         jmp 0x9020:0x0
215
216
217 ! bh contains device_fn
218 ! bl conatins offset
219 ! cl contains the bus number
220
221
222 pci_read_config_word: 
223         push bx
224         and bl,#0xfc
225         mov ch,#0x80
226
227         mov (controldword),bx
228         mov (controldword+2),cx
229
230         mov eax,(controldword)
231         mov dx,#0xcf8
232         out dx,eax
233
234         pop dx
235         and dx,#0x2
236         add dx,#0xcfc
237
238         in ax,dx
239         ret
240
241 pci_read_config_byte: 
242         push bx
243         and bl,#0xfc
244         mov ch,#0x80
245
246         mov (controldword),bx
247         mov (controldword+2),cx
248
249         mov eax,(controldword)
250         mov dx,#0xcf8
251         out dx,eax
252
253         pop dx
254         and dx,#0x3
255         add dx,#0xcfc
256
257         in al,dx
258         ret
259
260
261 prtstr: 
262                 lodsb
263                 and     al,al
264                 jz      fin
265                 call    prtchr
266         jmp     prtstr
267 fin:    ret
268
269 prtchr: push    ax
270         push    cx
271         xor     bh,bh
272         mov     cx,#0x01
273         mov     ah,#0x0e
274         int     0x10
275         pop     cx
276         pop     ax
277         ret
278
279 print_hex:
280         mov     cx, #4          ! 4 hex digits
281 print_digit:
282         rol     dx, #4          ! rotate so that lowest 4 bits are used
283         mov     ax, #0xe0f      ! ah = request, al = mask for nybble
284         and     al, dl
285         add     al, #0x90       ! convert al to ascii hex (four instructions)
286         daa
287         adc     al, #0x40
288         daa
289         int     0x10
290         loop    print_digit
291         ret
292
293 print_2hex:
294         mov     cx, #2          ! 2 hex digits
295 print_2digit:
296         rol     dx, #4          ! rotate so that lowest 4 bits are used
297         mov     ax, #0xe0f      ! ah = request, al = mask for nybble
298         and     al, dl
299         add     al, #0x90       ! convert al to ascii hex (four instructions)
300         daa
301         adc     al, #0x40
302         daa
303         int     0x10
304         loop    print_2digit
305         ret
306
307 print_sp:
308         mov     ax, #0xe20      ! SP
309         int     0x10
310         ret
311
312 print_nl:
313         mov     ax, #0xe0d      ! CR
314         int     0x10
315         mov     al, #0xa        ! LF
316         int     0x10
317         ret
318
319 davicom_base:
320         .word   0x0
321 bus:
322         .byte   0x0
323 devfn:
324         .byte   0x0
325
326 controldword:
327         .word 0
328         .word 0
329 vid:
330         .word 0
331 did:
332         .word 0
333 dad:    
334         .word 0
335
336 hello:    .ascii  "DAVICOM killer (c) 1999 James McKenzie <james@@fishsoup.dhs.org>"
337                 db      0x00
338
339 top:    .ascii "Bs Sl Fn VID  DID  Window 0 base"
340         db 0x00
341 fixed:  .ascii "- FIXED"
342         db 0x00
343
344 done:   .ascii "Transfering control to linux secondary boot loader"
345         db 0x00
346
347 .text
348 endtext:
349 .data
350 enddata:
351 .bss
352 endbss:
353
354 @