^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ENTRY_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ENTRY_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /* irq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) void handler_irq(int irq, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifdef CONFIG_SPARC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* traps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) void do_hw_interrupt(struct pt_regs *regs, unsigned long type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) void do_illegal_instruction(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) void do_priv_instruction(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) void do_fpd_trap(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) void do_fpe_trap(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) void handle_tag_overflow(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) void handle_watchpoint(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) void handle_reg_access(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) void handle_cp_disabled(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) void handle_cp_exception(struct pt_regs *regs, unsigned long pc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) unsigned long npc, unsigned long psr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* entry.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) void fpsave(unsigned long *fpregs, unsigned long *fsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) void *fpqueue, unsigned long *fpqdepth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) void fpload(unsigned long *fpregs, unsigned long *fsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #else /* CONFIG_SPARC32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <asm/trap_block.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct popc_3insn_patch_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) unsigned int addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned int insns[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) extern struct popc_3insn_patch_entry __popc_3insn_patch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) __popc_3insn_patch_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct popc_6insn_patch_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned int addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned int insns[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) extern struct popc_6insn_patch_entry __popc_6insn_patch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) __popc_6insn_patch_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct pause_patch_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) unsigned int addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned int insns[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) extern struct pause_patch_entry __pause_3insn_patch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __pause_3insn_patch_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) void sun4v_patch_1insn_range(struct sun4v_1insn_patch_entry *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct sun4v_1insn_patch_entry *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) void sun4v_patch_2insn_range(struct sun4v_2insn_patch_entry *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct sun4v_2insn_patch_entry *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) void sun_m7_patch_2insn_range(struct sun4v_2insn_patch_entry *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct sun4v_2insn_patch_entry *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) extern unsigned int dcache_parity_tl1_occurred;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) extern unsigned int icache_parity_tl1_occurred;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) asmlinkage void sparc_breakpoint(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) void timer_interrupt(int irq, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) void do_notify_resume(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned long orig_i0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) unsigned long thread_info_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) asmlinkage int syscall_trace_enter(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) asmlinkage void syscall_trace_leave(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) void bad_trap_tl1(struct pt_regs *regs, long lvl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) void do_fpieee(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) void do_fpother(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) void do_tof(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) void do_div0(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) void do_illegal_instruction(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) void mem_address_unaligned(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned long sfar,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) unsigned long sfsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) void sun4v_do_mna(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) unsigned long type_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void do_privop(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) void do_privact(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) void do_cee(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) void do_div0_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) void do_fpieee_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) void do_fpother_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) void do_ill_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void do_irq_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void do_lddfmna_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) void do_stdfmna_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) void do_paw(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) void do_paw_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) void do_vaw(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) void do_vaw_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) void do_tof_tl1(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) void do_getpsr(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) void spitfire_insn_access_exception(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned long sfsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) unsigned long sfar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) void spitfire_insn_access_exception_tl1(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) unsigned long sfsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) unsigned long sfar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) void spitfire_data_access_exception(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) unsigned long sfsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) unsigned long sfar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) void spitfire_data_access_exception_tl1(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) unsigned long sfsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) unsigned long sfar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) void spitfire_access_error(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) unsigned long status_encoded,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) unsigned long afar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) void cheetah_fecc_handler(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) unsigned long afsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned long afar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) void cheetah_cee_handler(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) unsigned long afsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) unsigned long afar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) void cheetah_deferred_handler(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) unsigned long afsr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) unsigned long afar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) void cheetah_plus_parity_error(int type, struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) void sun4v_insn_access_exception(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) unsigned long type_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) void sun4v_insn_access_exception_tl1(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) unsigned long type_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) void sun4v_data_access_exception(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) unsigned long type_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) void sun4v_data_access_exception_tl1(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) unsigned long type_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) void sun4v_resum_error(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) void sun4v_resum_overflow(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) void sun4v_nonresum_error(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) unsigned long offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) void sun4v_nonresum_overflow(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) void sun4v_mem_corrupt_detect_precise(struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) unsigned long context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) extern unsigned long sun4v_err_itlb_vaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) extern unsigned long sun4v_err_itlb_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) extern unsigned long sun4v_err_itlb_pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) extern unsigned long sun4v_err_itlb_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) void sun4v_itlb_error_report(struct pt_regs *regs, int tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) extern unsigned long sun4v_err_dtlb_vaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) extern unsigned long sun4v_err_dtlb_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) extern unsigned long sun4v_err_dtlb_pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) extern unsigned long sun4v_err_dtlb_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) void sun4v_dtlb_error_report(struct pt_regs *regs, int tl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) void hypervisor_tlbop_error(unsigned long err,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) unsigned long op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) void hypervisor_tlbop_error_xcall(unsigned long err,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) unsigned long op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* WARNING: The error trap handlers in assembly know the precise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * layout of the following structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * C-level handlers in traps.c use this information to log the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * error and then determine how to recover (if possible).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) struct cheetah_err_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /*0x00*/u64 afsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /*0x08*/u64 afar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* D-cache state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /*0x10*/u64 dcache_data[4]; /* The actual data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /*0x30*/u64 dcache_index; /* D-cache index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /*0x38*/u64 dcache_tag; /* D-cache tag/valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /*0x40*/u64 dcache_utag; /* D-cache microtag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /*0x48*/u64 dcache_stag; /* D-cache snooptag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /* I-cache state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /*0x50*/u64 icache_data[8]; /* The actual insns + predecode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /*0x90*/u64 icache_index; /* I-cache index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /*0x98*/u64 icache_tag; /* I-cache phys tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /*0xa0*/u64 icache_utag; /* I-cache microtag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) /*0xa8*/u64 icache_stag; /* I-cache snooptag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /*0xb0*/u64 icache_upper; /* I-cache upper-tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /*0xb8*/u64 icache_lower; /* I-cache lower-tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /* E-cache state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /*0xc0*/u64 ecache_data[4]; /* 32 bytes from staging registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /*0xe0*/u64 ecache_index; /* E-cache index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) /*0xe8*/u64 ecache_tag; /* E-cache tag/state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /*0xf0*/u64 __pad[32 - 30];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define CHAFSR_INVALID ((u64)-1L)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* This is allocated at boot time based upon the largest hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * cpu ID in the system. We allocate two entries per cpu, one for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * TL==0 logging and one for TL >= 1 logging.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) extern struct cheetah_err_info *cheetah_error_log;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* UPA nodes send interrupt packet to UltraSparc with first data reg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * value low 5 (7 on Starfire) bits holding the IRQ identifier being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * delivered. We must translate this into a non-vector IRQ so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * set the softint on this cpu.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * To make processing these packets efficient and race free we use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * an array of irq buckets below. The interrupt vector handler in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) * entry.S feeds incoming packets into per-cpu pil-indexed lists.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * If you make changes to ino_bucket, please update hand coded assembler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * of the vectored interrupt trap handler(s) in entry.S and sun4v_ivec.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct ino_bucket {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /*0x00*/unsigned long __irq_chain_pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* Interrupt number assigned to this INO. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /*0x08*/unsigned int __irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /*0x0c*/unsigned int __pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) extern struct ino_bucket *ivector_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) extern unsigned long ivector_table_pa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) void init_irqwork_curcpu(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) void sun4v_register_mondo_queues(int this_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #endif /* CONFIG_SPARC32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) #endif /* _ENTRY_H */