Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */