asm_octeon.S revision 201921
1 2#include <machine/asm.h> 3#include <machine/cache_r4k.h> 4#include <machine/cpuregs.h> 5#include <machine/param.h> 6#include <machine/pte.h> 7 8#include "assym.s" 9 10 11 12#define CPU_DISABLE_INTERRUPTS(reg, reg2, reg3) \ 13 mfc0 reg, MIPS_COP_0_STATUS; \ 14 nop; \ 15 move reg3, reg; \ 16 li reg2, ~MIPS_SR_INT_IE; \ 17 and reg, reg2, reg; \ 18 mtc0 reg, MIPS_COP_0_STATUS; \ 19 COP0_SYNC 20 21 22 23#define CPU_ENABLE_INTERRUPTS(reg, reg3) \ 24 mfc0 reg, MIPS_COP_0_STATUS; \ 25 nop; \ 26 or reg, reg, reg3; \ 27 mtc0 reg, MIPS_COP_0_STATUS; \ 28 COP0_SYNC 29 30 31#define PUSHR(reg) \ 32 addiu sp,sp,-16 ; \ 33 sd reg, 8(sp) ; \ 34 nop ; 35 36#define POPR(reg) \ 37 ld reg, 8(sp) ; \ 38 addiu sp,sp,16 ; \ 39 nop ; 40 41 42 43 44/* 45 * octeon_ciu_get_interrupt_reg_addr 46 * 47 * Given Int-X, En-X combination, return the CIU Interrupt Enable Register addr 48 * a0 = ciu Int-X: 0/1 49 * a1 = ciu EN-0: 0/1 50 */ 51LEAF(octeon_ciu_get_interrupt_reg_addr) 52 .set noreorder 53 .set mips3 54 55 beqz a0, ciu_get_interrupt_reg_addr_Int_0 56 nop 57 58ciu_get_interrupt_reg_addr_Int_1: 59 beqz a1, ciu_get_interrupt_reg_addr_Int_1_En_0 60 nop 61 62ciu_get_interrupt_reg_addr_Int_1_En1: 63 li a0, OCTEON_CIU_ADDR_HI 64 dsll32 a0, a0, 0 65 nop 66 ori a0, OCTEON_CIU_EN1_INT1_LO 67 j ciu_get_interrupt_reg_addr_ret 68 nop 69 70ciu_get_interrupt_reg_addr_Int_1_En_0: 71 li a0, OCTEON_CIU_ADDR_HI 72 dsll32 a0, a0, 0 73 nop 74 ori a0, OCTEON_CIU_EN0_INT1_LO 75 j ciu_get_interrupt_reg_addr_ret 76 nop 77 78ciu_get_interrupt_reg_addr_Int_0: 79 beqz a1, ciu_get_interrupt_reg_addr_Int_0_En_0 80 nop 81 82ciu_get_interrupt_reg_addr_Int_0_En_1: 83 li a0, OCTEON_CIU_ADDR_HI 84 dsll32 a0, a0, 0 85 nop 86 ori a0, OCTEON_CIU_EN1_INT0_LO 87 j ciu_get_interrupt_reg_addr_ret 88 nop 89 90ciu_get_interrupt_reg_addr_Int_0_En_0: 91 li a0, OCTEON_CIU_ADDR_HI 92 dsll32 a0, a0, 0 93 nop 94 ori a0, OCTEON_CIU_EN0_INT0_LO 95 96 97ciu_get_interrupt_reg_addr_ret: 98 j ra 99 nop 100 101 .set mips0 102 .set reorder 103END(octeon_ciu_get_interrupt_reg_addr) 104 105 106 107/* 108 * octeon_ciu_mask_all_interrupts 109 * 110 * a0 = ciu Interrupt-X: 0/1 111 * a1 = ciu Enable-X: 0/1 112 */ 113LEAF(octeon_ciu_mask_all_interrupts) 114 .set noreorder 115 .set mips3 116 117 PUSHR(ra) 118 PUSHR(s0) 119 120 move t0, a0 121 move t1, a1 122 li a0, MIPS_SR_INT_IE 123 CPU_DISABLE_INTERRUPTS(a2, a1, s0) 124 move a0, t0 125 move t1, a1 126 jal octeon_ciu_get_interrupt_reg_addr 127 nop 128 ld a2, 0(a0) # Dummy read 129 nop 130 move a2, zero # Clear all 131 sd a2, 0(a0) # Write new Enable bits 132 nop 133 CPU_ENABLE_INTERRUPTS(a2, s0) 134 135 POPR(s0) 136 POPR(ra) 137 j ra # Return 138 nop # (bd slot) 139 140 .set mips0 141 .set reorder 142END(octeon_ciu_mask_all_interrupts) 143 144