1/* $NetBSD: shark_fiq.S,v 1.2 2003/05/20 04:44:52 simonb Exp $ */ 2 3/* 4 * Copyright 1997 5 * Digital Equipment Corporation. All rights reserved. 6 * 7 * This software is furnished under license and may be used and 8 * copied only in accordance with the following terms and conditions. 9 * Subject to these conditions, you may download, copy, install, 10 * use, modify and distribute this software in source and/or binary 11 * form. No title or ownership is transferred hereby. 12 * 13 * 1) Any source code used, modified or distributed must reproduce 14 * and retain this copyright notice and list of conditions as 15 * they appear in the source file. 16 * 17 * 2) No right is granted to use any trade name, trademark, or logo of 18 * Digital Equipment Corporation. Neither the "Digital Equipment 19 * Corporation" name nor any trademark or logo of Digital Equipment 20 * Corporation may be used to endorse or promote products derived 21 * from this software without the prior written permission of 22 * Digital Equipment Corporation. 23 * 24 * 3) This software is provided "AS-IS" and any express or implied 25 * warranties, including but not limited to, any implied warranties 26 * of merchantability, fitness for a particular purpose, or 27 * non-infringement are disclaimed. In no event shall DIGITAL be 28 * liable for any damages whatsoever, and in particular, DIGITAL 29 * shall not be liable for special, indirect, consequential, or 30 * incidental damages or damages for lost profits, loss of 31 * revenue or loss of use, whether such damages arise in contract, 32 * negligence, tort, under statute, in equity, at law or otherwise, 33 * even if advised of the possibility of such damage. 34 */ 35 36/* 37 * fiq.S 38 * 39 * Low level fiq handlers 40 * 41 * Created : 19/05/97 42 */ 43 44#include <machine/asm.h> 45#include <machine/cpu.h> 46#include <shark/shark/shark_fiq.h> 47#include <shark/shark/sequoia.h> 48 49 .text 50 51/* this variable is used to detect when it is necessary to unwedge the 52 sequoia SMI/PMI edge detect logic. *sigh* */ 53Lfiqs_happened: 54 .word _C_LABEL(fiqs_happened) 55Lsequoia_index_cache: 56 .word _C_LABEL(sequoia_index_cache) 57 58 .data 59 .global _C_LABEL(fiqs_happened) 60_C_LABEL(fiqs_happened): 61 .word 0 62 63 .text 64 65 .global _C_LABEL(shark_fiq) 66 .global _C_LABEL(shark_fiq_end) 67 68/* 69 * r8 - VAM_IO_DATA = address of IO space in virtual memory 70 * r9 - C routine to call (0 => no routine) 71 * r10 - argument (0 => pass PMI reason register) 72 * r11 - scratch 73 * r12 - scratch 74 * r13 - stack for C routine call 75 */ 76 77_C_LABEL(shark_fiq): 78 /* clear the FIQ immediately */ 79 /* do the FIQ/SMI clear here to avoid synchronization problems! 80 both the chip enable (caused by the ISA register read) and 81 the sequoia bit clear must be done. do it in that order so 82 the sequoia port accesses will clear the chip enable caused 83 by accessing FIQ_CLEAR_IOPORT 84 */ 85 /* set up to read/write the power management status register */ 86 ldr r11, Lsequoia_index_cache 87 ldr r12, [r11] 88 89 /* see if the index is properly set. unfortunately, the common 90 case will probably be that the FIQ handler (e.g. smartcard) 91 talks to the sequoia, so the index will need to be set. */ 92 cmp r12, #PMC_PMSR_REG 93 movne r12, #PMC_PMSR_REG 94#ifdef STRH 95 strneh r12, [r8, #SEQUOIA_INDEX] 96#else 97 .word 0x11c8c2b4 98#endif 99 strne r12, [r11] 100 101 /* set SMIACT by changing the power management mode to sleep */ 102 mov r12, #PMMD_SLEEP 103#ifdef STRH 104 strh r12, [r8, #SEQUOIA_DATA] 105#else 106 .word 0xe1c8c2b6 107#endif 108 109 /* get the PMI reason register, if desired */ 110 cmp r10, #0 111#ifdef LDRH 112 ldreqh r10, [r8, #SEQUOIA_DATA] 113#else 114 .word 0x01d8a2b6 /* ldrh r10, [r8, #0x26] */ 115#endif 116 117 /* simultaneously clear the PMI reason bits and clear SMIACT */ 118 mov r12, #PMMD_ON 119 orr r12, r12, #PMSR_M_PMISRC 120#ifdef STRH 121 strh r12, [r8, #SEQUOIA_DATA] 122#else 123 .word 0xe1c8c2b6 124#endif 125 126 ldr r12, Lfiqs_happened 127 ldr r11, [r12] 128 add r11, r11, #1 129 str r11, [r12] 130 131 cmp r9, #0 132 subseq pc, lr, #4 /* no routine => return from trap */ 133 134 /* assume that the C routine follows the ARM procedure call standard. 135 save only user registers and let the C code save the rest. 136 r0-r3, r12, r14 clobbered. other regs should be restored 137 by C code. 138 */ 139 stmfd sp!, {r0-r3, lr} /* save user registers */ 140 mov r0, r10 /* pass the PMI reason register */ 141 mov lr, pc /* call C routine */ 142 mov pc, r9 143 ldmfd sp!, {r0-r3, lr} /* restore user registers */ 144 subs pc, lr, #4 /* return from trap */ 145_C_LABEL(shark_fiq_end): 146 147/* End of fiq.S */ 148