Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | /* |
2 | * ========== Copyright Header Begin ========================================== | |
3 | * | |
4 | * Hypervisor Software File: vpci_errs.s | |
5 | * | |
6 | * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. | |
7 | * | |
8 | * - Do no alter or remove copyright notices | |
9 | * | |
10 | * - Redistribution and use of this software in source and binary forms, with | |
11 | * or without modification, are permitted provided that the following | |
12 | * conditions are met: | |
13 | * | |
14 | * - Redistribution of source code must retain the above copyright notice, | |
15 | * this list of conditions and the following disclaimer. | |
16 | * | |
17 | * - Redistribution in binary form must reproduce the above copyright notice, | |
18 | * this list of conditions and the following disclaimer in the | |
19 | * documentation and/or other materials provided with the distribution. | |
20 | * | |
21 | * Neither the name of Sun Microsystems, Inc. or the names of contributors | |
22 | * may be used to endorse or promote products derived from this software | |
23 | * without specific prior written permission. | |
24 | * | |
25 | * This software is provided "AS IS," without a warranty of any kind. | |
26 | * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, | |
27 | * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A | |
28 | * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN | |
29 | * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR | |
30 | * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR | |
31 | * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN | |
32 | * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR | |
33 | * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE | |
34 | * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, | |
35 | * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF | |
36 | * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | |
37 | * | |
38 | * You acknowledge that this software is not designed, licensed or | |
39 | * intended for use in the design, construction, operation or maintenance of | |
40 | * any nuclear facility. | |
41 | * | |
42 | * ========== Copyright Header End ============================================ | |
43 | */ | |
44 | /* | |
45 | * Copyright 2007 Sun Microsystems, Inc. All rights reserved. | |
46 | * Use is subject to license terms. | |
47 | */ | |
48 | ||
49 | .ident "@(#)vpci_errs.s 1.23 07/05/03 SMI" | |
50 | ||
51 | #include <sys/asm_linkage.h> | |
52 | #include <sys/htypes.h> | |
53 | #include <hypervisor.h> | |
54 | #include <sparcv9/asi.h> | |
55 | #include <sun4v/asi.h> | |
56 | #include <asi.h> | |
57 | #include <mmu.h> | |
58 | ||
59 | #include <guest.h> | |
60 | #include <strand.h> | |
61 | #include <offsets.h> | |
62 | #include <errs_common.h> | |
63 | #include <debug.h> | |
64 | #include <vpci_errs.h> | |
65 | #include <util.h> | |
66 | #include <abort.h> | |
67 | #include <vdev_intr.h> | |
68 | #include <fire.h> | |
69 | ||
70 | ||
71 | #define r_fire_cookie %g1 | |
72 | #define r_fire_e_rpt %g2 | |
73 | #define r_fire_leaf_address %g4 | |
74 | ||
75 | #define r_tmp1 %g5 | |
76 | #define r_tmp2 %g7 | |
77 | ||
78 | #if defined(CONFIG_FIRE) | |
79 | ||
80 | !! %g1 = Fire Cookie | |
81 | !! %g2 = Mondo DATA0 | |
82 | !! %g3 = IGN | |
83 | !! %g4 = INO | |
84 | ENTRY_NP(error_mondo_62) | |
85 | PRINT("HV:mondo 62\r\n") | |
86 | mov %g2, %g7 ! save DATA0 for err handle setup | |
87 | ||
88 | !! | |
89 | !! Generate a unique error handle | |
90 | !! enters with: | |
91 | !! %g1 loaded with fire cookie | |
92 | !! %g2 data0, overwritten with r_fire_e_rpt | |
93 | !! %g3 IGN | |
94 | !! %g4 INO | |
95 | !! %g5 scratch | |
96 | !! %g6 scratch | |
97 | !! %g7 data0 | |
98 | !! | |
99 | !! returns with: | |
100 | !! %g1 r_fire_cookie | |
101 | !! %g2 pointing to r_fire_e_rpt | |
102 | !! | |
103 | GEN_ERR_HNDL_SETUP_ERPTS(%g1, %g2, %g3, %g4, %g5, %g6, %g7) | |
104 | ldx [r_fire_cookie + FIRE_COOKIE_PCIE], %g4 | |
105 | ! use alias r_fire_leaf_address for %g4 now | |
106 | !! | |
107 | !! %g1 Fire cookie | |
108 | !! %g2 fire error rpt | |
109 | !! %g3 - temporary | |
110 | !! %g4 r_fire_leaf_address | |
111 | !! %g5 - temporary, last register loaded | |
112 | !! | |
113 | ! which core interruped? | |
114 | set FIRE_DLC_IMU_ICS_MULTI_CORE_ERROR_STATUS_REG, r_tmp2 | |
115 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
116 | and r_tmp1, DMC_BIT, r_tmp2 | |
117 | brnz,a r_tmp2, dmc_core_processing | |
118 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_MULTI_CORE_ERR_STATUS] | |
119 | and r_tmp1, PEC_BIT, r_tmp2 | |
120 | brnz,a r_tmp2, pec_core_processing | |
121 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_MULTI_CORE_ERR_STATUS] | |
122 | ! should not get here | |
123 | PRINT("HV:mondo 62 fall through to retry\r\n") | |
124 | ba,a clear_pcie_err_fire_interrupt | |
125 | .empty | |
126 | ||
127 | dmc_core_processing: | |
128 | PRINT("HV:PEC\r\n") | |
129 | set FIRE_DLC_IMU_ICS_DMC_INTERRUPT_STATUS_REG, r_tmp2 | |
130 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
131 | and r_tmp1, MMU_BIT, r_tmp2 | |
132 | brnz,a r_tmp2, mmu_block_processing | |
133 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_DMC_CORE_AND_BLOCK_ERR_STATUS] | |
134 | and r_tmp1, IMU_BIT, r_tmp2 | |
135 | brnz,a r_tmp2, imu_block_processing | |
136 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_DMC_CORE_AND_BLOCK_ERR_STATUS] | |
137 | ! should not get here | |
138 | PRINT("HV:PEC fallthrough to retry\r\n") | |
139 | ba,a clear_pcie_err_fire_interrupt | |
140 | .empty | |
141 | ||
142 | ||
143 | imu_block_processing: | |
144 | PRINT("HV:imu_block_processing\r\n") | |
145 | set FIRE_DLC_IMU_ICS_IMU_ENABLED_ERROR_STATUS_REG, r_tmp2 | |
146 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
147 | !r_tmp1 is not changed for this block | |
148 | ||
149 | .imu_eq_not_en_group_p: | |
150 | PRINT("HV:.imu_eq_not_en_group_p\r\n") | |
151 | btst IMU_EQ_NOT_EN_GROUP_P, r_tmp1 | |
152 | bz %xcc, .imu_eq_over_group_p | |
153 | and r_tmp1, IMU_EQ_NOT_EN_GROUP_P, r_tmp2 | |
154 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
155 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
156 | r_tmp2) | |
157 | LOG_IMU_SCS_ERROR_LOG_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
158 | r_tmp1, r_tmp2) | |
159 | LOG_IMU_EQ_NOT_EN_GROUP_EPKT_P(r_fire_e_rpt, \ | |
160 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
161 | CLEAR_IMU_EQ_NOT_EN_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
162 | r_tmp1, r_tmp2) | |
163 | ba,a pcie_err_mondo_ereport | |
164 | .empty | |
165 | ||
166 | .imu_eq_over_group_p: | |
167 | PRINT("HV:imu_eq_over_group_p\r\n") | |
168 | btst IMU_EQ_OVER_GROUP_P, r_tmp1 | |
169 | bz %xcc, .imu_msi_mes_group_p | |
170 | and r_tmp1, IMU_EQ_OVER_GROUP_P, r_tmp2 | |
171 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
172 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
173 | r_tmp2) | |
174 | LOG_IMU_EQS_ERROR_LOG_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
175 | r_tmp1, r_tmp2) | |
176 | LOG_IMU_EQ_OVER_GROUP_EPKT_P_S(r_fire_e_rpt, \ | |
177 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
178 | CLEAR_IMU_EQ_OVER_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
179 | r_tmp1, r_tmp2) | |
180 | ba,a pcie_err_mondo_ereport | |
181 | .empty | |
182 | ||
183 | .imu_msi_mes_group_p: | |
184 | PRINT("HV:imu_msi_mes_group_p\r\n") | |
185 | btst IMU_MSI_MES_GROUP_P, r_tmp1 | |
186 | bz %xcc, .imu_eq_not_en_group_s | |
187 | and r_tmp1, IMU_MSI_MES_GROUP_P, r_tmp2 | |
188 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
189 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
190 | r_tmp2) | |
191 | LOG_IMU_RDS_ERROR_LOG_REG(r_fire_e_rpt, r_fire_leaf_address, \ | |
192 | r_tmp1, r_tmp2) | |
193 | LOG_IMU_MSI_MES_GROUP_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
194 | r_tmp1, r_tmp2) | |
195 | CLEAR_IMU_MSI_MES_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
196 | r_tmp1, r_tmp2) | |
197 | ba,a pcie_err_mondo_ereport | |
198 | .empty | |
199 | ||
200 | .imu_eq_not_en_group_s: | |
201 | PRINT("HV:imu_eq_not_en_group_s\r\n") | |
202 | set IMU_EQ_NOT_EN_GROUP_P, r_tmp2 | |
203 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
204 | btst r_tmp2, r_tmp1 | |
205 | bz %xcc, .imu_eq_over_group_s | |
206 | and r_tmp2, r_tmp1, r_tmp2 | |
207 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
208 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
209 | r_tmp2) | |
210 | LOG_IMU_EQ_NOT_EN_GROUP_EPKT_S(r_fire_e_rpt, \ | |
211 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
212 | CLEAR_IMU_EQ_NOT_EN_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
213 | r_tmp1, r_tmp2) | |
214 | ba,a pcie_err_mondo_ereport | |
215 | .empty | |
216 | ||
217 | .imu_eq_over_group_s: | |
218 | PRINT("HV:imu_eq_over_group_s\r\n") | |
219 | set IMU_EQ_OVER_GROUP_P, r_tmp2 | |
220 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
221 | btst r_tmp2, r_tmp1 | |
222 | bz %xcc, .imu_msi_mes_group_s | |
223 | and r_tmp2, r_tmp1, r_tmp2 | |
224 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
225 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
226 | LOG_IMU_EQ_OVER_GROUP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address,\ | |
227 | r_tmp1, r_tmp2) | |
228 | CLEAR_IMU_EQ_OVER_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
229 | r_tmp1, r_tmp2) | |
230 | ba,a pcie_err_mondo_ereport | |
231 | .empty | |
232 | ||
233 | .imu_msi_mes_group_s: | |
234 | PRINT("HV:imu_msi_mes_group_s\r\n") | |
235 | set IMU_MSI_MES_GROUP_P, r_tmp2 | |
236 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
237 | btst r_tmp2, r_tmp1 | |
238 | bz,pn %xcc, .imu_block_processing_nothing_to_do | |
239 | and r_tmp2, r_tmp1, r_tmp2 | |
240 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS] | |
241 | LOG_DMC_IMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
242 | CLEAR_IMU_MSI_MES_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
243 | r_tmp1, r_tmp2) | |
244 | ba,a clear_pcie_err_fire_interrupt | |
245 | .empty | |
246 | ||
247 | .imu_block_processing_nothing_to_do: | |
248 | PRINT("HV:imu_block_processing_nothing_to_do\r\n") | |
249 | ! we should not get here | |
250 | ba,a clear_pcie_err_fire_interrupt | |
251 | .empty | |
252 | ||
253 | mmu_block_processing: | |
254 | PRINT("HV:mmu_block_processing\r\n") | |
255 | set FIRE_DLC_MMU_EN_ERR, r_tmp2 | |
256 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
257 | ||
258 | .mmu_err_group_p: | |
259 | PRINT("HV:mmu_err_group_p\r\n") | |
260 | PRINT("HV:FIRE_DLC_MMU_EN_ERR:0x") | |
261 | PRINTX(r_tmp1) | |
262 | PRINT("\r\n") | |
263 | #ifdef DEBUG | |
264 | /* PRINT() destroys %g7, which is r_tmp2, so need to reload the reg */ | |
265 | set FIRE_DLC_MMU_EN_ERR, r_tmp2 | |
266 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
267 | #endif | |
268 | set MMU_ERR_GROUP_P, r_tmp2 | |
269 | btst r_tmp2, r_tmp1 | |
270 | bz %xcc, .mmu_err_group_s | |
271 | and r_tmp1, r_tmp2, r_tmp2 | |
272 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_MMU_INTR_STATUS] | |
273 | LOG_DMC_MMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
274 | LOG_MMU_TRANS_FAULT_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
275 | r_tmp1, r_tmp2) | |
276 | LOG_MMU_ERR_GROUP_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
277 | r_tmp1, r_tmp2) | |
278 | CLEAR_MMU_ERR_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
279 | r_tmp1, r_tmp2) | |
280 | ba,a pcie_err_mondo_ereport | |
281 | .empty | |
282 | ||
283 | .mmu_err_group_s: | |
284 | PRINT("HV:mmu_err_group_s\r\n") | |
285 | set MMU_ERR_GROUP_P, r_tmp2 | |
286 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
287 | btst r_tmp2, r_tmp1 | |
288 | bz,pn %xcc, .mmu_block_processing_nothing_to_do | |
289 | and r_tmp2, r_tmp1, r_tmp2 | |
290 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_MMU_INTR_STATUS] | |
291 | LOG_DMC_MMU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
292 | r_tmp2) | |
293 | CLEAR_MMU_ERR_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
294 | r_tmp1, r_tmp2) | |
295 | ba,a clear_pcie_err_fire_interrupt | |
296 | .empty | |
297 | ||
298 | .mmu_block_processing_nothing_to_do: | |
299 | PRINT("HV:mmu_block_processing_nothing_to_do\r\n") | |
300 | ! we should not get here | |
301 | ba,a clear_pcie_err_fire_interrupt | |
302 | .empty | |
303 | ||
304 | ! read the PEC Core and Block Error Status Register (0x651808, 0x751808). | |
305 | ! This register describes which one or more than one of the 4 possible block(s) | |
306 | ! in the PEC Core has an error which needs to be processed. | |
307 | ! bit 0 set in this register the Mondo was caused by the a PEC OE register. | |
308 | ! bit 1 set in this register means the Mondo was caused by the PEC CE Register. | |
309 | ! bit 2 set in this register means the Mondo was caused by the PEC UE Register. | |
310 | ! bit 3 was set in this register the Mondo was caused by the ILU block. | |
311 | pec_core_processing: | |
312 | PRINT("HV:pec_core_processing\r\n") | |
313 | set FIRE_DLC_ILU_CIB_PEC_EN_ERR, r_tmp2 | |
314 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
315 | and r_tmp1, PEC_ILU_BIT, r_tmp2 | |
316 | brnz,a r_tmp2, .pec_ilu_processing | |
317 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_PEC_CORE_AND_BLOCK_INTR_STATUS] | |
318 | and r_tmp1, PEC_UE_BIT, r_tmp2 | |
319 | brnz,a r_tmp2, .pec_ue_processing | |
320 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_PEC_CORE_AND_BLOCK_INTR_STATUS] | |
321 | and r_tmp1, PEC_CE_BIT, r_tmp2 | |
322 | brnz,a r_tmp2, .pec_ce_processing | |
323 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_PEC_CORE_AND_BLOCK_INTR_STATUS] | |
324 | and r_tmp1, PEC_OE_BIT, r_tmp2 | |
325 | brnz,a,pt r_tmp2, .pec_oe_processing | |
326 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_PEC_CORE_AND_BLOCK_INTR_STATUS] | |
327 | ba,a clear_pcie_err_fire_interrupt | |
328 | .empty | |
329 | ||
330 | .pec_ilu_processing: | |
331 | .ilu_interrupt_status_p: | |
332 | PRINT("HV:ilu_interrupt_status_p\r\n") | |
333 | set FIRE_DLC_ILU_CIB_ILU_EN_ERR, r_tmp2 | |
334 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
335 | btst ILU_GROUP_P, r_tmp1 | |
336 | bz %xcc, .ilu_interrupt_status_s | |
337 | and r_tmp1, ILU_GROUP_P, r_tmp2 | |
338 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_ILU_INTR_STATUS] | |
339 | LOG_ILU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
340 | LOG_ILU_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
341 | CLEAR_ILU_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
342 | ||
343 | ba,a pcie_err_mondo_ereport | |
344 | .empty | |
345 | ||
346 | ||
347 | .ilu_interrupt_status_s: | |
348 | PRINT("HV:ilu_interrupt_status_s\r\n") | |
349 | set ILU_GROUP_P, r_tmp2 | |
350 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
351 | btst r_tmp2, r_tmp1 | |
352 | bz,pn %xcc, .ilu_nothing_todo | |
353 | and r_tmp2, r_tmp1, r_tmp2 | |
354 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_ILU_INTR_STATUS] | |
355 | LOG_ILU_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
356 | CLEAR_ILU_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
357 | ba,a clear_pcie_err_fire_interrupt | |
358 | .empty | |
359 | ||
360 | .ilu_nothing_todo: | |
361 | PRINT("HV:ilu_nothing_todo\r\n") | |
362 | ba,a clear_pcie_err_fire_interrupt | |
363 | .empty | |
364 | ||
365 | ! spec doesn't mention bits 15 and 13 | |
366 | ! bit 15 CA_P (Completer Abort Primary Error) does not capture any info | |
367 | ! As for the completer abort, this is a resultant of many of the MMU errors | |
368 | ! and not an error itself. | |
369 | ! bit 13 FCP_P (Flow Control Protocol Primary error) does not capture any info | |
370 | ! bits 17, 14 (rof, cto) | |
371 | ! TLU Transmit Uncorrectable Error Header1 Log Register (0x691038, 0x791038 ) | |
372 | ! TLU Transmit Uncorrectable Error Header2 Log Register (0x691040, 0x791040 ) | |
373 | ! | |
374 | ! | |
375 | ! clear with TLU Uncorrectable Error Status Clear Register (0x691018, 0x791018) | |
376 | ! no logging registers for bit 0 and 4 | |
377 | .pec_ue_processing: | |
378 | .tlu_uce_recv_group_p: | |
379 | PRINT("HV:tlu_uce_recv_group_p\r\n") | |
380 | set FIRE_PLC_TLU_CTB_TLR_UE_EN_ERR, r_tmp2 | |
381 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
382 | set TLU_UE_RECV_GROUP_P, r_tmp2 | |
383 | and r_tmp2, r_tmp1, r_tmp2 | |
384 | brz r_tmp2, .tlu_uce_trans_group_p | |
385 | nop | |
386 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
387 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
388 | LOG_TLU_UE_RCV_HDR_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
389 | r_tmp1, r_tmp2) | |
390 | LOG_TLU_UE_RECV_GROUP_EPKT_P(r_fire_e_rpt, r_fire_leaf_address,\ | |
391 | r_tmp1, r_tmp2) | |
392 | CLEAR_TLU_UE_RECV_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
393 | r_tmp1, r_tmp2) | |
394 | ba,a pcie_err_mondo_ereport | |
395 | .empty | |
396 | ||
397 | ||
398 | .tlu_uce_trans_group_p: | |
399 | PRINT("HV:tlu_uce_trans_group_p\r\n") | |
400 | set TLU_UE_TRANS_GROUP_P, r_tmp2 | |
401 | and r_tmp2, r_tmp1, r_tmp2 | |
402 | brz r_tmp2, .tlu_uce_tlu_dlp_p | |
403 | nop | |
404 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
405 | PRINT("r_tmp1 0x") | |
406 | PRINTX(r_tmp1) | |
407 | PRINT("\r\n") | |
408 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
409 | LOG_TLU_UE_TRANS_HDR_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
410 | r_tmp1, r_tmp2) | |
411 | LOG_TLU_UE_TRANS_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
412 | r_tmp1, r_tmp2) | |
413 | CLEAR_TLU_UE_TRANS_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
414 | r_tmp1, r_tmp2) | |
415 | ba,a pcie_err_mondo_ereport | |
416 | .empty | |
417 | ||
418 | .tlu_uce_tlu_dlp_p: | |
419 | /* | |
420 | * Special case error, no data, plus dup in another reg | |
421 | */ | |
422 | PRINT("HV:tlu_uce_tlu_dlp_p\r\n") | |
423 | set TLU_DLP_P, r_tmp2 | |
424 | and r_tmp2, r_tmp1, r_tmp2 | |
425 | brz r_tmp2, .tlu_uce_tlu_fcp_p | |
426 | nop | |
427 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
428 | PRINT("HV:r_tmp1 0x") | |
429 | PRINTX(r_tmp1) | |
430 | PRINT("\r\n") | |
431 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
432 | LOG_TLU_UE_DLP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
433 | r_tmp1, r_tmp2) | |
434 | CLEAR_TLU_UE_DLP_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
435 | r_tmp1, r_tmp2) | |
436 | ba,a pcie_err_mondo_ereport | |
437 | .empty | |
438 | ||
439 | .tlu_uce_tlu_fcp_p: | |
440 | PRINT("HV:tlu_uce_tlu_fcp_p\r\n") | |
441 | set TLU_FCP_P, r_tmp2 | |
442 | and r_tmp2, r_tmp1, r_tmp2 | |
443 | brz r_tmp2, .tlu_uce_tlu_ca_p | |
444 | nop | |
445 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
446 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
447 | LOG_TLU_UE_FCP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
448 | r_tmp1, r_tmp2) | |
449 | CLEAR_TLU_UE_FCP_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
450 | r_tmp2) | |
451 | ba,a pcie_err_mondo_ereport | |
452 | .empty | |
453 | ||
454 | ||
455 | .tlu_uce_tlu_ca_p: | |
456 | PRINT("HV:tlu_uce_tlu_fcp_p\r\n") | |
457 | set TLU_CA_P, r_tmp2 | |
458 | and r_tmp2, r_tmp1, r_tmp2 | |
459 | brz r_tmp2, .tlu_uce_tlu_dlp_s | |
460 | nop | |
461 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
462 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
463 | LOG_TLU_UE_CA_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
464 | r_tmp1, r_tmp2) | |
465 | CLEAR_TLU_UE_CA_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
466 | r_tmp2) | |
467 | ba,a pcie_err_mondo_ereport | |
468 | .empty | |
469 | ||
470 | .tlu_uce_tlu_dlp_s: | |
471 | /* | |
472 | * Special case error, no data, plus dup in another reg | |
473 | */ | |
474 | PRINT("HV:tlu_uce_tlu_dlp_s\r\n") | |
475 | set TLU_DLP_P, r_tmp2 | |
476 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
477 | and r_tmp2, r_tmp1, r_tmp2 | |
478 | brz r_tmp2, .tlu_uce_tlu_te_p | |
479 | nop | |
480 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
481 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
482 | LOG_TLU_UE_DLP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
483 | r_tmp1, r_tmp2) | |
484 | CLEAR_TLU_UE_DLP_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
485 | r_tmp1, r_tmp2) | |
486 | ba,a pcie_err_mondo_ereport | |
487 | .empty | |
488 | ||
489 | .tlu_uce_tlu_te_p: | |
490 | /* | |
491 | * Special case error, no data, plus dup in another reg | |
492 | */ | |
493 | PRINT("HV:tlu_uce_tlu_te_p\r\n") | |
494 | set TLU_TE_P, r_tmp2 | |
495 | and r_tmp2, r_tmp1, r_tmp2 | |
496 | brz r_tmp2, .tlu_uce_tlu_te_s | |
497 | nop | |
498 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
499 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
500 | LOG_TLU_UE_TE_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
501 | r_tmp1, r_tmp2) | |
502 | CLEAR_TLU_UE_TE_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
503 | r_tmp1, r_tmp2) | |
504 | ba,a pcie_err_mondo_ereport | |
505 | .empty | |
506 | ||
507 | .tlu_uce_tlu_te_s: | |
508 | /* | |
509 | * Special case error, no data, plus dup in another reg | |
510 | */ | |
511 | PRINT("HV:tlu_uce_tlu_te_s\r\n") | |
512 | set TLU_TE_P, r_tmp2 | |
513 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
514 | and r_tmp2, r_tmp1, r_tmp2 | |
515 | brz r_tmp2, .tlu_uce_recv_group_s | |
516 | nop | |
517 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
518 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
519 | LOG_TLU_UE_TE_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
520 | r_tmp1, r_tmp2) | |
521 | CLEAR_TLU_UE_TE_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
522 | r_tmp1, r_tmp2) | |
523 | ba,a pcie_err_mondo_ereport | |
524 | .empty | |
525 | ||
526 | .tlu_uce_recv_group_s: | |
527 | PRINT("HV:tlu_uce_recv_group_s\r\n") | |
528 | set TLU_UE_RECV_GROUP_P, r_tmp2 | |
529 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
530 | and r_tmp2, r_tmp1, r_tmp2 | |
531 | brz r_tmp2, .tlu_uce_trans_group_s | |
532 | nop | |
533 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
534 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
535 | LOG_TLU_UE_TRANS_HDR_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
536 | r_tmp1, r_tmp2) | |
537 | CLEAR_TLU_UE_RECV_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
538 | r_tmp1, r_tmp2) | |
539 | ba,a clear_pcie_err_fire_interrupt | |
540 | .empty | |
541 | ||
542 | .tlu_uce_trans_group_s: | |
543 | PRINT("HV:tlu_uce_trans_group_s\r\n") | |
544 | set TLU_UE_TRANS_GROUP_P, r_tmp2 | |
545 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
546 | and r_tmp2, r_tmp1, r_tmp2 | |
547 | brz,pn r_tmp2, .tlu_uce_tlu_fcp_s | |
548 | nop | |
549 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
550 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
551 | r_tmp2) | |
552 | LOG_TLU_UE_TRANS_EPKT_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
553 | r_tmp1, r_tmp2) | |
554 | CLEAR_TLU_UE_TRANS_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
555 | r_tmp1, r_tmp2) | |
556 | ba,a pcie_err_mondo_ereport | |
557 | .empty | |
558 | ||
559 | .tlu_uce_tlu_fcp_s: | |
560 | set TLU_FCP_P, r_tmp2 | |
561 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
562 | and r_tmp2, r_tmp1, r_tmp2 | |
563 | brz r_tmp2, .tlu_uce_tlu_ca_s | |
564 | nop | |
565 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
566 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
567 | LOG_TLU_UE_FCP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
568 | r_tmp1, r_tmp2) | |
569 | CLEAR_TLU_UE_FCP_S(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
570 | r_tmp2) | |
571 | ba,a pcie_err_mondo_ereport | |
572 | .empty | |
573 | ||
574 | .tlu_uce_tlu_ca_s: | |
575 | PRINT("HV:tlu_uce_tlu_ca_s\r\n") | |
576 | set TLU_CA_P, r_tmp2 | |
577 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
578 | and r_tmp2, r_tmp1, r_tmp2 | |
579 | brz r_tmp2, .tlu_uce_nothingtodo | |
580 | nop | |
581 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_UE_STATUS] | |
582 | LOG_TLU_UE_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
583 | LOG_TLU_UE_CA_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
584 | r_tmp1, r_tmp2) | |
585 | CLEAR_TLU_UE_CA_S(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
586 | r_tmp2) | |
587 | ba,a pcie_err_mondo_ereport | |
588 | .empty | |
589 | ||
590 | .tlu_uce_nothingtodo: | |
591 | PRINT("HV:tlu_uce_nothingtodo\r\n") | |
592 | PRINT("HV:r_tmp1 0x") | |
593 | PRINTX(r_tmp1) | |
594 | PRINT("\r\n") | |
595 | ba,a clear_pcie_err_fire_interrupt | |
596 | .empty | |
597 | ||
598 | .pec_ce_processing: | |
599 | .pec_ce_primary: | |
600 | PRINT("HV:pec_ce_processing\r\n") | |
601 | ! to clear dup regs , read page 392 of the november fire spec | |
602 | set FIRE_PLC_TLU_CTB_TLR_CE_EN_ERR, r_tmp2 | |
603 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
604 | PRINT("HV:FIRE_PLC_TLU_CTB_TLR_CE_EN_ERRR = 0x") | |
605 | PRINTX(r_tmp1) | |
606 | PRINT("\r\n") | |
607 | set TLU_CE_GROUP_P, r_tmp2 | |
608 | and r_tmp2, r_tmp1, r_tmp2 | |
609 | brz r_tmp2, .pec_ce_secondary | |
610 | nop | |
611 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_CE_INTR_STATUS] | |
612 | LOG_TLU_CE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
613 | r_tmp2) | |
614 | LOG_TLU_CE_GROUP_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
615 | r_tmp1, r_tmp2) | |
616 | CLEAR_TLU_CE_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
617 | r_tmp2) | |
618 | ba,a pcie_err_mondo_ereport | |
619 | .empty | |
620 | ||
621 | .pec_ce_secondary: | |
622 | PRINT("HV:pec_ce_secondary\r\n") | |
623 | set TLU_CE_GROUP_P, r_tmp2 | |
624 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
625 | and r_tmp2, r_tmp1, r_tmp2 | |
626 | brz,pn r_tmp2, .pec_ce_nothingtodo | |
627 | nop | |
628 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_TLU_CE_INTR_STATUS] | |
629 | LOG_TLU_CE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
630 | r_tmp2) | |
631 | LOG_TLU_CE_GROUP_EPKT_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
632 | r_tmp1, r_tmp2) | |
633 | CLEAR_TLU_CE_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, \ | |
634 | r_tmp2) | |
635 | ba,a pcie_err_mondo_ereport | |
636 | .empty | |
637 | ||
638 | .pec_ce_nothingtodo: | |
639 | #ifdef DEBUG | |
640 | PRINT("HV:pec_ce_nothingtodo\r\n") | |
641 | set FIRE_PLC_TLU_CTB_TLR_CE_EN_ERR, r_tmp2 | |
642 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
643 | PRINT("HV:FIRE_PLC_TLU_CTB_TLR_CE_EN_ERR:0x") | |
644 | PRINTX(r_tmp1) | |
645 | PRINT("\r\n") | |
646 | #endif | |
647 | ba,a clear_pcie_err_fire_interrupt | |
648 | .empty | |
649 | ||
650 | .pec_oe_processing: | |
651 | PRINT("HV:pec_oe_processing\r\n") | |
652 | .tlu_receive_other_event_p: | |
653 | PRINT("HV:tlu_receive_other_event_p\r\n") | |
654 | /* | |
655 | * Also logs trans regs | |
656 | */ | |
657 | set FIRE_PLC_TLU_CTB_TLR_OE_EN_ERR, r_tmp2 | |
658 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
659 | PRINT("HV:contents = 0x") | |
660 | PRINTX(r_tmp1) | |
661 | PRINT("\r\n") | |
662 | set TLU_OE_RECEIVE_GROUP_P, r_tmp2 | |
663 | btst r_tmp2, r_tmp1 | |
664 | bz %xcc, .tlu_oe_link_interrupt_group_p | |
665 | nop | |
666 | /* | |
667 | * Special, this set of errors also records some in the transmit | |
668 | * regs | |
669 | */ | |
670 | set TLU_OE_TRANS_GROUP_P, r_tmp2 | |
671 | btst r_tmp2, r_tmp1 | |
672 | .pushlocals | |
673 | bz %xcc, 1f | |
674 | nop | |
675 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
676 | r_tmp2) | |
677 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
678 | r_tmp1, r_tmp2, TLU_OE_RECEIVE_GROUP_P) | |
679 | LOG_TLU_OE_TRANS_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
680 | r_tmp1, r_tmp2) | |
681 | ba,a 2f | |
682 | .empty | |
683 | 1: | |
684 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
685 | r_tmp2) | |
686 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
687 | r_tmp1, r_tmp2, TLU_OE_RECEIVE_GROUP_P) | |
688 | 2: | |
689 | LOG_TLU_OE_RECV_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
690 | r_tmp1, r_tmp2) | |
691 | CLEAR_TLU_OE_RECV_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
692 | r_tmp1, r_tmp2) | |
693 | ba,a clear_pcie_err_fire_interrupt | |
694 | .empty | |
695 | .poplocals | |
696 | ||
697 | .tlu_receive_other_event_s: | |
698 | PRINT("HV:tlu_receive_other_event_s\r\n") | |
699 | set TLU_OE_RECEIVE_GROUP_P, r_tmp2 | |
700 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
701 | btst r_tmp2, r_tmp1 | |
702 | bz %xcc, .tlu_oe_dup_lli_s | |
703 | nop | |
704 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
705 | r_tmp2) | |
706 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
707 | r_tmp1, r_tmp2, TLU_OE_RECEIVE_GROUP_P) | |
708 | CLEAR_TLU_OE_RECV_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
709 | r_tmp1, r_tmp2) | |
710 | ba,a clear_pcie_err_fire_interrupt | |
711 | .empty | |
712 | ||
713 | .tlu_oe_dup_lli_s: | |
714 | PRINT("HV:tlu_oe_dup_lli_s\r\n") | |
715 | /* | |
716 | * these errors express themselves with possible duplicate bits | |
717 | * in the LPU Link Layer Interrupt reg (0x6e2210, 0x7e2210) | |
718 | */ | |
719 | set TLU_OE_DUP_LLI_P, r_tmp2 | |
720 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
721 | btst r_tmp2, r_tmp1 | |
722 | bz,pn %xcc, .pec_oe_processing_nothingtodo | |
723 | nop | |
724 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
725 | r_tmp2) | |
726 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
727 | r_tmp1, r_tmp2, TLU_OE_DUP_LLI_P) | |
728 | /* | |
729 | * bits 9 through 4 are the dup bits, yet we do not send any | |
730 | * info to the guest, so just clear them all. fma has received all | |
731 | * the info | |
732 | */ | |
733 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LL_ERR_INT(r_fire_e_rpt, \ | |
734 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
735 | CLEAR_TLU_OE_DUP_LLI_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
736 | r_tmp1, r_tmp2) | |
737 | ba,a clear_pcie_err_fire_interrupt | |
738 | .empty | |
739 | ||
740 | .tlu_oe_link_interrupt_group_p: | |
741 | PRINT("HV:.tlu_oe_link_interrupt_group_p\r\n") | |
742 | PRINT("HV:r_tmp1 = 0x") | |
743 | PRINTX(r_tmp1) | |
744 | PRINT("\r\n") | |
745 | set TLU_OE_LINK_INTERRUPT_GROUP_P, r_tmp2 | |
746 | btst r_tmp2, r_tmp1 | |
747 | bz %xcc, .tlu_trans_other_event_p | |
748 | nop | |
749 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
750 | r_tmp2) | |
751 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
752 | r_tmp1, r_tmp2, TLU_OE_LINK_INTERRUPT_GROUP_P) | |
753 | ||
754 | set FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_INTERRUPT_STATUS, r_tmp2 | |
755 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
756 | PRINT("HV:FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_INTERRUPT_STATUS\r\n") | |
757 | PRINTX(r_tmp1) | |
758 | PRINT("\r\n") | |
759 | and r_tmp1, LPU_INT_STAT_INT_PERF_CNTR_2_OVFLW, r_tmp2 | |
760 | brnz,pn r_tmp2, .lpu_int_stat_int_perf_cntr_2_ovflw | |
761 | nop | |
762 | and r_tmp1, LPU_INT_STAT_INT_PERF_CNTR_1_OVFLW, r_tmp2 | |
763 | brnz,pn r_tmp2, .lpu_int_stat_int_perf_cntr_1_ovflw | |
764 | nop | |
765 | and r_tmp1, LPU_INT_STAT_INT_LINK_LAYER, r_tmp2 | |
766 | brnz,pn r_tmp2, .lpu_int_stat_int_link_layer | |
767 | nop | |
768 | and r_tmp1, LPU_INT_STAT_INT_PHY_ERROR, r_tmp2 | |
769 | brnz,pn r_tmp2, .lpu_int_stat_int_phy_error | |
770 | nop | |
771 | and r_tmp1, LPU_INT_STAT_INT_LTSSM, r_tmp2 | |
772 | brnz,pn r_tmp2, .lpu_int_stat_int_ltssm | |
773 | nop | |
774 | and r_tmp1, LPU_INT_STAT_INT_PHY_TX, r_tmp2 | |
775 | brnz,pn r_tmp2, .lpu_int_stat_int_phy_tx | |
776 | nop | |
777 | and r_tmp1, LPU_INT_STAT_INT_PHY_RX, r_tmp2 | |
778 | brnz,pn r_tmp2, .lpu_int_stat_int_phy_rx | |
779 | nop | |
780 | and r_tmp1, LPU_INT_STAT_INT_PHY_GB, r_tmp2 | |
781 | brnz,pt r_tmp2, .lpu_int_stat_int_phy_gb | |
782 | nop | |
783 | ||
784 | .nothing_to_do_tlu_oe_link_interrupt_group_p: | |
785 | PRINT("HV:.nothing_to_do_tlu_oe_link_interrupt_group_p\r\n") | |
786 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
787 | .empty | |
788 | ||
789 | .lpu_int_stat_int_perf_cntr_2_ovflw: | |
790 | PRINT("HV:.lpu_int_stat_int_perf_cntr_2_ovflw\r\n") | |
791 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
792 | LPU_INT_STAT_INT_PERF_CNTR_2_OVFLW, r_tmp1, r_tmp2) | |
793 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LINK_PERF_CNTR2(r_fire_e_rpt, \ | |
794 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
795 | CLEAR_PERF_CNTR_2_OVFLW(r_fire_e_rpt, r_fire_leaf_address, \ | |
796 | r_tmp1, r_tmp2) | |
797 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
798 | .empty | |
799 | ||
800 | .lpu_int_stat_int_perf_cntr_1_ovflw: | |
801 | PRINT("HV:.lpu_int_stat_int_perf_cntr_1_ovflw\r\n") | |
802 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
803 | LPU_INT_STAT_INT_PERF_CNTR_1_OVFLW, r_tmp1, r_tmp2) | |
804 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LINK_PERF_CNTR1(r_fire_e_rpt, \ | |
805 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
806 | CLEAR_PERF_CNTR_1_OVFLW(r_fire_e_rpt, r_fire_leaf_address, \ | |
807 | r_tmp1, r_tmp2) | |
808 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
809 | .empty | |
810 | ||
811 | .lpu_int_stat_int_link_layer: | |
812 | PRINT("HV:.lpu_int_stat_int_link_layer\r\n") | |
813 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
814 | LPU_INT_STAT_INT_LINK_LAYER, r_tmp1, r_tmp2) | |
815 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LL_ERR_INT(r_fire_e_rpt, \ | |
816 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
817 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LL_ERR_INT(r_fire_e_rpt, \ | |
818 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
819 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
820 | .empty | |
821 | ||
822 | .lpu_int_stat_int_phy_error: | |
823 | PRINT("HV:.lpu_int_stat_int_phy_error\r\n") | |
824 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
825 | LPU_INT_STAT_INT_PHY_ERROR, r_tmp1, r_tmp2) | |
826 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_PHY_ERR_INT(r_fire_e_rpt, \ | |
827 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
828 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_PHY_ERR_INT(r_fire_e_rpt, \ | |
829 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
830 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
831 | .empty | |
832 | ||
833 | .lpu_int_stat_int_ltssm: | |
834 | PRINT("HV:.lpu_int_stat_int_ltssm\r\n") | |
835 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
836 | LPU_INT_STAT_INT_LTSSM, r_tmp1, r_tmp2) | |
837 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LTSSM(r_fire_e_rpt, \ | |
838 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
839 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LTSSM(r_fire_e_rpt, \ | |
840 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
841 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
842 | .empty | |
843 | ||
844 | .lpu_int_stat_int_phy_tx: | |
845 | PRINT("HV:.lpu_int_stat_int_phy_tx\r\n") | |
846 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
847 | LPU_INT_STAT_INT_PHY_TX, r_tmp1, r_tmp2) | |
848 | #ifdef DEBUG | |
849 | set FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_TX_PHY_INT, r_tmp2 | |
850 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
851 | PRINT("HV:LPU_INT_STAT_INT_PHY_TX\r\n") | |
852 | PRINTX(r_tmp1) | |
853 | PRINT("\r\n") | |
854 | #endif | |
855 | ||
856 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_TX_PHY_INT(r_fire_e_rpt, \ | |
857 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
858 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_TX_PHY_INT(r_fire_e_rpt, \ | |
859 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
860 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
861 | .empty | |
862 | ||
863 | .lpu_int_stat_int_phy_rx: | |
864 | PRINT("HV:.lpu_int_stat_int_phy_rx\r\n") | |
865 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
866 | LPU_INT_STAT_INT_PHY_RX, r_tmp1, r_tmp2) | |
867 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_RX_PHY_INT(r_fire_e_rpt, \ | |
868 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
869 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_RX_PHY_INT(r_fire_e_rpt, \ | |
870 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
871 | ba,a .all_done_tlu_oe_link_interrupt_group_p | |
872 | .empty | |
873 | ||
874 | .lpu_int_stat_int_phy_gb: | |
875 | PRINT("HV:.lpu_int_stat_int_phy_gb\r\n") | |
876 | LOG_PCIERPT_LPU_INTR_STATUS(r_fire_e_rpt, r_fire_leaf_address, \ | |
877 | LPU_INT_STAT_INT_PHY_GB, r_tmp1, r_tmp2) | |
878 | #ifdef DEBUG | |
879 | set FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_GB_GL_INT, r_tmp2 | |
880 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
881 | PRINT("HV:LPU_GB_STAT_INT_PHY_TX\r\n") | |
882 | PRINTX(r_tmp1) | |
883 | PRINT("\r\n") | |
884 | #endif | |
885 | LOG_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_GB_PHY_INT(r_fire_e_rpt, \ | |
886 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
887 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_GB_PHY_INT(r_fire_e_rpt, \ | |
888 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
889 | ||
890 | .all_done_tlu_oe_link_interrupt_group_p: | |
891 | PRINT("HV:all_done_tlu_oe_link_interrupt_group_p\r\n") | |
892 | set FIRE_PLC_TLU_CTB_TLR_OE_ERR_RW1C_ALIAS, r_tmp2 | |
893 | set TLU_OE_LINK_INTERRUPT_GROUP_P, r_tmp1 | |
894 | stx r_tmp1, [r_fire_leaf_address + r_tmp2] | |
895 | ||
896 | #ifdef DEBUG | |
897 | set FIRE_PLC_TLU_CTB_TLR_OE_ERR_RW1C_ALIAS, r_tmp2 | |
898 | ldx [r_fire_leaf_address + r_tmp2], r_tmp1 | |
899 | PRINT("HV:FIRE_PLC_TLU_CTB_TLR_OE_ERR_RW1C_ALIAS 0x") | |
900 | PRINTX(r_tmp1) | |
901 | PRINT("\r\n") | |
902 | #endif | |
903 | ba,a clear_pcie_err_fire_interrupt | |
904 | .empty | |
905 | ||
906 | .tlu_trans_other_event_p: | |
907 | PRINT("HV:tlu_trans_other_event_p\r\n") | |
908 | /* | |
909 | * Bits 22:21, 17, 16, and 15 | |
910 | * this test must happen after the recieve other event test | |
911 | * as both the transmit and recieve groups have overlap and | |
912 | * post info to both trans and receive regs. Since we tested | |
913 | * the overlap in the receive we won't need to test it here | |
914 | * in theory the only bit we should see is the one that only | |
915 | * posts to the trans reg | |
916 | */ | |
917 | set TLU_OE_TRANS_GROUP_P, r_tmp2 | |
918 | btst r_tmp2, r_tmp1 | |
919 | bz %xcc, .tlu_oe_no_dup_group_p | |
920 | nop | |
921 | set TLU_OE_TRANS_SVVS_RPT_MSK, r_tmp2 | |
922 | btst r_tmp2, r_tmp1 | |
923 | .pushlocals | |
924 | bz %xcc, 1f | |
925 | nop | |
926 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
927 | r_tmp2) | |
928 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
929 | r_tmp1, r_tmp2, TLU_OE_TRANS_GROUP_P) | |
930 | LOG_TLU_OE_TRANS_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
931 | r_tmp1, r_tmp2) | |
932 | LOG_TLU_OE_TRANS_GROUP_EPKT_P(r_fire_e_rpt, r_fire_leaf_address,\ | |
933 | r_tmp1, r_tmp2) | |
934 | CLEAR_TLU_OE_TRANS_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
935 | r_tmp1, r_tmp2) | |
936 | ba,a pcie_err_mondo_ereport | |
937 | .empty | |
938 | 1: | |
939 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
940 | r_tmp2) | |
941 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
942 | r_tmp1, r_tmp2, TLU_OE_TRANS_GROUP_P) | |
943 | LOG_TLU_OE_TRANS_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
944 | r_tmp1, r_tmp2) | |
945 | CLEAR_TLU_OE_TRANS_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
946 | r_tmp1, r_tmp2) | |
947 | ba,a clear_pcie_err_fire_interrupt | |
948 | .empty | |
949 | .poplocals | |
950 | ||
951 | .tlu_oe_no_dup_group_p: | |
952 | PRINT("HV:tlu_oe_no_dup_group_p\r\n") | |
953 | set TLU_OE_NO_DUP_GROUP_P, r_tmp2 | |
954 | btst r_tmp2, r_tmp1 | |
955 | bz,pn %xcc, .tlu_oe_dup_lli_p | |
956 | nop | |
957 | set TLU_OE_NO_DUP_SVVS_RPT_MSK, r_tmp2 | |
958 | btst r_tmp2, r_tmp1 | |
959 | .pushlocals | |
960 | bz %xcc, 1f | |
961 | nop | |
962 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
963 | r_tmp2) | |
964 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
965 | r_tmp1, r_tmp2, TLU_OE_NO_DUP_GROUP_P) | |
966 | LOG_TLU_OE_NO_DUP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
967 | r_tmp1, r_tmp2) | |
968 | CLEAR_TLU_OE_NO_DUP_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
969 | r_tmp1, r_tmp2) | |
970 | ba,a pcie_err_mondo_ereport | |
971 | .empty | |
972 | 1: | |
973 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
974 | r_tmp2) | |
975 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
976 | r_tmp1, r_tmp2, TLU_OE_NO_DUP_GROUP_P) | |
977 | CLEAR_TLU_OE_NO_DUP_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
978 | r_tmp1, r_tmp2) | |
979 | ba,a clear_pcie_err_fire_interrupt | |
980 | .empty | |
981 | .poplocals | |
982 | ||
983 | .tlu_oe_dup_lli_p: | |
984 | PRINT("HV:tlu_oe_dup_lli_p\r\n") | |
985 | /* | |
986 | * these errors express themselves with possible duplicate bits | |
987 | * in the LPU Link Layer Interrupt reg (0x6e2210, 0x7e2210) | |
988 | */ | |
989 | set TLU_OE_DUP_LLI_P, r_tmp2 | |
990 | btst r_tmp2, r_tmp1 | |
991 | bz,pn %xcc, .tlu_oe_no_dup_group_s | |
992 | nop | |
993 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
994 | r_tmp2) | |
995 | LOG_TLU_OE_INTR_STATUS_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
996 | r_tmp1, r_tmp2, TLU_OE_DUP_LLI_P) | |
997 | LOG_ILU_EPKT_P(r_fire_e_rpt, r_fire_leaf_address, r_tmp1, r_tmp2) | |
998 | /* | |
999 | * bits 9 through 4 are the dup bits, yet we do not send any | |
1000 | * info to the guest, so just clear them all. fma has recieved all | |
1001 | * the info | |
1002 | */ | |
1003 | CLEAR_FIRE_PLC_TLU_CTB_LPR_PCIE_LPU_LL_ERR_INT(r_fire_e_rpt, \ | |
1004 | r_fire_leaf_address, r_tmp1, r_tmp2) | |
1005 | CLEAR_TLU_OE_DUP_LLI_GROUP_P(r_fire_e_rpt, r_fire_leaf_address, \ | |
1006 | r_tmp1, r_tmp2) | |
1007 | ba,a pcie_err_mondo_ereport | |
1008 | .empty | |
1009 | ||
1010 | ||
1011 | .tlu_oe_no_dup_group_s: | |
1012 | PRINT("HV:tlu_oe_no_dup_group_s\r\n") | |
1013 | set TLU_OE_NO_DUP_GROUP_P, r_tmp2 | |
1014 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
1015 | btst r_tmp2, r_tmp1 | |
1016 | bz,pn %xcc, .tlu_trans_other_event_s | |
1017 | nop | |
1018 | set TLU_OE_NO_DUP_SVVS_RPT_MSK, r_tmp2 | |
1019 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
1020 | btst r_tmp2, r_tmp1 | |
1021 | .pushlocals | |
1022 | bz %xcc, 1f | |
1023 | nop | |
1024 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
1025 | r_tmp1, r_tmp2) | |
1026 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1027 | r_tmp1, r_tmp2, TLU_OE_NO_DUP_GROUP_P) | |
1028 | LOG_TLU_OE_NO_DUP_EPKT_P_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1029 | r_tmp1, r_tmp2) | |
1030 | CLEAR_TLU_OE_NO_DUP_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1031 | r_tmp1, r_tmp2) | |
1032 | ba,a pcie_err_mondo_ereport | |
1033 | .empty | |
1034 | 1: | |
1035 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
1036 | r_tmp1, r_tmp2) | |
1037 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1038 | r_tmp1, r_tmp2, TLU_OE_NO_DUP_GROUP_P) | |
1039 | CLEAR_TLU_OE_NO_DUP_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1040 | r_tmp1, r_tmp2) | |
1041 | ba,a clear_pcie_err_fire_interrupt | |
1042 | .empty | |
1043 | .poplocals | |
1044 | ||
1045 | .tlu_trans_other_event_s: | |
1046 | PRINT("HV:tlu_trans_other_event_s\r\n") | |
1047 | set TLU_OE_TRANS_GROUP_P, r_tmp2 | |
1048 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
1049 | btst r_tmp2, r_tmp1 | |
1050 | bz,pn %xcc, .tlu_oe_link_interrupt_group_s | |
1051 | nop | |
1052 | set TLU_OE_TRANS_SVVS_RPT_MSK, r_tmp2 | |
1053 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
1054 | btst r_tmp2, r_tmp1 | |
1055 | .pushlocals | |
1056 | bz %xcc, 1f | |
1057 | nop | |
1058 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
1059 | r_tmp2) | |
1060 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
1061 | r_tmp2, TLU_OE_TRANS_GROUP_P) | |
1062 | LOG_TLU_OE_TRANS_GROUP_EPKT_S(r_fire_e_rpt, r_fire_leaf_address,\ | |
1063 | r_tmp1, r_tmp2) | |
1064 | CLEAR_TLU_OE_TRANS_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1065 | r_tmp1, r_tmp2) | |
1066 | ba,a pcie_err_mondo_ereport | |
1067 | .empty | |
1068 | ||
1069 | 1: | |
1070 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, \ | |
1071 | r_tmp1, r_tmp2) | |
1072 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1073 | r_tmp1, r_tmp2, TLU_OE_TRANS_GROUP_P) | |
1074 | CLEAR_TLU_OE_TRANS_GROUP_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1075 | r_tmp1, r_tmp2) | |
1076 | ba,a clear_pcie_err_fire_interrupt | |
1077 | .empty | |
1078 | .poplocals | |
1079 | ||
1080 | .tlu_oe_link_interrupt_group_s: | |
1081 | PRINT("HV:tlu_oe_link_interrupt_group_s\r\n") | |
1082 | set TLU_OE_LINK_INTERRUPT_GROUP_P, r_tmp2 | |
1083 | sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2 | |
1084 | btst r_tmp2, r_tmp1 | |
1085 | bz %xcc, .tlu_receive_other_event_s | |
1086 | nop | |
1087 | LOG_TLU_OE_GROUP_REGS(r_fire_e_rpt, r_fire_leaf_address, r_tmp1,\ | |
1088 | r_tmp2) | |
1089 | LOG_TLU_OE_INTR_STATUS_S(r_fire_e_rpt, r_fire_leaf_address, \ | |
1090 | r_tmp1, r_tmp2, TLU_OE_LINK_INTERRUPT_GROUP_P) | |
1091 | ||
1092 | set FIRE_PLC_TLU_CTB_TLR_OE_ERR_RW1C_ALIAS, r_tmp2 | |
1093 | set TLU_OE_LINK_INTERRUPT_GROUP_P, r_tmp1 | |
1094 | sllx r_tmp1, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp1 | |
1095 | stx r_tmp1, [r_fire_leaf_address + r_tmp2] | |
1096 | ||
1097 | ba,a clear_pcie_err_fire_interrupt | |
1098 | .empty | |
1099 | ||
1100 | ||
1101 | pcie_err_mondo_ereport: | |
1102 | PCIE_ERR_MONDO_EREPORT(r_fire_cookie, r_fire_e_rpt, r_tmp1, r_tmp2) | |
1103 | clear_pcie_err_fire_interrupt: | |
1104 | CLEAR_FIRE_INTERRUPT(r_fire_cookie, PCIE_ERR_INO, r_tmp1) | |
1105 | GENERATE_FMA_REPORT; /* never returns */ | |
1106 | ||
1107 | jbc_err_mondo_ereport: | |
1108 | JBC_ERR_MONDO_EREPORT(r_fire_cookie, r_fire_e_rpt, r_tmp1, r_tmp2) | |
1109 | clear_jbc_err_fire_interrupt: | |
1110 | CLEAR_FIRE_INTERRUPT(r_fire_cookie, JBC_ERR_INO, r_tmp1) | |
1111 | GENERATE_FMA_REPORT; /* never returns */ | |
1112 | ||
1113 | .pec_oe_processing_nothingtodo: | |
1114 | PRINT("HV:pec_oe_processing_nothingtodo\r\n") | |
1115 | ba,a clear_pcie_err_fire_interrupt | |
1116 | .empty | |
1117 | ||
1118 | SET_SIZE(error_mondo_62) | |
1119 | ||
1120 | !! %g1 = Fire Cookie | |
1121 | !! %g2 = Mondo DATA0 | |
1122 | !! %g3 = IGN | |
1123 | !! %g4 = INO | |
1124 | ENTRY_NP(error_mondo_63) | |
1125 | PRINT("HV:mondo 63\r\n") | |
1126 | mov %g2, %g7 ! save DATA0 for err handle setup | |
1127 | !! | |
1128 | !! Generate a unique error handle | |
1129 | !! enters with: | |
1130 | !! %g1 loaded with fire cookie | |
1131 | !! %g2 data0, overwritten with r_fire_e_rpt | |
1132 | !! %g3 IGN | |
1133 | !! %g4 INO | |
1134 | !! %g5 scratch | |
1135 | !! %g6 scratch | |
1136 | !! %g7 data0 | |
1137 | !! | |
1138 | !! returns with: | |
1139 | !! %g1 r_fire_cookie | |
1140 | !! %g2 pointing to r_fire_e_rpt | |
1141 | !! | |
1142 | GEN_ERR_HNDL_SETUP_ERPTS(%g1, %g2, %g3, %g4, %g5, %g6, %g7) | |
1143 | ||
1144 | #define r_jbc_intr_status %g3 | |
1145 | #define r_jbus_base_addr %g4 | |
1146 | ||
1147 | ldx [r_fire_cookie + FIRE_COOKIE_JBUS], r_jbus_base_addr | |
1148 | set FIRE_JBC_ERROR_LOG_EN_REG, r_tmp1 /* 0x471000 */ | |
1149 | ldx [r_jbus_base_addr + r_tmp1], r_tmp2 | |
1150 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_ERR_LOG_ENABLE] | |
1151 | ||
1152 | /* 0x471020 */ | |
1153 | set FIRE_JBC_LOGGED_ERROR_STATUS_REG_RW1S_ALIAS, r_tmp1 | |
1154 | ldx [r_jbus_base_addr + r_tmp1], r_tmp2 | |
1155 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_ERROR_STATUS_SET_REG] | |
1156 | ||
1157 | set FIRE_JBC_ERROR_INT_EN_REG, r_tmp1 /* 0x471008 */ | |
1158 | ldx [r_jbus_base_addr + r_tmp1], r_tmp2 | |
1159 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_ENABLE] | |
1160 | ||
1161 | set FIRE_JBC_ENABLED_ERROR_STATUS_REG, r_tmp1 /* 0x471010 */ | |
1162 | ldx [r_jbus_base_addr + r_tmp1], r_jbc_intr_status | |
1163 | /* %g3 has the individual interrupt bits */ | |
1164 | ||
1165 | setx JBC_FATAL_GROUP, r_tmp2, r_tmp1 | |
1166 | btst r_jbc_intr_status, r_tmp1 | |
1167 | bnz %xcc, fatal_errors | |
1168 | .empty | |
1169 | ||
1170 | set FIRE_JBC_INTERRUPT_STATUS_REG, r_tmp1 /* 0x471808 */ | |
1171 | add r_jbus_base_addr, r_tmp1, r_tmp1 | |
1172 | ldx [r_tmp1], r_tmp2 | |
1173 | ||
1174 | set DMCINT_BIT, r_tmp1 ! Mask for dmcint type errors | |
1175 | btst r_tmp2, r_tmp1 | |
1176 | bnz %xcc, dmcint_errors | |
1177 | stx r_tmp1, [r_fire_e_rpt + PCIERPT_JBC_CORE_AND_BLOCK_ERR_STATUS] | |
1178 | ||
1179 | set JBCINT_BIT, r_tmp1 | |
1180 | btst r_tmp2, r_tmp1 | |
1181 | bnz %xcc, jbcint_errors | |
1182 | stx r_tmp1, [r_fire_e_rpt + PCIERPT_JBC_CORE_AND_BLOCK_ERR_STATUS] | |
1183 | ||
1184 | set MERGE_BIT, r_tmp1 | |
1185 | btst r_tmp2, r_tmp1 | |
1186 | bnz %xcc, merge_errors | |
1187 | stx r_tmp1, [r_fire_e_rpt + PCIERPT_JBC_CORE_AND_BLOCK_ERR_STATUS] | |
1188 | ||
1189 | set CSR_BIT, r_tmp1 | |
1190 | btst r_tmp2, r_tmp1 | |
1191 | bnz %xcc, csr_errors | |
1192 | stx r_tmp1, [r_fire_e_rpt + PCIERPT_JBC_CORE_AND_BLOCK_ERR_STATUS] | |
1193 | ||
1194 | ! Should not get here | |
1195 | PRINT("HV:Fall through on top level mondo 63 processing\r\n") | |
1196 | ba,a clear_jbc_err_fire_interrupt | |
1197 | .empty | |
1198 | ||
1199 | fatal_errors: | |
1200 | PRINT("HV:fatal_errors:\r\n") | |
1201 | set JBC_FATAL_LOGING_GROUP, r_tmp1 | |
1202 | btst r_tmp2, r_tmp1 | |
1203 | .pushlocals | |
1204 | bz %xcc, 1f | |
1205 | and r_tmp2, r_tmp1, r_tmp2 | |
1206 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_CORE_AND_BLOCK_ERR_STATUS] | |
1207 | LOG_JBUS_FATAL_REGS(r_fire_e_rpt, r_jbus_base_addr, r_tmp1, r_tmp2) | |
1208 | CLEAR_JBUS_FATAL_REGS(r_fire_e_rpt, r_jbus_base_addr, r_tmp1, r_tmp2) | |
1209 | ba,a clear_jbc_err_fire_interrupt | |
1210 | .empty | |
1211 | 1: | |
1212 | CLEAR_JBUS_FATAL_REGS(r_fire_e_rpt, r_jbus_base_addr, r_tmp1, r_tmp2) | |
1213 | ba,a clear_jbc_err_fire_interrupt | |
1214 | .empty | |
1215 | .poplocals | |
1216 | ||
1217 | dmcint_errors: | |
1218 | .dmcint.odc_p: | |
1219 | PRINT("HV:.dmcint.odc_p:\r\n") | |
1220 | PRINT("HV:setting reg to bits DMCINT_ODC_GROUP_P:0x") | |
1221 | setx DMCINT_ODC_GROUP_P, r_tmp2, r_tmp1 | |
1222 | PRINTX(r_tmp1) | |
1223 | PRINT("\r\n") | |
1224 | PRINT("HV:r_jbc_intr_status:0x") | |
1225 | PRINTX(r_jbc_intr_status) | |
1226 | PRINT("\r\n") | |
1227 | btst r_jbc_intr_status, r_tmp1 | |
1228 | bz %xcc, .dmcint.idc_p | |
1229 | and r_tmp1, r_jbc_intr_status, r_tmp2 | |
1230 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1231 | LOG_DMCINT_ODC_REGS(r_fire_e_rpt, r_jbus_base_addr, \ | |
1232 | r_tmp1, r_tmp2) | |
1233 | CLEAR_DMCINT_ODC_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1234 | r_tmp1, r_tmp2) | |
1235 | set DMCINT_ODC_SVVS_RPT_MSK, r_tmp1 | |
1236 | btst r_jbc_intr_status, r_tmp1 | |
1237 | .pushlocals | |
1238 | bnz %xcc, 1f | |
1239 | nop | |
1240 | ba,a clear_jbc_err_fire_interrupt | |
1241 | .empty | |
1242 | 1: | |
1243 | .poplocals | |
1244 | LOG_DMCINT_ODC_EPKT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1245 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1246 | ba,a jbc_err_mondo_ereport | |
1247 | .empty | |
1248 | ||
1249 | .dmcint.idc_p: | |
1250 | PRINT("HV:dmcint.idc_p:\r\n") | |
1251 | set DMCINT_IDC_GROUP_P, r_tmp1 | |
1252 | btst r_jbc_intr_status, r_tmp1 | |
1253 | bz %xcc, .dmcint.idc_s | |
1254 | and r_jbc_intr_status, DMCINT_IDC_GROUP_P, r_tmp2 | |
1255 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1256 | LOG_DMCINT_IDC_REGS(r_fire_e_rpt, r_jbus_base_addr, \ | |
1257 | r_tmp1, r_tmp2) | |
1258 | CLEAR_DMCINT_IDC_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1259 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1260 | /* no guest reports from this group */ | |
1261 | ba,a clear_jbc_err_fire_interrupt | |
1262 | .empty | |
1263 | ||
1264 | .dmcint.idc_s: | |
1265 | PRINT("HV:dmcint.idc_s:\r\n") | |
1266 | setx DMCINT_IDC_GROUP_S, r_tmp2, r_tmp1 | |
1267 | btst r_jbc_intr_status, r_tmp1 | |
1268 | bz %xcc, .dmcint.odc_s | |
1269 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1270 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1271 | CLEAR_DMCINT_IDC_S(r_fire_e_rpt, r_jbus_base_addr, \ | |
1272 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1273 | ba,a clear_jbc_err_fire_interrupt | |
1274 | .empty | |
1275 | ||
1276 | .dmcint.odc_s: | |
1277 | PRINT("HV:dmcint.odc_s:\r\n") | |
1278 | setx DMCINT_ODC_GROUP_S, r_tmp2, r_tmp1 | |
1279 | btst r_jbc_intr_status, r_tmp1 | |
1280 | bz,pn %xcc, .dmcint_nothingtodo | |
1281 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1282 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1283 | CLEAR_DMCINT_ODC_S(r_fire_e_rpt, r_jbus_base_addr, \ | |
1284 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1285 | ba,a clear_jbc_err_fire_interrupt | |
1286 | .empty | |
1287 | ||
1288 | .dmcint_nothingtodo: | |
1289 | PRINT("HV:dmcint_nothingtodo:\r\n") | |
1290 | ba,a clear_jbc_err_fire_interrupt | |
1291 | .empty | |
1292 | ||
1293 | jbcint_errors: | |
1294 | .jbcint_in_p: | |
1295 | PRINT("HV:jbcint_in_p:\r\n") | |
1296 | .pushlocals | |
1297 | set JBUSINT_IN_GROUP_P, r_tmp1 | |
1298 | btst r_jbc_intr_status, r_tmp1 | |
1299 | bz %xcc, .jbcint_out_p | |
1300 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1301 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1302 | LOG_JBCINT_IN_REGS(r_fire_e_rpt, r_jbus_base_addr, \ | |
1303 | r_tmp1, r_tmp2) | |
1304 | CLEAR_JBCINT_IN_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1305 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1306 | PRINT("HV:r_jbc_intr_status:0x") | |
1307 | PRINTX(r_jbc_intr_status) | |
1308 | PRINT("\r\n") | |
1309 | set JBUSINT_IN_SVVS_RPT_MSK, r_tmp1 | |
1310 | btst r_jbc_intr_status, r_tmp1 | |
1311 | bnz %xcc, 1f | |
1312 | nop | |
1313 | PRINT("HV:no guest report for jbcint_in_p\r\n") | |
1314 | ba,a clear_jbc_err_fire_interrupt | |
1315 | .empty | |
1316 | 1: | |
1317 | LOG_JBCINT_IN_EPKT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1318 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1319 | ba,a jbc_err_mondo_ereport | |
1320 | .empty | |
1321 | .poplocals | |
1322 | ||
1323 | .jbcint_out_p: | |
1324 | PRINT("HV:jbcint_out_p:\r\n") | |
1325 | .pushlocals | |
1326 | set JBUSINT_OUT_GROUP_P, r_tmp1 | |
1327 | btst r_jbc_intr_status, r_tmp1 | |
1328 | bz %xcc, .jbcint_in_s | |
1329 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1330 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1331 | LOG_JBCINT_OUT_REGS(r_fire_e_rpt, r_jbus_base_addr, \ | |
1332 | r_tmp1, r_tmp2) | |
1333 | CLEAR_JBCINT_OUT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1334 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1335 | /* no guest report ever for this group */ | |
1336 | set JBUSINT_OUT_SVVS_RPT_MSK, r_tmp1 | |
1337 | btst r_jbc_intr_status, r_tmp1 | |
1338 | bnz %xcc, 1f | |
1339 | nop | |
1340 | ba,a clear_jbc_err_fire_interrupt | |
1341 | .empty | |
1342 | 1: | |
1343 | LOG_JBCINT_OUT_EPKT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1344 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1345 | ba,a jbc_err_mondo_ereport | |
1346 | .empty | |
1347 | .poplocals | |
1348 | ||
1349 | .jbcint_in_s: | |
1350 | PRINT("HV:jbcint_in_s:\r\n") | |
1351 | setx JBUSINT_IN_GROUP_S, r_tmp2, r_tmp1 | |
1352 | btst r_jbc_intr_status, r_tmp1 | |
1353 | bz %xcc, .jbcint_out_s | |
1354 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1355 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1356 | CLEAR_JBCINT_IN_S(r_fire_e_rpt, r_jbus_base_addr, \ | |
1357 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1358 | ba,a clear_jbc_err_fire_interrupt | |
1359 | .empty | |
1360 | ||
1361 | .jbcint_out_s: | |
1362 | PRINT("HV:jbcint_out_s:\r\n") | |
1363 | setx JBUSINT_OUT_GROUP_S, r_tmp2, r_tmp1 | |
1364 | btst r_jbc_intr_status, r_tmp1 | |
1365 | bz,pn %xcc, .jbcint_nothingtodo | |
1366 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1367 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1368 | CLEAR_JBCINT_OUT_S(r_fire_e_rpt, r_jbus_base_addr, \ | |
1369 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1370 | ba,a clear_jbc_err_fire_interrupt | |
1371 | .empty | |
1372 | ||
1373 | .jbcint_nothingtodo: | |
1374 | PRINT("HV:jbcint_nothingtodo:\r\n") | |
1375 | ba,a clear_jbc_err_fire_interrupt | |
1376 | .empty | |
1377 | ||
1378 | merge_errors: | |
1379 | .merge_errors_p: | |
1380 | PRINT("HV:merge_errors_p::\r\n") | |
1381 | .pushlocals | |
1382 | set MERGE_GROUP_P, r_tmp1 | |
1383 | btst r_jbc_intr_status, r_tmp1 | |
1384 | bz %xcc, .merge_errors_s | |
1385 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1386 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1387 | LOG_MERGE_REGS(r_fire_e_rpt, r_jbus_base_addr, r_tmp1, r_tmp2) | |
1388 | CLEAR_MERGE_P(r_fire_e_rpt, r_jbus_base_addr, r_jbc_intr_status,\ | |
1389 | r_tmp1, r_tmp2) | |
1390 | set MERGE_SVVS_RPT_MSK, r_tmp1 | |
1391 | btst r_jbc_intr_status, r_tmp1 | |
1392 | bnz %xcc, 1f | |
1393 | nop | |
1394 | ba,a clear_jbc_err_fire_interrupt | |
1395 | .empty | |
1396 | 1: | |
1397 | LOG_MERGE_ERROR_EPKT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1398 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1399 | ba,a jbc_err_mondo_ereport | |
1400 | .empty | |
1401 | .poplocals | |
1402 | ||
1403 | .merge_errors_s: | |
1404 | PRINT("HV:merge_errors_s:\r\n") | |
1405 | setx MERGE_GROUP_S, r_tmp2, r_tmp1 | |
1406 | btst r_jbc_intr_status, r_tmp1 | |
1407 | bz,pn %xcc, .merge_errors_nothingtodo | |
1408 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1409 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1410 | CLEAR_MERGE_S(r_fire_e_rpt, r_jbus_base_addr, r_jbc_intr_status,\ | |
1411 | r_tmp1, r_tmp2) | |
1412 | ba,a clear_jbc_err_fire_interrupt | |
1413 | .empty | |
1414 | ||
1415 | .merge_errors_nothingtodo: | |
1416 | PRINT("HV:merge_errors_nothingtodo:\r\n") | |
1417 | ba,a clear_jbc_err_fire_interrupt | |
1418 | .empty | |
1419 | ||
1420 | ||
1421 | csr_errors: | |
1422 | .csr_errors_p: | |
1423 | PRINT("HV:csr_errors_p:\r\n") | |
1424 | .pushlocals | |
1425 | set CSR_GROUP_P, r_tmp1 | |
1426 | btst r_jbc_intr_status, r_tmp1 | |
1427 | bz %xcc, .csr_errors_s | |
1428 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1429 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1430 | LOG_CSR_REGS(r_fire_e_rpt, r_jbus_base_addr, r_tmp1, r_tmp2) | |
1431 | CLEAR_CSR_P(r_fire_e_rpt, r_jbus_base_addr, r_jbc_intr_status, \ | |
1432 | r_tmp1, r_tmp2) | |
1433 | set CSR_SVVS_RPT_MSK, r_tmp1 | |
1434 | btst r_jbc_intr_status, r_tmp1 | |
1435 | bnz %xcc, 1f | |
1436 | nop | |
1437 | ba,a clear_jbc_err_fire_interrupt | |
1438 | .empty | |
1439 | 1: | |
1440 | LOG_CSR_ERRORS_P_EPKT_P(r_fire_e_rpt, r_jbus_base_addr, \ | |
1441 | r_jbc_intr_status, r_tmp1, r_tmp2) | |
1442 | ba,a jbc_err_mondo_ereport | |
1443 | .empty | |
1444 | .poplocals | |
1445 | ||
1446 | .csr_errors_s: | |
1447 | PRINT("HV:csr_errors_s:\r\n") | |
1448 | setx CSR_GROUP_S, r_tmp2, r_tmp1 | |
1449 | btst r_jbc_intr_status, r_tmp1 | |
1450 | bz,pn %xcc, .csr_errors_nothingtodo | |
1451 | .empty | |
1452 | and r_jbc_intr_status, r_tmp1, r_tmp2 | |
1453 | stx r_tmp2, [r_fire_e_rpt + PCIERPT_JBC_INTR_STATUS] | |
1454 | CLEAR_CSR_S(r_fire_e_rpt, r_jbus_base_addr, r_jbc_intr_status, \ | |
1455 | r_tmp1, r_tmp2) | |
1456 | ba,a clear_jbc_err_fire_interrupt | |
1457 | .empty | |
1458 | ||
1459 | .csr_errors_nothingtodo: | |
1460 | PRINT("HV:csr_errors_nothingtodo:\r\n") | |
1461 | ba,a clear_jbc_err_fire_interrupt | |
1462 | .empty | |
1463 | ||
1464 | SET_SIZE(error_mondo_63) | |
1465 | ||
1466 | ||
1467 | /* | |
1468 | * %g2 pointing to ereport buffer, i.e. r_fire_e_rpt | |
1469 | * so jbus is special, sometimes we need to send ereports | |
1470 | * to both leafs since we don't really know which leaf | |
1471 | * generated the error. We do this here, by xor'ing bit | |
1472 | * 7 of word 0 before we send it then call generate_guest_report | |
1473 | */ | |
1474 | ENTRY_NP(generate_guest_report_special) | |
1475 | ||
1476 | /* | |
1477 | * this error code is completely unintelligible ... | |
1478 | * hopefully this register usage is OK but who can tell ??? | |
1479 | * | |
1480 | * The PA has been inserted into the PCI error packet, now | |
1481 | * translate to a RA | |
1482 | */ | |
1483 | ldx [r_fire_e_rpt + PCIERPT_ERROR_PADDR], r_tmp2 | |
1484 | RADDR_IS_IO_XCCNEG(r_tmp2, r_tmp1) | |
1485 | bneg %xcc, .generate_guest_report_special_ra2pa_done ! do nothing | |
1486 | nop | |
1487 | ||
1488 | GUEST_STRUCT(r_tmp1) | |
1489 | PA2RA_CONV(r_tmp1, r_tmp2, %g6, %g3, %g4) | |
1490 | ! %g6 RADDR | |
1491 | stx %g6, [r_fire_e_rpt + PCIERPT_ERROR_RADDR] | |
1492 | ||
1493 | .generate_guest_report_special_ra2pa_done: | |
1494 | ||
1495 | /* | |
1496 | * Is other leaf on? | |
1497 | */ | |
1498 | PRINT("HV:Is other leaf is on?\r\n") | |
1499 | ldx [r_fire_e_rpt + PCIERPT_SYSINO], r_tmp1 ! PCIERPT_SYSINO | |
1500 | srlx r_tmp1, FIRE_DEVINO_SHIFT, r_tmp1 | |
1501 | and r_tmp1, FIRE_LEAF_DEVID_MASK, r_tmp1 ! devid 0 or 1 | |
1502 | btog 1, r_tmp1 ! make it other dev id | |
1503 | ldx [r_fire_cookie + FIRE_COOKIE_VIRTUAL_INTMAP], r_tmp2 | |
1504 | ldub [r_tmp2 + r_tmp1], r_tmp2 | |
1505 | brz r_tmp2, generate_guest_report ! if off don't send a ereport | |
1506 | ! for other leaf | |
1507 | nop | |
1508 | PRINT("HV:other leaf is on!\r\n") | |
1509 | CPU_PUSH(r_fire_cookie, r_tmp1, r_tmp2, %g6) | |
1510 | CPU_PUSH(r_fire_e_rpt, r_tmp1, r_tmp2, %g6) | |
1511 | add r_fire_e_rpt, PCIERPT_SYSINO, %g1 | |
1512 | /* | |
1513 | * fixup mondo to report other leaf | |
1514 | */ | |
1515 | ldx [%g1], %g3 | |
1516 | btog 0x40, %g3 ! flip bit 7 | |
1517 | stx %g3, [%g1] | |
1518 | STRAND_PUSH(%g1, r_tmp1, r_tmp2) | |
1519 | HVCALL(insert_device_mondo_p) | |
1520 | STRAND_POP(%g1, r_tmp1) | |
1521 | PRINT("HV:calling:generate_guest_report\r\n") | |
1522 | ||
1523 | /* | |
1524 | * fixup mondo to report current leaf | |
1525 | */ | |
1526 | ldx [%g1], %g3 | |
1527 | btog 0x40, %g3 ! flip bit 7 | |
1528 | stx %g3, [%g1] | |
1529 | ||
1530 | CPU_POP(r_fire_e_rpt, r_tmp1, r_tmp2, %g6) | |
1531 | CPU_POP(r_fire_cookie, r_tmp1, r_tmp2, %g6) | |
1532 | ||
1533 | PRINT("HV:Is this leaf on?\r\n") | |
1534 | ldx [r_fire_e_rpt + PCIERPT_SYSINO], r_tmp1 ! PCIERPT_SYSINO | |
1535 | srlx r_tmp1, FIRE_DEVINO_SHIFT, r_tmp1 | |
1536 | and r_tmp1, FIRE_LEAF_DEVID_MASK, r_tmp1 ! devid 0 or 1 | |
1537 | ldx [r_fire_cookie + FIRE_COOKIE_VIRTUAL_INTMAP], r_tmp2 | |
1538 | ldub [r_tmp2 + r_tmp1], r_tmp2 | |
1539 | brnz r_tmp2, generate_guest_report ! It's on send it | |
1540 | nop | |
1541 | /* | |
1542 | * This one is off, but this one took the interrupt | |
1543 | * so we must clear the interrupt ourselves | |
1544 | */ | |
1545 | ba,a clear_jbc_err_fire_interrupt | |
1546 | .empty | |
1547 | SET_SIZE(generate_guest_report_special) | |
1548 | ||
1549 | /* | |
1550 | * %g2 pointing to ereport buffer, i.e. r_fire_e_rpt | |
1551 | */ | |
1552 | ENTRY_NP(generate_guest_report) | |
1553 | add r_fire_e_rpt, PCIERPT_SYSINO, %g1 | |
1554 | #ifdef DEBUG | |
1555 | PRINT("HV:generate_guest_report\r\n") | |
1556 | PRINT("\r\n") | |
1557 | ldx [%g1 + 0x00], %g3 | |
1558 | PRINT("HV:word0:0x") | |
1559 | PRINTX(%g3) | |
1560 | PRINT("\r\n") | |
1561 | ldx [%g1 + 0x08], %g3 | |
1562 | PRINT("HV:word1:0x") | |
1563 | PRINTX(%g3) | |
1564 | PRINT("\r\n") | |
1565 | ldx [%g1 + 0x10], %g3 | |
1566 | PRINT("HV:word2:0x") | |
1567 | PRINTX(%g3) | |
1568 | PRINT("\r\n") | |
1569 | ldx [%g1 + 0x18], %g3 | |
1570 | PRINT("HV:word3:0x") | |
1571 | PRINTX(%g3) | |
1572 | PRINT("\r\n") | |
1573 | ldx [%g1 + 0x20], %g3 | |
1574 | PRINT("HV:word4:0x") | |
1575 | PRINTX(%g3) | |
1576 | PRINT("\r\n") | |
1577 | ldx [%g1 + 0x28], %g3 | |
1578 | PRINT("HV:word5:0x") | |
1579 | PRINTX(%g3) | |
1580 | PRINT("\r\n") | |
1581 | ldx [%g1 + 0x30], %g3 | |
1582 | PRINT("HV:word6:0x") | |
1583 | PRINTX(%g3) | |
1584 | PRINT("\r\n") | |
1585 | ldx [%g1 + 0x38], %g3 | |
1586 | PRINT("HV:word7:0x") | |
1587 | PRINTX(%g3) | |
1588 | PRINT("\r\n") | |
1589 | PRINT("HV:calling:insert_device_mondo_p\r\n") | |
1590 | #endif | |
1591 | STRAND_PUSH(r_fire_e_rpt, r_tmp1, r_tmp2) | |
1592 | HVCALL(insert_device_mondo_p) | |
1593 | STRAND_POP(r_fire_e_rpt, r_tmp1) | |
1594 | mov r_fire_e_rpt, %g1 | |
1595 | PRINT("HV:calling:generate_fma_report\r\n") | |
1596 | /* | |
1597 | * %g1 r_fire_e_rpt | |
1598 | */ | |
1599 | ba,a generate_fma_report | |
1600 | .empty | |
1601 | SET_SIZE(generate_guest_report) | |
1602 | /* | |
1603 | * %g1 pointing to fire error buffer | |
1604 | */ | |
1605 | ENTRY_NP(generate_fma_report) | |
1606 | ||
1607 | ! set %g2 to point to unsent flag | |
1608 | add %g1, PCI_UNSENT_PKT, %g2 | |
1609 | ||
1610 | ! set %g1 to point to vbsc err report | |
1611 | add %g1, PCI_ERPT_U, %g1 | |
1612 | ||
1613 | ! set %g3 to contain the size of the buf | |
1614 | mov PCIERPT_SIZE - EPKTSIZE, %g3 | |
1615 | ||
1616 | HVCALL(send_diag_erpt) | |
1617 | ||
1618 | PRINT("HV:all done with fire error processing, fma report sent\r\n") | |
1619 | retry | |
1620 | SET_SIZE(generate_fma_report) | |
1621 | ||
1622 | !! | |
1623 | !! fire_err_mondo_receive | |
1624 | !! | |
1625 | !! %g1 = Fire Cookie | |
1626 | !! %g2 = Mondo DATA0 | |
1627 | !! %g3 = IGN | |
1628 | !! %g4 = INO | |
1629 | !! | |
1630 | ENTRY_NP(fire_err_mondo_receive) | |
1631 | /* | |
1632 | * is it mondo 62 or 63 | |
1633 | */ | |
1634 | cmp %g4, JBC_ERR_INO ! 63 | |
1635 | beq,pt %xcc, error_mondo_63 | |
1636 | cmp %g4, PCIE_ERR_INO ! 62 | |
1637 | beq,pt %xcc, error_mondo_62 | |
1638 | nop | |
1639 | ba insert_device_mondo_r | |
1640 | rd %pc, %g7 | |
1641 | retry | |
1642 | SET_SIZE(fire_err_mondo_receive) | |
1643 | ||
1644 | !! | |
1645 | !! fire_err_intr_getvalid | |
1646 | !! | |
1647 | !! %g1 Fire Cookie Pointer | |
1648 | !! arg0 Virtual INO (%o0) | |
1649 | !! -- | |
1650 | !! ret0 status (%o0) | |
1651 | !! ret1 intr valid state (%o1) | |
1652 | !! | |
1653 | ENTRY_NP(fire_err_intr_getvalid) | |
1654 | and %o0, FIRE_DEVINO_MASK, %g2 | |
1655 | cmp %g2, JBC_ERR_INO ! is it mondo 63 | |
1656 | mov JBC_ERR_MONDO_OFFSET, %g4 | |
1657 | movne %xcc, PCIE_ERR_MONDO_OFFSET, %g4 | |
1658 | srlx %o0, FIRE_DEVINO_SHIFT, %g2 | |
1659 | and %g2, FIRE_LEAF_DEVID_MASK, %g2 ! devid 0 or 1 | |
1660 | ldx [%g1 + FIRE_COOKIE_VIRTUAL_INTMAP], %g6 | |
1661 | add %g6, %g4, %g6 ! JBC or PCIE offset | |
1662 | ldub [%g6 + %g2], %g6 | |
1663 | mov INTR_DISABLED, %o1 | |
1664 | movrz %g6, INTR_ENABLED, %o1 | |
1665 | HCALL_RET(EOK) | |
1666 | SET_SIZE(fire_err_intr_getvalid) | |
1667 | ||
1668 | !! | |
1669 | !! fire_err_intr_setvalid | |
1670 | !! | |
1671 | !! %g1 Fire Cookie Pointer | |
1672 | !! arg0 Virtual INO (%o0) | |
1673 | !! arg1 intr valid state (%o1) 1: Valid 0: Invalid | |
1674 | !! -- | |
1675 | !! ret0 status (%o0) | |
1676 | !! | |
1677 | ||
1678 | ENTRY_NP(fire_err_intr_setvalid) | |
1679 | mov %o0, %g2 | |
1680 | mov %o1, %g3 | |
1681 | HVCALL(_fire_err_intr_setvalid) | |
1682 | ||
1683 | ! _fire_err_intr_setvalid doesn't have any failure cases | |
1684 | ! so it is safe to just return EOK | |
1685 | HCALL_RET(EOK) | |
1686 | SET_SIZE(fire_err_intr_setvalid) | |
1687 | ||
1688 | !! | |
1689 | !! _fire_err_intr_setvalid | |
1690 | !! %g1 Fire Cookie Pointer | |
1691 | !! %g2 device ino | |
1692 | !! %g3 Valid/Invalid | |
1693 | !! | |
1694 | ENTRY_NP(_fire_err_intr_setvalid) | |
1695 | and %g2, FIRE_DEVINO_MASK, %g5 | |
1696 | cmp %g5, JBC_ERR_INO ! is it mondo 63 | |
1697 | mov JBC_ERR_MONDO_OFFSET, %g4 | |
1698 | movne %xcc, PCIE_ERR_MONDO_OFFSET, %g4 | |
1699 | ldx [%g1 + FIRE_COOKIE_VIRTUAL_INTMAP], %g6 | |
1700 | srlx %g2, FIRE_DEVINO_SHIFT, %g5 | |
1701 | and %g5, FIRE_LEAF_DEVID_MASK, %g5 ! devid 0 or 1 | |
1702 | add %g6, %g4, %g6 ! virtual intmap + mondo offset | |
1703 | stb %g3, [%g6 + %g5] | |
1704 | ||
1705 | HVRET | |
1706 | SET_SIZE(_fire_err_intr_setvalid) | |
1707 | ||
1708 | !! | |
1709 | !! fire_err_intr_getstate | |
1710 | !! | |
1711 | !! %g1 Fire Cookie Pointer | |
1712 | !! arg0 Virtual INO (%o0) | |
1713 | !! -- | |
1714 | !! ret0 status (%o0) | |
1715 | !! ret1 (%o1) 1: Pending / 0: Idle | |
1716 | !! | |
1717 | ENTRY_NP(fire_err_intr_getstate) | |
1718 | ba,a fire_intr_getstate | |
1719 | .empty | |
1720 | SET_SIZE(fire_err_intr_getstate) | |
1721 | ||
1722 | !! | |
1723 | !! fire_err_intr_setstate | |
1724 | !! | |
1725 | !! %g1 Fire Cookie Pointer | |
1726 | !! arg0 Virtual INO (%o0) | |
1727 | !! arg1 (%o1) 1: Pending / 0: Idle | |
1728 | !! -- | |
1729 | !! ret0 status (%o0) | |
1730 | !! | |
1731 | ENTRY_NP(fire_err_intr_setstate) | |
1732 | ba,a fire_intr_setstate | |
1733 | .empty | |
1734 | SET_SIZE(fire_err_intr_setstate) | |
1735 | ||
1736 | !! | |
1737 | !! fire_err_intr_gettarget | |
1738 | !! | |
1739 | !! %g1 Fire Cookie Pointer | |
1740 | !! arg0 Virtual INO (%o0) | |
1741 | !! -- | |
1742 | !! ret0 status (%o0) | |
1743 | !! ret1 cpuid (%o1) | |
1744 | !! | |
1745 | ENTRY_NP(fire_err_intr_gettarget) | |
1746 | ba,a fire_intr_gettarget | |
1747 | .empty | |
1748 | SET_SIZE(fire_err_intr_gettarget) | |
1749 | ||
1750 | !! | |
1751 | !! fire_err_intr_settarget | |
1752 | !! | |
1753 | !! %g1 Fire Cookie Pointer | |
1754 | !! arg0 Virtual INO (%o0) | |
1755 | !! arg1 cpuid (%o1) | |
1756 | !! -- | |
1757 | !! ret0 status (%o0) | |
1758 | !! | |
1759 | ENTRY_NP(fire_err_intr_settarget) | |
1760 | ba,a fire_intr_settarget | |
1761 | .empty | |
1762 | SET_SIZE(fire_err_intr_settarget) | |
1763 | ||
1764 | ||
1765 | !! | |
1766 | !! fire_err_intr_redistribution | |
1767 | !! %g1 - this cpu | |
1768 | !! %g2 - tgt cpu | |
1769 | !! | |
1770 | !! Generates each INO and calls the function that actually | |
1771 | !! does the work | |
1772 | !! | |
1773 | ENTRY_NP(fire_err_intr_redistribution) | |
1774 | CPU_PUSH(%g7, %g3, %g4, %g5) | |
1775 | ||
1776 | mov %g2, %g1 | |
1777 | CPU_PUSH(%g1, %g3, %g4, %g5) | |
1778 | mov FIRE_A_AID << FIRE_DEVINO_SHIFT, %g4 | |
1779 | or %g4, JBC_ERR_INO, %g3 | |
1780 | HVCALL(_fire_err_intr_redistribution) | |
1781 | ||
1782 | CPU_POP(%g1, %g3, %g4, %g5) | |
1783 | CPU_PUSH(%g1, %g3, %g4, %g5) | |
1784 | mov FIRE_A_AID << FIRE_DEVINO_SHIFT, %g4 | |
1785 | or %g4, PCIE_ERR_INO, %g3 | |
1786 | HVCALL(_fire_err_intr_redistribution) | |
1787 | ||
1788 | CPU_POP(%g1, %g3, %g4, %g5) | |
1789 | CPU_PUSH(%g1, %g3, %g4, %g5) | |
1790 | mov FIRE_B_AID << FIRE_DEVINO_SHIFT, %g4 | |
1791 | or %g4, JBC_ERR_INO, %g3 | |
1792 | HVCALL(_fire_err_intr_redistribution) | |
1793 | ||
1794 | CPU_POP(%g1, %g3, %g4, %g5) | |
1795 | CPU_PUSH(%g1, %g3, %g4, %g5) | |
1796 | mov FIRE_B_AID << FIRE_DEVINO_SHIFT, %g4 | |
1797 | or %g4, PCIE_ERR_INO, %g3 | |
1798 | HVCALL(_fire_err_intr_redistribution) | |
1799 | CPU_POP(%g1, %g3, %g4, %g5) | |
1800 | ||
1801 | CPU_POP(%g7, %g3, %g4, %g5) | |
1802 | HVRET | |
1803 | SET_SIZE(fire_err_intr_redistribution) | |
1804 | ||
1805 | /* | |
1806 | * _fire_err_intr_redistribution | |
1807 | * | |
1808 | * %g1 - tgt cpu | |
1809 | * %g3 - INO | |
1810 | */ | |
1811 | ENTRY_NP(_fire_err_intr_redistribution) | |
1812 | CPU_PUSH(%g7, %g4, %g5, %g6) | |
1813 | CPU_PUSH(%g1, %g4, %g5, %g6) ! save tgt cpu | |
1814 | CPU_PUSH(%g3, %g4, %g5, %g6) ! save INO | |
1815 | ||
1816 | GUEST_STRUCT(%g4) | |
1817 | ! get dev | |
1818 | srlx %g3, FIRE_DEVINO_SHIFT, %g6 | |
1819 | DEVINST2INDEX(%g4, %g6, %g6, %g5, ._fire_err_intr_redistribution_fail) | |
1820 | DEVINST2COOKIE(%g4, %g6, %g1, %g5, ._fire_err_intr_redistribution_fail) | |
1821 | ||
1822 | and %g3, FIRE_DEVINO_MASK, %g2 | |
1823 | ||
1824 | !! %g1 = Fire Cookie | |
1825 | !! %g2 = device ino | |
1826 | HVCALL(_fire_intr_gettarget) | |
1827 | !! %g3 phys cpuid for this ino | |
1828 | ||
1829 | STRAND_STRUCT(%g2) /* FIXME: this ok ? */ | |
1830 | ldub [%g2 + STRAND_ID], %g2 | |
1831 | ||
1832 | !! %g2 this cpu (strand) id | |
1833 | cmp %g3, %g2 | |
1834 | bne %xcc, ._fire_err_intr_redistribution_done | |
1835 | nop | |
1836 | ||
1837 | ! deal with virtual portion | |
1838 | CPU_POP(%g2, %g4, %g6, %g7) | |
1839 | mov INTR_DISABLED, %g3 | |
1840 | !! %g1 = Fire cookie | |
1841 | !! %g2 = vino | |
1842 | !! %g3 = Disable | |
1843 | HVCALL(_fire_err_intr_setvalid) | |
1844 | ||
1845 | ! set new target | |
1846 | and %g2, FIRE_DEVINO_MASK, %g2 | |
1847 | CPU_POP(%g3, %g4, %g6, %g7) | |
1848 | !! %g1 = Fire Cookie Ptr | |
1849 | !! %g2 = device ino | |
1850 | !! %g3 = Physical target CPU id | |
1851 | HVCALL(_fire_intr_settarget) | |
1852 | ||
1853 | ! clear state machine | |
1854 | mov INTR_IDLE, %g3 | |
1855 | !! %g1 = Fire cookie | |
1856 | !! %g2 = device ino | |
1857 | !! %g3 = Idle | |
1858 | HVCALL(_fire_intr_setstate) | |
1859 | ||
1860 | ba,a ._fire_err_intr_redistribution_exit | |
1861 | ||
1862 | ._fire_err_intr_redistribution_done: | |
1863 | CPU_POP(%g3, %g4, %g5, %g6) | |
1864 | CPU_POP(%g1, %g3, %g4, %g5) | |
1865 | ._fire_err_intr_redistribution_exit: | |
1866 | CPU_POP(%g7, %g3, %g4, %g5) | |
1867 | HVRET | |
1868 | ._fire_err_intr_redistribution_fail: | |
1869 | CPU_POP(%g3, %g4, %g5, %g6) | |
1870 | CPU_POP(%g1, %g3, %g4, %g5) | |
1871 | ba hvabort | |
1872 | rd %pc, %g1 | |
1873 | ||
1874 | SET_SIZE(_fire_err_intr_redistribution) | |
1875 | #endif /* CONFIG_FIRE */ |