MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / arch / arm / kernel / debug.S
blob3e87972baf0a9d6eab0cec232ca266f0f68b5897
1 /*
2  *  linux/arch/arm/kernel/debug-armv.S
3  *
4  *  Copyright (C) 1994-1999 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  *  32-bit debugging code
11  */
12 #include <linux/config.h>
13 #include <linux/linkage.h>
14 #include <asm/hardware.h>
16                 .text
19  * Some debugging routines (useful if you've got MM problems and
20  * printk isn't working).  For DEBUGGING ONLY!!!  Do not leave
21  * references to these in a production kernel!
22  */
23 #if defined(CONFIG_ARCH_RPC)
24                 .macro  addruart,rx
25                 mov     \rx, #0xe0000000
26                 orr     \rx, \rx, #0x00010000
27                 orr     \rx, \rx, #0x00000fe0
28                 .endm
30                 .macro  senduart,rd,rx
31                 strb    \rd, [\rx]
32                 .endm
34                 .macro  busyuart,rd,rx
35 1001:           ldrb    \rd, [\rx, #0x14]
36                 and     \rd, \rd, #0x60
37                 teq     \rd, #0x60
38                 bne     1001b
39                 .endm
41                 .macro  waituart,rd,rx
42 1001:           ldrb    \rd, [\rx, #0x18]
43                 tst     \rd, #0x10
44                 beq     1001b
45                 .endm
47 #elif defined(CONFIG_DEBUG_ICEDCC)
48                 @@ debug using ARM EmbeddedICE DCC channel
49                 .macro  addruart, rx
50                 .endm
52                 .macro  senduart, rd, rx
53                 mcr     p14, 0, \rd, c1, c0, 0
54                 .endm
56                 .macro  busyuart, rd, rx
57 1001:
58                 mrc     p14, 0, \rx, c0, c0, 0
59                 tst     \rx, #2
60                 beq     1001b
62                 .endm
64                 .macro  waituart, rd, rx
65                 mov     \rd, #0x2000000
66 1001:
67                 subs    \rd, \rd, #1
68                 bmi     1002f
69                 mrc     p14, 0, \rx, c0, c0, 0
70                 tst     \rx, #2
71                 bne     1001b
72 1002:
73                 .endm
75 #elif defined(CONFIG_ARCH_EBSA110)
76                 .macro  addruart,rx
77                 mov     \rx, #0xf0000000
78                 orr     \rx, \rx, #0x00000be0
79                 .endm
81                 .macro  senduart,rd,rx
82                 strb    \rd, [\rx]
83                 .endm
85                 .macro  busyuart,rd,rx
86 1002:           ldrb    \rd, [\rx, #0x14]
87                 and     \rd, \rd, #0x60
88                 teq     \rd, #0x60
89                 bne     1002b
90                 .endm
92                 .macro  waituart,rd,rx
93 1001:           ldrb    \rd, [\rx, #0x18]
94                 tst     \rd, #0x10
95                 beq     1001b
96                 .endm
97         
98 #elif defined(CONFIG_ARCH_SHARK)
99                 .macro  addruart,rx
100                 mov     \rx, #0xe0000000
101                 orr     \rx, \rx, #0x000003f8
102                 .endm
104                 .macro  senduart,rd,rx
105                 strb    \rd, [\rx]
106                 .endm
108                 .macro  busyuart,rd,rx
109                 mov     \rd, #0
110 1001:           add     \rd, \rd, #1
111                 teq     \rd, #0x10000
112                 bne     1001b
113                 .endm
115                 .macro  waituart,rd,rx
116                 .endm
118 #elif defined(CONFIG_FOOTBRIDGE)
120 #include <asm/hardware/dec21285.h>
122 #ifndef CONFIG_DEBUG_DC21285_PORT
123         /* For NetWinder debugging */
124                 .macro  addruart,rx
125                 mrc     p15, 0, \rx, c1, c0
126                 tst     \rx, #1                 @ MMU enabled?
127                 moveq   \rx, #0x7c000000        @ physical
128                 movne   \rx, #0xff000000        @ virtual
129                 orr     \rx, \rx, #0x000003f8
130                 .endm
132                 .macro  senduart,rd,rx
133                 strb    \rd, [\rx]
134                 .endm
136                 .macro  busyuart,rd,rx
137 1002:           ldrb    \rd, [\rx, #0x5]
138                 and     \rd, \rd, #0x60
139                 teq     \rd, #0x60
140                 bne     1002b
141                 .endm
143                 .macro  waituart,rd,rx
144 1001:           ldrb    \rd, [\rx, #0x6]
145                 tst     \rd, #0x10
146                 beq     1001b
147                 .endm
148 #else
149         /* For EBSA285 debugging */
150                 .equ    dc21285_high, ARMCSR_BASE & 0xff000000
151                 .equ    dc21285_low,  ARMCSR_BASE & 0x00ffffff
153                 .macro  addruart,rx
154                 mov     \rx, #dc21285_high
155                 .if     dc21285_low
156                 orr     \rx, \rx, #dc21285_low
157                 .endif
158                 .endm
160                 .macro  senduart,rd,rx
161                 str     \rd, [\rx, #0x160]      @ UARTDR
162                 .endm
164                 .macro  busyuart,rd,rx
165 1001:           ldr     \rd, [\rx, #0x178]      @ UARTFLG
166                 tst     \rd, #1 << 3
167                 bne     1001b
168                 .endm
170                 .macro  waituart,rd,rx
171                 .endm
172 #endif
173 #elif defined(CONFIG_ARCH_FTVPCI)
174                 .macro  addruart,rx
175                 mrc     p15, 0, \rx, c1, c0
176                 tst     \rx, #1                 @ MMU enabled?
177                 movne   \rx, #0xe0000000
178                 moveq   \rx, #0x10000000
179                 .endm
181                 .macro  senduart,rd,rx
182                 str     \rd, [\rx, #0xc]
183                 .endm
185                 .macro  busyuart,rd,rx
186 1001:           ldr     \rd, [\rx, #0x4]
187                 tst     \rd, #1 << 2
188                 beq     1001b
189                 .endm
191                 .macro  waituart,rd,rx
192                 .endm
194 #elif defined(CONFIG_ARCH_SA1100)
196                 .macro  addruart,rx
197                 mrc     p15, 0, \rx, c1, c0
198                 tst     \rx, #1                 @ MMU enabled?
199                 moveq   \rx, #0x80000000        @ physical base address
200                 movne   \rx, #0xf8000000        @ virtual address
202                 @ We probe for the active serial port here, coherently with
203                 @ the comment in include/asm-arm/arch-sa1100/uncompress.h.
204                 @ We assume r1 can be clobbered.
206                 @ see if Ser3 is active
207                 add     \rx, \rx, #0x00050000
208                 ldr     r1, [\rx, #UTCR3]
209                 tst     r1, #UTCR3_TXE
211                 @ if Ser3 is inactive, then try Ser1
212                 addeq   \rx, \rx, #(0x00010000 - 0x00050000)
213                 ldreq   r1, [\rx, #UTCR3]
214                 tsteq   r1, #UTCR3_TXE
216                 @ if Ser1 is inactive, then try Ser2
217                 addeq   \rx, \rx, #(0x00030000 - 0x00010000)
218                 ldreq   r1, [\rx, #UTCR3]
219                 tsteq   r1, #UTCR3_TXE
221                 @ if all ports are inactive, then there is nothing we can do
222                 moveq   pc, lr
223                 .endm
225                 .macro  senduart,rd,rx
226                 str     \rd, [\rx, #UTDR]
227                 .endm
229                 .macro  waituart,rd,rx
230 1001:           ldr     \rd, [\rx, #UTSR1]
231                 tst     \rd, #UTSR1_TNF
232                 beq     1001b
233                 .endm
235                 .macro  busyuart,rd,rx
236 1001:           ldr     \rd, [\rx, #UTSR1]
237                 tst     \rd, #UTSR1_TBY
238                 bne     1001b
239                 .endm
241 #elif defined(CONFIG_ARCH_PXA)
243                 .macro  addruart,rx
244                 mrc     p15, 0, \rx, c1, c0
245                 tst     \rx, #1                 @ MMU enabled?
246                 moveq   \rx, #0x40000000                @ physical
247                 movne   \rx, #io_p2v(0x40000000)        @ virtual
248                 orr     \rx, \rx, #0x00100000
249                 .endm
251                 .macro  senduart,rd,rx
252                 str     \rd, [\rx, #0]
253                 .endm
255                 .macro  busyuart,rd,rx
256 1002:           ldr     \rd, [\rx, #0x14]
257                 tst     \rd, #(1 << 6)
258                 beq     1002b
259                 .endm
261                 .macro  waituart,rd,rx
262 1001:           ldr     \rd, [\rx, #0x14]
263                 tst     \rd, #(1 << 5)
264                 beq     1001b
265                 .endm
266 #elif defined(CONFIG_ARCH_CLPS7500)
267                 .macro  addruart,rx
268                 mov     \rx, #0xe0000000
269                 orr     \rx, \rx, #0x00010000
270                 orr     \rx, \rx, #0x00000be0
271                 .endm
273                 .macro  senduart,rd,rx
274                 strb    \rd, [\rx]
275                 .endm
277                 .macro  busyuart,rd,rx
278                 .endm
280                 .macro  waituart,rd,rx
281 1001:           ldrb    \rd, [\rx, #0x14]
282                 tst     \rd, #0x20
283                 beq     1001b
284                 .endm
286 #elif defined(CONFIG_ARCH_L7200)
288                 .equ    io_virt, IO_BASE
289                 .equ    io_phys, IO_START
291                 .macro  addruart,rx
292                 mrc     p15, 0, \rx, c1, c0
293                 tst     \rx, #1                 @ MMU enabled?
294                 moveq   \rx, #io_phys           @ physical base address
295                 movne   \rx, #io_virt           @ virtual address
296                 add     \rx, \rx, #0x00044000   @ UART1
297 @               add     \rx, \rx, #0x00045000   @ UART2
298                 .endm
300                 .macro  senduart,rd,rx
301                 str     \rd, [\rx, #0x0]        @ UARTDR
302                 .endm
304                 .macro  waituart,rd,rx
305 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
306                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
307                 bne     1001b
308                 .endm
310                 .macro  busyuart,rd,rx
311 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
312                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
313                 bne     1001b
314                 .endm
316 #elif defined(CONFIG_ARCH_INTEGRATOR)
318 #include <asm/hardware/amba_serial.h>
320                 .macro  addruart,rx
321                 mrc     p15, 0, \rx, c1, c0
322                 tst     \rx, #1                 @ MMU enabled?
323                 moveq   \rx, #0x16000000        @ physical base address
324                 movne   \rx, #0xf0000000        @ virtual base
325                 addne   \rx, \rx, #0x16000000 >> 4
326                 .endm
328                 .macro  senduart,rd,rx
329                 strb    \rd, [\rx, #UART01x_DR]
330                 .endm
332                 .macro  waituart,rd,rx
333 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
334                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
335                 bne     1001b
336                 .endm
338                 .macro  busyuart,rd,rx
339 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
340                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
341                 bne     1001b
342                 .endm
344 #elif defined(CONFIG_ARCH_CLPS711X)
346 #include <asm/hardware/clps7111.h>
348                 .macro  addruart,rx
349                 mrc     p15, 0, \rx, c1, c0
350                 tst     \rx, #1                 @ MMU enabled?
351                 moveq   \rx, #CLPS7111_PHYS_BASE
352                 movne   \rx, #CLPS7111_VIRT_BASE
353 #ifndef CONFIG_DEBUG_CLPS711X_UART2
354                 add     \rx, \rx, #0x0000       @ UART1
355 #else
356                 add     \rx, \rx, #0x1000       @ UART2
357 #endif
358                 .endm
360                 .macro  senduart,rd,rx
361                 str     \rd, [\rx, #0x0480]     @ UARTDR
362                 .endm
364                 .macro  waituart,rd,rx
365 1001:           ldr     \rd, [\rx, #0x0140]     @ SYSFLGx
366                 tst     \rd, #1 << 11           @ UBUSYx
367                 bne     1001b
368                 .endm
370                 .macro  busyuart,rd,rx
371                 tst     \rx, #0x1000            @ UART2 does not have CTS here
372                 bne     1002f
373 1001:           ldr     \rd, [\rx, #0x0140]     @ SYSFLGx
374                 tst     \rd, #1 << 8            @ CTS
375                 bne     1001b
376 1002:
377                 .endm
379 #elif defined(CONFIG_ARCH_CAMELOT)
381 #include <asm/arch/excalibur.h>
382 #define UART00_TYPE
383 #include <asm/arch/uart00.h>
385                 .macro  addruart,rx
386                 mrc     p15, 0, \rx, c1, c0
387                 tst     \rx, #1                 @ MMU enabled?
388                 ldr     \rx, =EXC_UART00_BASE   @ physical base address
389                 orrne   \rx, \rx, #0xff000000   @ virtual base
390                 orrne   \rx, \rx, #0x00f00000   
391                 .endm
393                 .macro  senduart,rd,rx
394                 str     \rd, [\rx, #UART_TD(0)]
395                 .endm
397                 .macro  waituart,rd,rx
398 1001:           ldr     \rd, [\rx, #UART_TSR(0)]
399                 and     \rd, \rd,  #UART_TSR_TX_LEVEL_MSK
400                 cmp     \rd, #15
401                 beq     1001b
402                 .endm
404                 .macro  busyuart,rd,rx
405 1001:           ldr     \rd, [\rx, #UART_TSR(0)]
406                 ands    \rd, \rd,  #UART_TSR_TX_LEVEL_MSK
407                 bne     1001b
408                 .endm
410 #elif defined(CONFIG_ARCH_IOP3XX)
412                 .macro  addruart,rx
413                 mov     \rx, #0xfe000000        @ physical
414 #if defined(CONFIG_ARCH_IQ80321) || defined(CONFIG_ARCH_IQ31244)
415                 orr     \rx, \rx, #0x00800000   @ location of the UART
416 #elif defined(CONFIG_ARCH_IOP331)
417                 mrc     p15, 0, \rx, c1, c0
418                 tst     \rx, #1                 @ MMU enabled?
419                 moveq   \rx, #0x000fe000        @ Physical Base
420                 movne   \rx, #0
421                 orr     \rx, \rx, #0xfe000000
422                 orr     \rx, \rx, #0x00f00000   @ Virtual Base
423                 orr     \rx, \rx, #0x00001700   @ location of the UART
424 #else
425 #error Unknown IOP3XX implementation
426 #endif
427                 .endm
429                 .macro  senduart,rd,rx
430                 strb    \rd, [\rx]
431                 .endm
433                 .macro  busyuart,rd,rx
434 1002:           ldrb    \rd, [\rx, #0x5]
435                 and     \rd, \rd, #0x60
436                 teq     \rd, #0x60
437                 bne     1002b
438                 .endm
440                 .macro  waituart,rd,rx
441 #if !defined(CONFIG_ARCH_IQ80321) || !defined(CONFIG_ARCH_IQ31244) || !defined(CONFIG_ARCH_IQ80331)
442 1001:           ldrb    \rd, [\rx, #0x6]
443                 tst     \rd, #0x10
444                 beq     1001b
445 #endif
446                 .endm
448 #elif defined(CONFIG_ARCH_IXP4XX)
450                 .macro  addruart,rx
451                 mrc     p15, 0, \rx, c1, c0
452                 tst     \rx, #1                 @ MMU enabled?
453                 moveq   \rx, #0xc8000000
454                 movne   \rx, #0xff000000
455                 add     \rx,\rx,#3              @ Uart regs are at off set of 3 if
456                                                 @ byte writes used - Big Endian.
457                 .endm
459                .macro  senduart,rd,rx
460                 strb    \rd, [\rx]
461                 .endm
463                 .macro  waituart,rd,rx
464 1002:           ldrb    \rd, [\rx, #0x14]
465                 and     \rd, \rd, #0x60         @ check THRE and TEMT bits
466                 teq     \rd, #0x60
467                 bne     1002b
468                 .endm
470                 .macro  busyuart,rd,rx
471                 .endm
473 #elif defined(CONFIG_ARCH_IXP2000)
475                 .macro  addruart,rx
476                 mrc     p15, 0, \rx, c1, c0
477                 tst     \rx, #1                 @ MMU enabled?
478                 moveq   \rx, #0xc0000000        @ Physical base
479                 movne   \rx, #0xfe000000        @ virtual base
480                 orrne   \rx, \rx, #0x00f00000
481                 orr     \rx, \rx, #0x00030000
482 #ifdef  __ARMEB__
483                 orr     \rx, \rx, #0x00000003
484 #endif
485                 .endm 
486                 
487                 .macro  senduart,rd,rx
488                 strb    \rd, [\rx]
489                 .endm
491                 .macro  busyuart,rd,rx
492 1002:           ldrb    \rd, [\rx, #0x14]
493                 tst     \rd, #0x20       
494                 beq     1002b
495                 .endm
497                 .macro  waituart,rd,rx
498                 nop
499                 nop
500                 nop
501                 .endm
503 #elif defined(CONFIG_ARCH_OMAP)
505                 .macro  addruart,rx
506                 mrc     p15, 0, \rx, c1, c0
507                 tst     \rx, #1                 @ MMU enabled?
508                 moveq   \rx, #0xff000000        @ physical base address
509                 movne   \rx, #0xfe000000        @ virtual base
510                 orr     \rx, \rx, #0x00fb0000
511 #ifdef CONFIG_OMAP_LL_DEBUG_UART3
512                 orr     \rx, \rx, #0x00009000   @ UART 3
513 #endif
514 #if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
515                 orr     \rx, \rx, #0x00000800   @ UART 2 & 3
516 #endif
517                 .endm
519                 .macro  senduart,rd,rx
520                 strb    \rd, [\rx]
521                 .endm
523                 .macro  busyuart,rd,rx
524 1001:           ldrb    \rd, [\rx, #(0x5 << 2)] @ OMAP-1510 and friends
525                 and     \rd, \rd, #0x60
526                 teq     \rd, #0x60
527                 beq     1002f
528                 ldrb    \rd, [\rx, #(0x5 << 0)] @ OMAP-730 only
529                 and     \rd, \rd, #0x60
530                 teq     \rd, #0x60
531                 bne     1001b
532 1002:
533                 .endm
535                 .macro  waituart,rd,rx
536                 .endm
538 #elif defined(CONFIG_ARCH_S3C2410)
539 #include <asm/arch/map.h>
540 #include <asm/arch/regs-serial.h>
542                 .macro addruart, rx
543                 mrc     p15, 0, \rx, c1, c0
544                 tst     \rx, #1
545                 ldreq   \rx, = S3C2410_PA_UART
546                 ldrne   \rx, = S3C2410_VA_UART
547 #if CONFIG_DEBUG_S3C2410_UART != 0
548                 add     \rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C2410_UART)
549 #endif
550                 .endm
552                 .macro  senduart,rd,rx
553                 str     \rd, [\rx, # S3C2410_UTXH ]
554                 .endm
556                 .macro  busyuart, rd, rx
557                 ldr     \rd, [ \rx, # S3C2410_UFCON ]
558                 tst     \rd, #S3C2410_UFCON_FIFOMODE    @ fifo enabled?
559                 beq     1001f                           @
560                 @ FIFO enabled...
561 1003:
562                 ldr     \rd, [ \rx, # S3C2410_UFSTAT ]
563                 tst     \rd, #S3C2410_UFSTAT_TXFULL
564                 bne     1003b
565                 b       1002f
567 1001:
568                 @ busy waiting for non fifo
569                 ldr     \rd, [ \rx, # S3C2410_UTRSTAT ]
570                 tst     \rd, #S3C2410_UTRSTAT_TXFE
571                 beq     1001b
573 1002:           @ exit busyuart
574                 .endm
576                 .macro  waituart,rd,rx
578                 ldr     \rd, [ \rx, # S3C2410_UFCON ]
579                 tst     \rd, #S3C2410_UFCON_FIFOMODE    @ fifo enabled?
580                 beq     1001f                           @
581                 @ FIFO enabled...
582 1003:
583                 ldr     \rd, [ \rx, # S3C2410_UFSTAT ]
584                 ands    \rd, \rd, #15<<S3C2410_UFSTAT_TXSHIFT
585                 bne     1003b
586                 b       1002f
588 1001:
589                 @ idle waiting for non fifo
590                 ldr     \rd, [ \rx, # S3C2410_UTRSTAT ]
591                 tst     \rd, #S3C2410_UTRSTAT_TXFE
592                 beq     1001b
594 1002:           @ exit busyuart
595                 .endm
597 #elif defined(CONFIG_ARCH_LH7A40X)
598         @ It is not known if this will be appropriate for every 40x
599         @ board.
601                 .macro  addruart,rx
602                 mrc     p15, 0, \rx, c1, c0
603                 tst     \rx, #1                 @ MMU enabled?
604                 mov     \rx, #0x00000700        @ offset from base
605                 orreq   \rx, \rx, #0x80000000   @ physical base
606                 orrne   \rx, \rx, #0xf8000000   @ virtual base
607                 .endm
609                 .macro  senduart,rd,rx
610                 strb    \rd, [\rx]              @ DATA
611                 .endm
613                 .macro  busyuart,rd,rx          @ spin while busy
614 1001:           ldr     \rd, [\rx, #0x10]       @ STATUS
615                 tst     \rd, #1 << 3            @ BUSY (TX FIFO not empty)
616                 bne     1001b                   @ yes, spin
617                 .endm
619                 .macro  waituart,rd,rx          @ wait for Tx FIFO room
620 1001:           ldrb    \rd, [\rx, #0x10]       @ STATUS
621                 tst     \rd, #1 << 5            @ TXFF (TX FIFO full)
622                 bne     1001b                   @ yes, spin
623                 .endm
626 #elif defined(CONFIG_ARCH_VERSATILE_PB)
628 #include <asm/hardware/amba_serial.h>
630                 .macro  addruart,rx
631                 mrc     p15, 0, \rx, c1, c0
632                 tst     \rx, #1                 @ MMU enabled?
633                 moveq   \rx,      #0x10000000
634                 movne   \rx,      #0xf1000000   @ virtual base
635                 orr     \rx, \rx, #0x001F0000
636                 orr     \rx, \rx, #0x00001000
637                 .endm
639                 .macro  senduart,rd,rx
640                 strb    \rd, [\rx, #UART01x_DR]
641                 .endm
643                 .macro  waituart,rd,rx
644 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
645                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
646                 bne     1001b
647                 .endm
649                 .macro  busyuart,rd,rx
650 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
651                 tst     \rd, #1 << 3            @ UARTFLGUBUSY - 1 when busy
652                 bne     1001b
653                 .endm
655 #elif defined(CONFIG_ARCH_IMX)
657                 .macro  addruart,rx
658                 mrc     p15, 0, \rx, c1, c0
659                 tst     \rx, #1                 @ MMU enabled?
660                 moveq   \rx, #0x00000000        @ physical
661                 movne   \rx, #0xe0000000        @ virtual
662                 orr     \rx, \rx, #0x00200000
663                 orr     \rx, \rx, #0x00006000   @ UART1 offset
664                 .endm
666                 .macro  senduart,rd,rx
667                 str     \rd, [\rx, #0x40]       @ TXDATA
668                 .endm
670                 .macro  waituart,rd,rx
671                 .endm
673                 .macro  busyuart,rd,rx
674 1002:           ldr     \rd, [\rx, #0x98]       @ SR2
675                 tst     \rd, #1 << 3            @ TXDC
676                 beq     1002b                   @ wait until transmit done
677                 .endm
679 #elif defined(CONFIG_ARCH_H720X)
681                 .equ    io_virt, IO_BASE
682                 .equ    io_phys, IO_START
684                 .macro  addruart,rx
685                 mrc     p15, 0, \rx, c1, c0
686                 tst     \rx, #1                @ MMU enabled?
687                 moveq   \rx, #io_phys          @ physical base address
688                 movne   \rx, #io_virt          @ virtual address
689                 add     \rx, \rx, #0x00020000   @ UART1
690                 .endm
692                 .macro  senduart,rd,rx
693                 str     \rd, [\rx, #0x0]        @ UARTDR
695                 .endm
697                 .macro  waituart,rd,rx
698 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
699                 tst     \rd, #1 << 5           @ UARTFLGUTXFF - 1 when full
700                 bne     1001b
701                 .endm
703                 .macro  busyuart,rd,rx
704 1001:           ldr     \rd, [\rx, #0x18]       @ UARTFLG
705                 tst     \rd, #1 << 3           @ UARTFLGUBUSY - 1 when busy
706                 bne     1001b
707                 .endm
708 #elif defined(CONFIG_ARCH_MOXACPU)
709                 .macro  addruart,rx
710                 mrc     p15, 0, \rx, c1, c0
711                 tst     \rx, #1
712                 moveq   \rx, #0x98000000
713                 addeq   \rx, \rx, #2 << 20
714                 movne   \rx, #0xf0000000
715                 addne   \rx, \rx, #0x09800000
716                 addne   \rx, \rx, #0x2 << 20
718                 .endm
720                 .macro  senduart,rd,rx
721                 strb    \rd, [\rx, #0]
722                 .endm
724                 .macro  waituart,rd,rx
725 1001:           ldr     \rd, [\rx, #0x20]       @ UARTFLG
726                 tst     \rd, #1 << 5            @ UARTFLGUTXFF - 1 when full
727                 bne     1001b
728                 .endm
730                 .macro  busyuart,rd,rx
731 1001:
732         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
733         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
734         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
735         nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop
736                 .endm
738 #else
739 #error Unknown architecture
740 #endif
743  * Useful debugging routines
744  */
745 ENTRY(printhex8)
746                 mov     r1, #8
747                 b       printhex
749 ENTRY(printhex4)
750                 mov     r1, #4
751                 b       printhex
753 ENTRY(printhex2)
754                 mov     r1, #2
755 printhex:       adr     r2, hexbuf
756                 add     r3, r2, r1
757                 mov     r1, #0
758                 strb    r1, [r3]
759 1:              and     r1, r0, #15
760                 mov     r0, r0, lsr #4
761                 cmp     r1, #10
762                 addlt   r1, r1, #'0'
763                 addge   r1, r1, #'a' - 10
764                 strb    r1, [r3, #-1]!
765                 teq     r3, r2
766                 bne     1b
767                 mov     r0, r2
768                 b       printascii
770                 .ltorg
772 ENTRY(printascii)
773                 addruart r3
774                 b       2f
775 1:              waituart r2, r3
776                 senduart r1, r3
777                 busyuart r2, r3
778                 teq     r1, #'\n'
779                 moveq   r1, #'\r'
780                 beq     1b
781 2:              teq     r0, #0
782                 ldrneb  r1, [r0], #1
783                 teqne   r1, #0
784                 bne     1b
785                 mov     pc, lr
787 ENTRY(printch)
788                 addruart r3
789                 mov     r1, r0
790                 mov     r0, #0
791                 b       1b
793 hexbuf:         .space 16