* ========== Copyright Header Begin ==========================================
* OpenSPARC T2 Processor File: interrupt_pci_regs.s
* Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
* 4150 Network Circle, Santa Clara, California 95054, U.S.A.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* For the avoidance of doubt, and except that if any non-GPL license
* choice is available it will apply instead, Sun elects to use only
* the General Public License version 2 (GPLv2) at this time for any
* software where a choice of GPL license versions is made
* available with the language indicating that GPLv2 or any later version
* may be used, or where a choice of which version of the GPL is applied is
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* ========== Copyright Header End ============================================
#define MAIN_PAGE_NUCLEUS_ALSO
#define MAIN_PAGE_HV_ALSO
/************************************************************************
************************************************************************/
! Switch to hypervisor mode.
wrpr %l0, %l1, %pstate ! Disable interrupts
! Interrupt Mapping registers
setx PCI_E_INT_MAP_ADDR, %g1, %g2
set PCI_E_INT_MAP_COUNT, %g3
set PCI_E_INT_MAP_STEP, %g4
setx 0x80000000fe0003C0, %g1, %g5
! Two more registers to write, and skip over "missing" 2 registers.
setx PCI_E_INT_MAP_ADDR, %g1, %g2
set PCI_E_INT_MAP_COUNT, %g3
! Two more registers to read, and ship over "missing" 2 registers.
setx PCI_E_INT_MAP_ADDR, %g1, %g2
set PCI_E_INT_MAP_COUNT, %g3
set PCI_E_INT_MAP_STEP, %g4
! Two more registers to write, and skip over "missing" 2 registers.
setx PCI_E_INT_MAP_ADDR, %g1, %g2
set PCI_E_INT_MAP_COUNT, %g3
! Two more registers to read, and ship over "missing" 2 registers.
! Interrupt Clear registers
setx PCI_E_INT_CLEAR_ADDR, %g1, %g2
set PCI_E_INT_CLEAR_COUNT, %g3
set PCI_E_INT_CLEAR_STEP, %g4
! Two more registers to write, and skip over "missing" 2 registers.
setx PCI_E_INT_CLEAR_ADDR, %g1, %g2
set PCI_E_INT_CLEAR_COUNT, %g3
! Two more registers to read, and ship over "missing" 2 registers.
setx PCI_E_INT_CLEAR_ADDR, %g1, %g2
set PCI_E_INT_CLEAR_COUNT, %g3
set PCI_E_INT_CLEAR_STEP, %g4
! Two more registers to write, and skip over "missing" 2 registers.
setx PCI_E_INT_CLEAR_ADDR, %g1, %g2
set PCI_E_INT_CLEAR_COUNT, %g3
! Two more registers to read, and ship over "missing" 2 registers.
! Interrupt Retry Timer register
setx PCI_E_INT_RETRY_TIMER_ADDR, %g1, %g2
setx 0x01ffffff, %g1, %g3
! Interrupt State Status registers 1 and 2, read only
setx PCI_E_INT_STATE_STATUS_1_ADDR, %g1, %g2
setx PCI_E_INT_STATE_STATUS_2_ADDR, %g1, %g3
! INTX Status register, read only
setx PCI_E_INTX_STATUS_ADDR, %g1, %g2
! INT A/B/C/D Clear registers, RW1C
setx PCI_E_INT_A_CLEAR_ADDR, %g1, %g2
setx PCI_E_INT_B_CLEAR_ADDR, %g1, %g3
setx PCI_E_INT_C_CLEAR_ADDR, %g1, %g4
setx PCI_E_INT_D_CLEAR_ADDR, %g1, %g5
! Event Queue Base Address register.
setx PCI_E_EV_QUE_BASE_ADDRESS_ADDR, %g1, %g2
event_que_base_addr_write_1:
event_que_base_addr_read_1:
setx 0xfffffffffff80000, %g1, %g3
event_que_base_addr_write_0:
event_que_base_addr_read_0:
! Event Queue Control Set registers, WO
setx PCI_E_EV_QUE_CTL_SET_ADDR, %g1, %g2
set PCI_E_EV_QUE_CTL_SET_COUNT, %g3
set PCI_E_EV_QUE_CTL_SET_STEP, %g4
event_que_ctl_set_write_1:
setx 0x100000000000, %g1, %g5 ! First only write the EN bit
event_que_ctl_set_write_en_loop:
bne event_que_ctl_set_write_en_loop
setx PCI_E_EV_QUE_CTL_SET_ADDR, %g1, %g2
set PCI_E_EV_QUE_CTL_SET_COUNT, %g3
setx 0x200000000000000, %g1, %g5 ! Next write the ENOVERR bit
event_que_ctl_set_write_enoverr_loop:
bne event_que_ctl_set_write_enoverr_loop
! Event Queue State registers, RO
setx PCI_E_EV_QUE_STATE_ADDR, %g1, %g2
setx PCI_E_EV_QUE_STATE_COUNT, %g1, %g3
setx PCI_E_EV_QUE_STATE_STEP, %g1, %g4
event_que_ctl_state_loop:
bne event_que_ctl_state_loop
! Event Queue Control Clear registers, WO
setx PCI_E_EV_QUE_CTL_CLEAR_ADDR, %g1, %g2
setx PCI_E_EV_QUE_CTL_CLEAR_COUNT, %g1, %g3
setx PCI_E_EV_QUE_CTL_CLEAR_STEP, %g1, %g4
setx 0x200900000000000, %g1, %g5
event_que_ctl_clear_write_loop:
bne event_que_ctl_clear_write_loop
! Event Queue Tail registers
setx PCI_E_EV_QUE_TAIL_ADDR, %g1, %g2
setx PCI_E_EV_QUE_TAIL_COUNT, %g1, %g3
setx PCI_E_EV_QUE_TAIL_STEP, %g1, %g4
event_que_tail_write_1_loop:
bne event_que_tail_write_1_loop
setx PCI_E_EV_QUE_TAIL_ADDR, %g1, %g2
setx PCI_E_EV_QUE_TAIL_COUNT, %g1, %g3
event_que_tail_read_1_loop:
bne event_que_tail_read_1_loop
setx PCI_E_EV_QUE_TAIL_ADDR, %g1, %g2
setx PCI_E_EV_QUE_TAIL_COUNT, %g1, %g3
event_que_tail_write_0_loop:
bne event_que_tail_write_0_loop
setx PCI_E_EV_QUE_TAIL_ADDR, %g1, %g2
setx PCI_E_EV_QUE_TAIL_COUNT, %g1, %g3
event_que_tail_read_0_loop:
bne event_que_tail_read_0_loop
! Event Queue Head registers
setx PCI_E_EV_QUE_HEAD_ADDR, %g1, %g2
setx PCI_E_EV_QUE_HEAD_COUNT, %g1, %g3
setx PCI_E_EV_QUE_HEAD_STEP, %g1, %g4
event_que_head_write_1_loop:
bne event_que_head_write_1_loop
setx PCI_E_EV_QUE_HEAD_ADDR, %g1, %g2
setx PCI_E_EV_QUE_HEAD_COUNT, %g1, %g3
event_que_head_read_1_loop:
bne event_que_head_read_1_loop
setx PCI_E_EV_QUE_HEAD_ADDR, %g1, %g2
setx PCI_E_EV_QUE_HEAD_COUNT, %g1, %g3
event_que_head_write_0_loop:
bne event_que_head_write_0_loop
setx PCI_E_EV_QUE_HEAD_ADDR, %g1, %g2
setx PCI_E_EV_QUE_HEAD_COUNT, %g1, %g3
event_que_head_read_0_loop:
bne event_que_head_read_0_loop
setx PCI_E_MSI_MAP_ADDR, %g1, %g2
setx PCI_E_MSI_MAP_COUNT, %g1, %g3
setx PCI_E_MSI_MAP_STEP, %g1, %g4
setx 0x800000000000003f, %g1, %g5
msi_mapping_write_1_loop:
bne msi_mapping_write_1_loop
setx PCI_E_MSI_MAP_ADDR, %g1, %g2
setx PCI_E_MSI_MAP_COUNT, %g1, %g3
bne msi_mapping_read_1_loop
setx PCI_E_MSI_MAP_ADDR, %g1, %g2
setx PCI_E_MSI_MAP_COUNT, %g1, %g3
setx PCI_E_MSI_MAP_STEP, %g1, %g4
msi_mapping_write_0_loop:
bne msi_mapping_write_0_loop
setx PCI_E_MSI_MAP_ADDR, %g1, %g2
setx PCI_E_MSI_MAP_COUNT, %g1, %g3
bne msi_mapping_read_0_loop
setx PCI_E_MSI_CLEAR_ADDR, %g1, %g2
setx PCI_E_MSI_CLEAR_COUNT, %g1, %g3
setx PCI_E_MSI_CLEAR_STEP, %g1, %g4
setx 0x4000000000000000, %g1, %g5
bne msi_clear_write_1_loop
setx PCI_E_MSI_CLEAR_ADDR, %g1, %g2
setx PCI_E_MSI_CLEAR_COUNT, %g1, %g3
bne msi_clear_read_1_loop
setx PCI_E_MSI_CLEAR_ADDR, %g1, %g2
setx PCI_E_MSI_CLEAR_COUNT, %g1, %g3
setx PCI_E_MSI_CLEAR_STEP, %g1, %g4
bne msi_clear_write_0_loop
setx PCI_E_MSI_CLEAR_ADDR, %g1, %g2
setx PCI_E_MSI_CLEAR_COUNT, %g1, %g3
bne msi_clear_read_0_loop
! Interrupt Mondo Data 0 and 1 registers
setx PCI_E_INT_MONDO_DATA_0_ADDR, %g1, %g2
setx PCI_E_INT_MONDO_DATA_1_ADDR, %g1, %g3
! ERR COR Mapping register
setx PCI_E_ERR_COR_MAP_ADDR, %g1, %g2
setx 0x800000000000003f, %g1, %g7
! ERR NONFATAL Mapping register
setx PCI_E_ERR_NONFATAL_MAP_ADDR, %g1, %g2
err_nonfatal_map_write_1:
setx 0x800000000000003f, %g1, %g7
err_nonfatal_map_write_0:
! ERR FATAL Mapping register
setx PCI_E_ERR_FATAL_MAP_ADDR, %g1, %g2
setx 0x800000000000003f, %g1, %g7
! PM PME Mapping register
setx PCI_E_PM_PME_MAP_ADDR, %g1, %g2
setx 0x800000000000003f, %g1, %g7
! PME To ACK Mapping register
setx PCI_E_PME_ACK_MAP_ADDR, %g1, %g2
setx 0x800000000000003f, %g1, %g7
! IMU Interrupt Enable register
setx PCI_E_IMU_INT_ENB_ADDR, %g1, %g2
setx 0x7fff00007fff, %g1, %g3 ! Writeable fields
! IMU Interrupt Status register, RO
setx PCI_E_IMU_INT_STAT_ADDR, %g1, %g2
! DMU Core and Block Interrupt Enable register
setx PCI_E_DMU_INT_ENB_ADDR, %g1, %g2
setx 0xc000000000000003, %g1, %g3
! DMU Core and Block Error Status register, RO
setx PCI_E_DMU_ERR_STAT_ADDR, %g1, %g2
! MSI 32-bit Address register
setx PCI_E_MSI_32_ADDRESS_ADDR, %g1, %g2
setx 0xffff0000, %g1, %g4
! MSI 64-bit Address register
setx PCI_E_MSI_64_ADDRESS_ADDR, %g1, %g2
setx 0xffffffffffff0000, %g1, %g4
! MMU Interrupt Enable register
setx PCI_E_MMU_INT_ENB_ADDR, %g1, %g2
setx 0x1fffff001fffff, %g1, %g5
! MMU Interrupt Status register, RO
setx PCI_E_MMU_INT_STAT_ADDR, %g1, %g2
! MMU Error Status Clear register, RW1C
setx PCI_E_MMU_ERR_STAT_CL_ADDR, %g1, %g2
mmu_error_status_write_1:
! MMU Error Status Set register, RW1S
setx PCI_E_MMU_ERR_STAT_SET_ADDR, %g1, %g2
mmu_err_status_set_write_0:
mmu_err_status_set_read_0:
mmu_err_status_set_write_1:
mmu_err_status_set_read_1:
setx 0x1fffff001fffff, %g1, %g4
! MMU Error Status Clear register, RW1C,
! status is set in MMU Error Status Set register above
setx PCI_E_MMU_ERR_STAT_CL_ADDR, %g1, %g2
mmu_error_status_read_1_2:
setx 0x1fffff001fffff, %g1, %g4
mmu_error_status_write_1_2:
mmu_error_status_read_0_2:
! ILU Interrupt Enable register
setx PCI_E_ILU_INT_ENB_ADDR, %g1, %g2
setx 0xf0000000f0, %g1, %g5
! ILU Interrupt Status register, RO
setx PCI_E_ILU_INT_STAT_ADDR, %g1, %g2
! ILU Error Status Clear register, RW1C
setx PCI_E_ILU_ERR_STAT_CL_ADDR, %g1, %g2
ilu_error_status_write_1:
! ILU Error Status Set register, RW1S
setx PCI_E_ILU_ERR_STAT_SET_ADDR, %g1, %g2
ilu_err_status_set_write_0:
ilu_err_status_set_read_0:
ilu_err_status_set_write_1:
ilu_err_status_set_read_1:
setx 0xf0000000f0, %g1, %g4
! ILU Error Status Clear register, RW1C,
! status is set in ILU Error Status Set register above
setx PCI_E_ILU_ERR_STAT_CL_ADDR, %g1, %g2
ilu_error_status_read_1_2:
setx 0xf0000000f0, %g1, %g4
ilu_error_status_write_1_2:
ilu_error_status_read_0_2:
! PEU Core and Block Interrupt Enable register
setx PCI_E_PEU_INT_ENB_ADDR, %g1, %g2
setx 0x800000000000000f, %g1, %g3
! PEU Core and Block Error Status register, RO
setx PCI_E_PEU_INT_STAT_ADDR, %g1, %g2
! PEU Other Interrupt Enable register
setx PCI_E_PEU_OTHER_INT_ENB_ADDR, %g1, %g2
peu_other_int_enable_write_1:
peu_other_int_enable_read_1:
setx 0xffffff00ffffff, %g1, %g5
peu_other_int_enable_write_0:
peu_other_int_enable_read_0:
! PEU Other Interrupt Status register, RO
setx PCI_E_PEU_OTHER_INT_STAT_ADDR, %g1, %g2
! PEU Other Error Status Clear register, RW1C
setx PCI_E_PEU_OTHER_ERR_STAT_CL_ADDR, %g1, %g2
peu_other_error_status_write_1:
peu_other_error_status_read_0:
! PEU Other Error Status Set register, RW1S
peu_other_err_status_set:
setx PCI_E_PEU_OTHER_ERR_STAT_SET_ADDR, %g1, %g2
peu_other_err_status_set_write_0:
peu_other_err_status_set_read_0:
peu_other_err_status_set_write_1:
peu_other_err_status_set_read_1:
setx 0xffffff00ffffff, %g1, %g5
! PEU Other Error Status Clear register, RW1C,
! status is set in PEU Other Error Status Set register above
peu_other_error_status_2:
setx PCI_E_PEU_OTHER_ERR_STAT_CL_ADDR, %g1, %g2
peu_other_error_status_read_1_2:
setx 0xffffff00ffffff, %g1, %g5
peu_other_error_status_write_1_2:
peu_other_error_status_read_0_2:
! PEU UE Interrupt Enable register
setx PCI_E_PEU_UE_INT_ENB_ADDR, %g1, %g2
peu_ue_int_enable_write_1:
peu_ue_int_enable_read_1:
setx 0x001fffff001fffff, %g1, %g5
peu_ue_int_enable_write_0:
peu_ue_int_enable_read_0:
! PEU UE Interrupt Status register, RO
setx PCI_E_PEU_UE_INT_STAT_ADDR, %g1, %g2
! PEU UE Status Clear register, RW1C
setx PCI_E_PEU_UE_STAT_CL_ADDR, %g1, %g2
! PEU UE Status Set register, RW1S
setx PCI_E_PEU_UE_STAT_SET_ADDR, %g1, %g2
peu_ue_status_set_write_0:
peu_ue_status_set_read_0:
peu_ue_status_set_write_1:
peu_ue_status_set_read_1:
setx 0x17f0110017f011, %g1, %g5
! PEU UE Status Clear register, RW1C,
! status is set in PEU UE Status Set register above
setx PCI_E_PEU_UE_STAT_CL_ADDR, %g1, %g2
setx 0x17f0110017f011, %g1, %g5
! PEU CE Interrupt Enable register
setx PCI_E_PEU_CE_INT_ENB_ADDR, %g1, %g2
peu_ce_int_enable_write_1:
peu_ce_int_enable_read_1:
setx 0x00001fff00001fff, %g1, %g5
peu_ce_int_enable_write_0:
peu_ce_int_enable_read_0:
! PEU CE Interrupt Status register, RO
setx PCI_E_PEU_CE_INT_STAT_ADDR, %g1, %g2
! PEU CE Status Clear register, RW1C
setx PCI_E_PEU_CE_STAT_CL_ADDR, %g1, %g2
! PEU CE Status Set register, RW1S
setx PCI_E_PEU_CE_STAT_SET_ADDR, %g1, %g2
peu_ce_status_set_write_0:
peu_ce_status_set_read_0:
peu_ce_status_set_write_1:
peu_ce_status_set_read_1:
setx 0x11c10000000011c1, %g1, %g5
! PEU CE Status Clear register, RW1C,
! status is set in PEU CE Status Set register above
setx PCI_E_PEU_CE_STAT_CL_ADDR, %g1, %g2
setx 0x11c10000000011c1, %g1, %g5
! PEU DLPL Interrupt Enable register
setx PCI_E_PEU_DLPL_INT_ENB_ADDR, %g1, %g2
peu_dlpl_int_enable_write_1:
peu_dlpl_int_enable_read_1:
setx 0xff03ffff, %g1, %g5
peu_dlpl_int_enable_write_0:
peu_dlpl_int_enable_read_0:
! PEU DLPL Interrupt Status register, RO
setx PCI_E_PEU_DLPL_INT_STAT_ADDR, %g1, %g2
! PEU DLPL Status Clear register, RW1C
setx PCI_E_PEU_DLPL_STAT_CL_ADDR, %g1, %g2
! PEU DLPL Status Set register, RW1S
! Note since the link is not being trained some
! bits in this register can be set. So for the
! write of zeros just check that the register
setx PCI_E_PEU_DLPL_STAT_SET_ADDR, %g1, %g2
peu_dlpl_status_set_write_0:
peu_dlpl_status_set_read_0:
peu_dlpl_status_set_write_1:
peu_dlpl_status_set_read_1:
setx 0xff03ffff, %g1, %g5
! PEU DLPL Status Clear register, RW1C,
! status is set in PEU DLPL Status Set register above
setx PCI_E_PEU_DLPL_STAT_CL_ADDR, %g1, %g2
peu_dlpl_status_read_1_2:
setx 0xff03ffff, %g1, %g5
peu_dlpl_status_write_1_2:
peu_dlpl_status_read_0_2:
/************************************************************************
************************************************************************/