* ========== Copyright Header Begin ==========================================
* Hypervisor Software File: vpiu_errs.s
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* - Do no alter or remove copyright notices
* - Redistribution and use of this software in source and binary forms, with
* or without modification, are permitted provided that the following
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
* MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
* OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
* SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or maintenance of
* ========== Copyright Header End ============================================
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
.ident "@(#)vpiu_errs.s 1.2 07/05/15 SMI"
#include <sys/asm_linkage.h>
#define r_piu_leaf_address %g4
#define PIU_PRINTX PRINTX
#define PIU_ERR_PRINT(s, piu, off, scr1, scr2) \
ldx [piu + PIU_COOKIE_PCIE], scr2 ;\
ldx [scr1 + scr2], scr1 ;\
PRINT("HV:PCIE Error mondo\r\n")
PIU_ERR_PRINT("\r\n631800 = ", %g1, 0x31800, %g5, %g6)
PIU_ERR_PRINT("\r\n631808 = ", %g1, 0x31808, %g5, %g6)
ldx [%g1 + PIU_COOKIE_PCIE], %g5
PIU_ERR_PRINT("\r\n631000 = ", %g1, 0x31000, %g5, %g6)
PIU_ERR_PRINT("\r\n631008 = ", %g1, 0x31008, %g5, %g6)
PIU_ERR_PRINT("\r\n631010 = ", %g1, 0x31010, %g5, %g6)
PIU_ERR_PRINT("\r\n631018 = ", %g1, 0x31018, %g5, %g6)
PIU_ERR_PRINT("\r\n631020 = ", %g1, 0x31020, %g5, %g6)
PIU_ERR_PRINT("\r\n631028 = ", %g1, 0x31028, %g5, %g6)
PIU_ERR_PRINT("\r\n631030 = ", %g1, 0x31030, %g5, %g6)
PIU_ERR_PRINT("\r\n631038 = ", %g1, 0x31038, %g5, %g6)
ldx [%g1 + PIU_COOKIE_PCIE], %g5
PIU_ERR_PRINT("\r\n641000 = ", %g1, 0x41000, %g5, %g6)
PIU_ERR_PRINT("\r\n641008 = ", %g1, 0x41008, %g5, %g6)
PIU_ERR_PRINT("\r\n641010 = ", %g1, 0x41010, %g5, %g6)
PIU_ERR_PRINT("\r\n641018 = ", %g1, 0x41018, %g5, %g6)
PIU_ERR_PRINT("\r\n641020 = ", %g1, 0x41020, %g5, %g6)
PIU_ERR_PRINT("\r\n641028 = ", %g1, 0x41028, %g5, %g6)
PIU_ERR_PRINT("\r\n641030 = ", %g1, 0x41030, %g5, %g6)
mov %g2, %g7 ! save DATA0 for err handle setup
! Generate a unique error handle
! %g1 loaded with piu cookie
! %g2 data0, overwritten with r_piu_e_rpt
! %g2 pointing to r_piu_e_rpt
GEN_ERR_HNDL_SETUP_ERPTS(%g1, %g2, %g3, %g4, %g5, %g6, %g7)
ldx [r_piu_cookie + PIU_COOKIE_PCIE], %g4
! use alias r_piu_leaf_address for %g4 now
set PCI_E_DMU_CORE_BLK_ERR_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
and r_tmp1, IMU_BIT, r_tmp2
brnz,a r_tmp2, imu_block_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_DMU_CORE_AND_BLOCK_ERR_STATUS]
and r_tmp1, MMU_BIT, r_tmp2
brnz,a r_tmp2, mmu_block_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_DMU_CORE_AND_BLOCK_ERR_STATUS]
PRINT("HV:mondo 62 fall through to retry\r\n")
ba,a clear_dmu_err_piu_interrupt
PRINT("HV:imu_block_processing\r\n")
set PCI_E_IMU_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:.imu_eq_not_en_group_p\r\n")
btst IMU_EQ_NOT_EN_GROUP_P, r_tmp1
bz %xcc, .imu_eq_over_group_p
and r_tmp1, IMU_EQ_NOT_EN_GROUP_P, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_IMU_SCS_ERROR_LOG_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_IMU_EQ_NOT_EN_GROUP_EPKT_P(r_piu_e_rpt, \
r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_IMU_EQ_NOT_EN_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:imu_eq_over_group_p\r\n")
btst IMU_EQ_OVER_GROUP_P, r_tmp1
bz %xcc, .imu_msi_mes_group_p
and r_tmp1, IMU_EQ_OVER_GROUP_P, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_IMU_EQS_ERROR_LOG_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_IMU_EQ_OVER_GROUP_EPKT_P(r_piu_e_rpt, \
r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_IMU_EQ_OVER_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:imu_msi_mes_group_p\r\n")
btst IMU_MSI_MES_GROUP_P, r_tmp1
bz %xcc, .imu_eq_not_en_group_s
and r_tmp1, IMU_MSI_MES_GROUP_P, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_IMU_RDS_ERROR_LOG_REG(r_piu_e_rpt, r_piu_leaf_address, \
LOG_IMU_MSI_MES_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_IMU_MSI_MES_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:imu_eq_not_en_group_s\r\n")
set IMU_EQ_NOT_EN_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz %xcc, .imu_eq_over_group_s
and r_tmp2, r_tmp1, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_IMU_EQ_NOT_EN_GROUP_EPKT_S(r_piu_e_rpt, \
r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_IMU_EQ_NOT_EN_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:imu_eq_over_group_s\r\n")
set IMU_EQ_OVER_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz %xcc, .imu_msi_mes_group_s
and r_tmp2, r_tmp1, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_IMU_EQ_OVER_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_IMU_EQ_OVER_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:imu_msi_mes_group_s\r\n")
set IMU_MSI_MES_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .imu_block_processing_nothing_to_do
and r_tmp2, r_tmp1, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_IMU_ENABLED_ERR_STATUS]
LOG_DMC_IMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_IMU_MSI_MES_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_IMU_MSI_MES_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
.imu_block_processing_nothing_to_do:
PRINT("HV:imu_block_processing_nothing_to_do\r\n")
ba,a clear_dmu_err_piu_interrupt
PRINT("HV:mondo 62 fall through to retry\r\n")
CLEAR_PIU_INTERRUPT(r_piu_cookie, DMU_INTERNAL_INT, r_tmp1)
PRINT("HV:mmu_block_processing\r\n")
set PCI_E_MMU_INT_STAT_ADDR, r_tmp1
ldx [r_piu_leaf_address + r_tmp1], r_tmp1
PRINT("HV:mmu_err_group_p\r\n")
PRINT("HV:PCI_E_MMU_INT_STAT_ADDR:0x")
set MMU_ERR_GROUP_P, r_tmp2
bz %xcc, .mmu_err_group_s
and r_tmp1, r_tmp2, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_MMU_INTR_STATUS]
LOG_DMC_MMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_MMU_TRANS_FAULT_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_MMU_ERR_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_MMU_ERR_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
PRINT("HV:mmu_err_group_s\r\n")
set MMU_ERR_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .mmu_block_processing_nothing_to_do
and r_tmp2, r_tmp1, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_MMU_INTR_STATUS]
LOG_DMC_MMU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_MMU_ERR_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_MMU_ERR_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a dmu_err_mondo_ereport
.mmu_block_processing_nothing_to_do:
PRINT("HV:mmu_block_processing_nothing_to_do\r\n")
ba,a clear_dmu_err_piu_interrupt
mov %g2, %g7 ! save DATA0 for err handle setup
! Generate a unique error handle
! %g1 loaded with piu cookie
! %g2 data0, overwritten with r_piu_e_rpt
! %g2 pointing to r_piu_e_rpt
GEN_ERR_HNDL_SETUP_ERPTS(%g1, %g2, %g3, %g4, %g5, %g6, %g7)
ldx [r_piu_cookie + PIU_COOKIE_PCIE], %g4
! use alias r_piu_leaf_address for %g4 now
set PCI_E_PEU_INT_ENB_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
stx r_tmp1, [r_piu_e_rpt + PCIERPT_PEU_CORE_AND_BLOCK_INTR_ENABLE]
/* PEU Core and Block Interrupt Status Register (0x651808) */
set PCI_E_PEU_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
and r_tmp1, ILU_BIT, r_tmp2
brnz,a r_tmp2, .peu_ilu_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CORE_AND_BLOCK_INTR_STATUS]
and r_tmp1, UE_BIT, r_tmp2
brnz,a r_tmp2, .peu_ue_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CORE_AND_BLOCK_INTR_STATUS]
and r_tmp1, CE_BIT, r_tmp2
brnz,a r_tmp2, .peu_ce_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CORE_AND_BLOCK_INTR_STATUS]
and r_tmp1, OE_BIT, r_tmp2
brnz,a,pt r_tmp2, .peu_oe_processing
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CORE_AND_BLOCK_INTR_STATUS]
ba,a clear_peu_err_piu_interrupt
* All PEU Uncorrectable errors log to the same group and use the Uncorrectable
* Header1 and Header2 Log registers to capture data. Completion Timeout
* Primary Error also logs to the PEU Transmit Other Event Header1 and Header2
* Log Registers. If UR_P is set, Hypervisor must also see if PP_P is set, as this
* indicates a Ingress MsgD request (posted) with poisend data error. If only
* UR_P is set, then a Ingress MWr request (posted) with poisend data error
PRINT("HV:peu_uce_recv_group_p\r\n")
set PCI_E_PEU_UE_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
set PEU_UE_RECV_GROUP_P, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_trans_group_p
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_RCV_HDR_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_UE_RECV_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address,\
CLEAR_PEU_UE_RECV_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_trans_group_p\r\n")
set PEU_UE_TRANS_GROUP_P, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_dlp_p
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_TRANS_HDR_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_UE_TRANS_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_TRANS_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_dlp_p\r\n")
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_fcp_p
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_DLP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_DLP_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_fcp_p\r\n")
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_tlu_dlp_s
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_FCP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_FCP_P(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_tlu_dlp_s\r\n")
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_recv_group_s
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_DLP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_DLP_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_recv_group_s\r\n")
set PEU_UE_RECV_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_trans_group_s
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_RECV_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address,\
CLEAR_PEU_UE_RECV_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_trans_group_s\r\n")
set PEU_UE_TRANS_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz,pn r_tmp2, .peu_uce_fcp_s
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
LOG_PEU_UE_TRANS_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_TRANS_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_fcp_s\r\n")
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_uce_nothingtodo
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_UE_STATUS]
LOG_PEU_UE_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_PEU_UE_FCP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_UE_FCP_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_uce_nothingtodo\r\n")
ba,a clear_peu_err_piu_interrupt
PRINT("HV:pec_ce_processing\r\n")
set PCI_E_PEU_CE_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:PCI_E_PEU_CE_INT_STAT_ADDR = 0x")
set PEU_CE_GROUP_P, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz r_tmp2, .peu_ce_secondary
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CE_INTERRUPT_STATUS]
LOG_PEU_CE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_CE_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_CE_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_ce_secondary\r\n")
set PEU_CE_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
and r_tmp2, r_tmp1, r_tmp2
brz,pn r_tmp2, .peu_ce_nothingtodo
stx r_tmp2, [r_piu_e_rpt + PCIERPT_PEU_CE_INTERRUPT_STATUS]
LOG_PEU_CE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_CE_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_CE_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_ce_nothingtodo\r\n")
set PCI_E_PEU_CE_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:PCI_E_PEU_CE_INT_STAT_ADDR:0x")
ba,a clear_peu_err_piu_interrupt
* Only MFC, CTO, UR, MRC, CRS, WUC, and RUC log information to any
* registers. All other capture no data(exception LIN, see CXPL Error
* MFC, UR, CTO, MRC, and CRS log to the ....
* PEU Recieve Other Event Header1 and Header2 Log Registers.
* MFC, CTO, WUC, RUC, and CRS log to the ....
* PEU Transmit Other Event Header1 and Header2 Log Registers.
PRINT("HV:peu_oe_processing\r\n")
.peu_receive_other_event_p:
PRINT("HV:peu_receive_other_event_p\r\n")
set PCI_E_PEU_OTHER_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:contents = 0x")
set PEU_OE_RECEIVE_GROUP_P, r_tmp2
bz %xcc, .peu_oe_link_interrupt_group_p
* Special, this set of errors also records some in the transmit
set PEU_OE_TRANS_GROUP_P, r_tmp2
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_RECEIVE_GROUP_P)
LOG_PEU_OE_TRANS_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_RECEIVE_GROUP_P)
set PCI_E_PEU_OTHER_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
set PEU_OE_RECV_SVVS_RPT_MSK, r_tmp2
LOG_PEU_OE_RECV_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_RECV_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_RECV_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
LOG_PEU_OE_RECV_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_RECV_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
.peu_oe_link_interrupt_group_p:
PRINT("HV:.peu_oe_link_interrupt_group_p\r\n")
set PEU_OE_LINK_INTERRUPT_GROUP_P, r_tmp2
bz %xcc, .peu_trans_other_event_p
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_LINK_INTERRUPT_GROUP_P)
set PCI_E_PEU_CXPL_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:PCI_E_PEU_CXPL_INT_STAT_ADDR\r\n")
set CXPL_EVT_RCV_EN_LB, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_en_lb
set CXPL_EVT_RCV_DIS_LINK, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_dis_link
set CXPL_EVT_RCV_HOT_RST, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_hot_rst
set CXPL_EVT_RCV_EIDLE_EXIT, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_eidle_exit
set CXPL_EVT_RCV_EIDLE, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_eidle
set CXPL_EVT_RCV_TS1, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_ts1
set CXPL_EVT_RCV_TS2, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_rcv_ts2
set CXPL_EVT_SEND_SKP_B2B, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_evt_send_skp_b2b
set CXPL_ERR_OUTSTANDING_SKIP, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_outstanding_skip
set CXPL_ERR_ELASTIC_FIFO_UNDRFLW, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_elastic_fifo_undrflw
set CXPL_ERR_ELSTC_FIFO_OVRFLW, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_elstc_fifo_ovrflw
set CXPL_ERR_ALIGN, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_align
set CXPL_ERR_KCHAR_DLLP_TLP, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_kchar_dllp_tlp
set CXPL_ERR_ILL_END_POS, r_tmp2
and r_tmp1, r_tmp2, r_tmp2
brnz,pn r_tmp2, .cxpl_err_ill_end_pos
and r_tmp1, CXPL_ERR_SYNC, r_tmp2
brnz,pn r_tmp2, .cxpl_err_sync
and r_tmp1, CXPL_ERR_END_NO_STP_SDP, r_tmp2
brnz,pn r_tmp2, .cxpl_err_end_no_stp_sdp
and r_tmp1, CXPL_ERR_SDP_NO_END, r_tmp2
brnz,pn r_tmp2, .cxpl_err_sdp_no_end
and r_tmp1, CXPL_ERR_STP_NO_END_EDB, r_tmp2
brnz,pn r_tmp2, .cxpl_err_stp_no_end_edb
and r_tmp1, CXPL_ERR_ILL_PAD_POS, r_tmp2
brnz,pn r_tmp2, .cxpl_err_ill_pad_pos
and r_tmp1, CXPL_ERR_MULTI_SDP, r_tmp2
brnz,pn r_tmp2, .cxpl_err_multi_sdp
and r_tmp1, CXPL_ERR_MULTI_STP, r_tmp2
brnz,pn r_tmp2, .cxpl_err_multi_stp
and r_tmp1, CXPL_ERR_ILL_SDP_POS, r_tmp2
brnz,pn r_tmp2, .cxpl_err_ill_sdp_pos
and r_tmp1, CXPL_ERR_ILL_STP_POS, r_tmp2
brnz,pn r_tmp2, .cxpl_err_ill_stp_pos
and r_tmp1, CXPL_ERR_UNSUP_DLLP, r_tmp2
brnz,pn r_tmp2, .cxpl_err_unsup_dllp
and r_tmp1, CXPL_ERR_SRC_TLP, r_tmp2
brnz,pn r_tmp2, .cxpl_err_src_tlp
and r_tmp1, CXPL_ERR_SDS_LOS, r_tmp2
brnz,pt r_tmp2, .cxpl_err_sds_los
.nothing_to_do_peu_oe_link_interrupt_group_p:
PRINT("HV:.nothing_to_do_tlu_oe_link_interrupt_group_p\r\n")
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_en_lb\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EN_LB, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EN_LB, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_dis_link\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_DIS_LINK, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_DIS_LINK, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_hot_rst\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_HOT_RST, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_HOT_RST, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_evt_rcv_eidle_exit:
PRINT("HV:.cxpl_evt_rcv_eidle_exit\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EIDLE_EXIT, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EIDLE_EXIT, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_eidle\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EIDLE, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_EIDLE, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_ts1\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_TS1, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_TS1, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_rcv_ts2\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_TS2, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_RCV_TS2, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_evt_send_skp_b2b\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_SEND_SKP_B2B, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_EVT_SEND_SKP_B2B, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_outstanding_skip:
PRINT("HV:.cxpl_err_outstanding_skip\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_OUTSTANDING_SKIP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_OUTSTANDING_SKIP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_elastic_fifo_undrflw:
PRINT("HV:.cxpl_err_elastic_fifo_undrflw\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ELASTIC_FIFO_UNDRFLW, r_tmp1, \
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ELASTIC_FIFO_UNDRFLW, r_tmp1, \
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_elstc_fifo_ovrflw:
PRINT("HV:.cxpl_err_elstc_fifo_ovrflw\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ELSTC_FIFO_OVRFLW, r_tmp1, \
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ELSTC_FIFO_OVRFLW, r_tmp1, \
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_align\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ALIGN, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ALIGN, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_kchar_dllp_tlp:
PRINT("HV:.cxpl_err_kchar_dllp_tlp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_KCHAR_DLLP_TLP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_KCHAR_DLLP_TLP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_ill_end_pos\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_END_POS, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_END_POS, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_sync\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SYNC, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SYNC, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_end_no_stp_sdp:
PRINT("HV:.cxpl_err_end_no_stp_sdp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_END_NO_STP_SDP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_END_NO_STP_SDP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_sdp_no_end\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SDP_NO_END, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SDP_NO_END, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
.cxpl_err_stp_no_end_edb:
PRINT("HV:.cxpl_err_stp_no_end_edb\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_STP_NO_END_EDB, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_STP_NO_END_EDB, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_ill_pad_pos\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_PAD_POS, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_PAD_POS, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_multi_sdp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_MULTI_SDP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_MULTI_SDP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_multi_stp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_MULTI_STP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_MULTI_STP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_ill_sdp_pos\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_SDP_POS, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_SDP_POS, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_ill_stp_pos\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_STP_POS, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_ILL_STP_POS, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_unsup_dllp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_UNSUP_DLLP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_UNSUP_DLLP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_src_tlp\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SRC_TLP, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SRC_TLP, r_tmp1, r_tmp2)
ba,a .all_done_peu_oe_link_interrupt_group_p
PRINT("HV:.cxpl_err_sds_los\r\n")
LOG_PCIERPT_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SDS_LOS, r_tmp1, r_tmp2)
CLEAR_CXPL_INTR_STATUS(r_piu_e_rpt, r_piu_leaf_address, \
CXPL_ERR_SDS_LOS, r_tmp1, r_tmp2)
.all_done_peu_oe_link_interrupt_group_p:
PRINT("HV:all_done_peu_oe_link_interrupt_group_p\r\n")
set PCI_E_PEU_OTHER_ERR_STAT_CL_ADDR, r_tmp2
set PEU_OE_LINK_INTERRUPT_GROUP_P, r_tmp1
stx r_tmp1, [r_piu_leaf_address + r_tmp2]
set PCI_E_PEU_OTHER_ERR_STAT_CL_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
PRINT("HV:PCI_E_PEU_OTHER_ERR_STAT_CL_ADDR 0x")
ba,a clear_peu_err_piu_interrupt
.peu_trans_other_event_p:
PRINT("HV:peu_trans_other_event_p\r\n")
* Bits 22:21, 17, 16, and 15
* this test must happen after the recieve other event test
* as both the transmit and recieve groups have overlap and
* post info to both trans and receive regs. Since we tested
* the overlap in the receive we won't need to test it here
* in theory the only bit we should see is the one that only
set PEU_OE_TRANS_GROUP_P, r_tmp2
bz %xcc, .peu_oe_no_dup_group_p
set PEU_OE_TRANS_SVVS_RPT_MSK, r_tmp2
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_TRANS_GROUP_P)
LOG_PEU_OE_TRANS_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_TRANS_GROUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address,\
CLEAR_PEU_OE_TRANS_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_TRANS_GROUP_P)
LOG_PEU_OE_TRANS_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_TRANS_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
PRINT("HV:peu_oe_no_dup_group_p\r\n")
set PEU_OE_NO_DUP_GROUP_P, r_tmp2
bz,pn %xcc, .peu_oe_dup_lli_p
set PEU_OE_NO_DUP_SVVS_RPT_MSK, r_tmp2
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_NO_DUP_GROUP_P)
LOG_PEU_OE_NO_DUP_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_NO_DUP_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_NO_DUP_GROUP_P)
CLEAR_PEU_OE_NO_DUP_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
PRINT("HV:peu_oe_dup_lli_p\r\n")
set PEU_OE_DUP_LLI_P, r_tmp2
bz,pn %xcc, .peu_oe_no_dup_group_s
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_P(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_DUP_LLI_P)
LOG_ILU_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_PEU_OE_DUP_LLI_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:peu_oe_no_dup_group_s\r\n")
set PEU_OE_NO_DUP_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .peu_trans_other_event_s
set PEU_OE_NO_DUP_SVVS_RPT_MSK, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_NO_DUP_GROUP_P)
LOG_PEU_OE_NO_DUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_NO_DUP_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_NO_DUP_GROUP_P)
CLEAR_PEU_OE_NO_DUP_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
.peu_trans_other_event_s:
PRINT("HV:peu_trans_other_event_s\r\n")
set PEU_OE_TRANS_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .peu_receive_other_event_s
set PEU_OE_TRANS_SVVS_RPT_MSK, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
r_tmp2, PEU_OE_TRANS_GROUP_P)
LOG_PEU_OE_TRANS_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address,\
CLEAR_PEU_OE_TRANS_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, \
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_TRANS_GROUP_P)
CLEAR_PEU_OE_TRANS_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
.peu_receive_other_event_s:
PRINT("HV:peu_receive_other_event_s\r\n")
set PEU_OE_RECEIVE_GROUP_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz %xcc, .peu_oe_dup_lli_s
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_RECEIVE_GROUP_P)
set PCI_E_PEU_OTHER_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
set PEU_OE_RECV_SVVS_RPT_MSK, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
LOG_PEU_OE_RECV_GROUP_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, \
CLEAR_PEU_OE_RECV_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
CLEAR_PEU_OE_RECV_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a clear_peu_err_piu_interrupt
PRINT("HV:peu_oe_dup_lli_s\r\n")
set PEU_OE_DUP_LLI_P, r_tmp2
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .peu_oe_processing_nothingtodo
LOG_PEU_OE_GROUP_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1,\
LOG_PEU_OE_INTR_STATUS_S(r_piu_e_rpt, r_piu_leaf_address, \
r_tmp1, r_tmp2, PEU_OE_DUP_LLI_P)
LOG_ILU_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_PEU_OE_DUP_LLI_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, \
ba,a peu_err_mondo_ereport
PRINT("HV:ilu_interrupt_status_p\r\n")
set PCI_E_ILU_INT_STAT_ADDR, r_tmp2
ldx [r_piu_leaf_address + r_tmp2], r_tmp1
bz %xcc, .ilu_interrupt_status_s
and r_tmp1, ILU_GROUP_P, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_ILU_INTR_STATUS]
LOG_ILU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_ILU_EPKT_P(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_ILU_GROUP_P(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
ba,a peu_err_mondo_ereport
PRINT("HV:ilu_interrupt_status_s\r\n")
sllx r_tmp2, PRIMARY_TO_SECONDARY_SHIFT_SZ, r_tmp2
bz,pn %xcc, .ilu_nothing_todo
and r_tmp2, r_tmp1, r_tmp2
stx r_tmp2, [r_piu_e_rpt + PCIERPT_ILU_INTR_STATUS]
LOG_ILU_REGS(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
LOG_ILU_EPKT_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
CLEAR_ILU_GROUP_S(r_piu_e_rpt, r_piu_leaf_address, r_tmp1, r_tmp2)
ba,a peu_err_mondo_ereport
PRINT("HV:ilu_nothing_todo\r\n")
ba,a clear_peu_err_piu_interrupt
DMU_ERR_MONDO_EREPORT(r_piu_cookie, r_piu_e_rpt, r_tmp1, r_tmp2)
clear_dmu_err_piu_interrupt:
CLEAR_PIU_INTERRUPT(r_piu_cookie, DMU_INTERNAL_INT, r_tmp1)
GENERATE_FMA_REPORT; /* never returns */
PEU_ERR_MONDO_EREPORT(r_piu_cookie, r_piu_e_rpt, r_tmp1, r_tmp2)
clear_peu_err_piu_interrupt:
CLEAR_PIU_INTERRUPT(r_piu_cookie, PEU_INTERNAL_INT, r_tmp1)
GENERATE_FMA_REPORT; /* never returns */
.peu_oe_processing_nothingtodo:
PRINT("HV:peu_oe_processing_nothingtodo\r\n")
ba,a clear_peu_err_piu_interrupt
* %g2 pointing to ereport buffer, i.e. r_piu_e_rpt
ENTRY_NP(generate_guest_report)
add r_piu_e_rpt, PCIERPT_SYSINO, %g1
PRINT("HV:generate_guest_report\r\n")
PRINT("HV:calling:insert_device_mondo_p\r\n")
STRAND_PUSH(%g1, %g2, %g3)
PRINT("HV:calling:generate_fma_report\r\n")
* %g1 already points to the r_piu_e_rpt, no fixup, so don't use macro
SET_SIZE(generate_guest_report)
* %g1 pointing to piu error buffer
ENTRY_NP(generate_fma_report)
! set %g2 to point to unsent flag
add %g1, PCI_UNSENT_PKT, %g2
! set %g1 to point to vbsc err report
! set %g3 to contain the size of the buf
mov PCIERPT_SIZE - EPKTSIZE, %g3
PRINT("HV:all done with piu error processing, fma report sent\r\n")
SET_SIZE(generate_fma_report)
ENTRY_NP(piu_err_mondo_receive)
cmp %g4, PEU_INTERNAL_INT ! 63
beq,pt %xcc, error_mondo_63
cmp %g4, DMU_INTERNAL_INT ! 62
beq,pt %xcc, error_mondo_62
SET_SIZE(piu_err_mondo_receive)
! ret1 intr valid state (%o1)
ENTRY_NP(piu_err_intr_getvalid)
SET_SIZE(piu_err_intr_getvalid)
! arg1 intr valid state (%o1) 1: Valid 0: Invalid
ENTRY_NP(piu_err_intr_setvalid)
HVCALL(_piu_err_intr_setvalid)
! _piu_err_intr_setvalid doesn't have any failure cases
! so it is safe to just return EOK
SET_SIZE(piu_err_intr_setvalid)
ENTRY_NP(_piu_err_intr_setvalid)
and %g2, PIU_DEVINO_MASK, %g5
cmp %g5, PEU_INTERNAL_INT ! is it mondo 63
mov DMU_ERR_MONDO_OFFSET, %g4
movne %xcc, PEU_ERR_MONDO_OFFSET, %g4
ldx [%g1 + PIU_COOKIE_VIRTUAL_INTMAP], %g6
add %g6, %g4, %g6 ! virtual intmap + mondo offset
SET_SIZE(_piu_err_intr_setvalid)
! ret1 (%o1) 1: Pending / 0: Idle
ENTRY_NP(piu_err_intr_getstate)
SET_SIZE(piu_err_intr_getstate)
! arg1 (%o1) 1: Pending / 0: Idle
ENTRY_NP(piu_err_intr_setstate)
SET_SIZE(piu_err_intr_setstate)
ENTRY_NP(piu_err_intr_gettarget)
SET_SIZE(piu_err_intr_gettarget)
ENTRY_NP(piu_err_intr_settarget)
SET_SIZE(piu_err_intr_settarget)
! piu_err_intr_redistribution
! Generates each INO and calls the function that actually
ENTRY_NP(piu_err_intr_redistribution)
CPU_PUSH(%g7, %g3, %g4, %g5)
CPU_PUSH(%g1, %g3, %g4, %g5)
mov PIU_AID << PIU_DEVINO_SHIFT, %g4
or %g4, DMU_INTERNAL_INT, %g3
HVCALL(_piu_err_intr_redistribution)
CPU_POP(%g1, %g3, %g4, %g5)
CPU_PUSH(%g1, %g3, %g4, %g5)
mov PIU_AID << PIU_DEVINO_SHIFT, %g4
or %g4, PEU_INTERNAL_INT, %g3
HVCALL(_piu_err_intr_redistribution)
CPU_POP(%g7, %g3, %g4, %g5)
SET_SIZE(piu_err_intr_redistribution)
* _piu_err_intr_redistribution
ENTRY_NP(_piu_err_intr_redistribution)
CPU_PUSH(%g7, %g4, %g5, %g6)
CPU_PUSH(%g1, %g4, %g5, %g6) ! save tgt cpu
CPU_PUSH(%g3, %g4, %g5, %g6) ! save INO
srlx %g3, PIU_DEVINO_SHIFT, %g6
DEVINST2INDEX(%g4, %g6, %g6, %g5, ._piu_err_intr_redistribution_fail)
DEVINST2COOKIE(%g4, %g6, %g1, %g5, ._piu_err_intr_redistribution_fail)
and %g3, PIU_DEVINO_MASK, %g2
HVCALL(_piu_intr_gettarget)
! %g3 phys cpuid for this ino
ldub [%g4 + STRAND_ID], %g2
bne %xcc, ._piu_err_intr_redistribution_done
! deal with virtual portion
CPU_POP(%g2, %g4, %g6, %g7)
HVCALL(_piu_err_intr_setvalid)
and %g2, PIU_DEVINO_MASK, %g2
CPU_POP(%g3, %g4, %g6, %g7)
! %g3 = Physical target CPU id
HVCALL(_piu_intr_settarget)
HVCALL(_piu_intr_setstate)
ba,a ._piu_err_intr_redistribution_exit
._piu_err_intr_redistribution_done:
CPU_POP(%g3, %g4, %g5, %g6)
CPU_POP(%g1, %g3, %g4, %g5)
._piu_err_intr_redistribution_exit:
CPU_POP(%g7, %g3, %g4, %g5)
._piu_err_intr_redistribution_fail:
CPU_POP(%g3, %g4, %g5, %g6)
CPU_POP(%g1, %g3, %g4, %g5)
SET_SIZE(_piu_err_intr_redistribution)