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