* ========== Copyright Header Begin ==========================================
* OpenSPARC T2 Processor File: schizo_regs.h
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
* The above named 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 work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
* ========== Copyright Header End ============================================
* Copyright (C) 1996, Sun Microsystems, Inc.
#pragma ident "@(#)1.3 03/04/30 schizo_regs.h"
/* schizo register addresses (bottom 32 bits) */
#define UPA_PORT_ID_OFFSET 0x0000 // UPA port ID Register
#define UPA_CONFIG_OFFSET 0x0008 // UPA configuration Reg
#define IOMMU_CNTRL_OFFSET 0x0200
#define IOMMU_TSB_BASE_OFFSET 0x0208
#define IOMMU_FLUSH_PAGE 0x0210
#define IOMMU_FLUSH_CONTEXT 0x0218
#define PCI_BUS_CNTRL_OFFSET 0x2000
#define PCI_BUS_AFSR_OFFSET 0x2010
#define PCI_BUS_AFAR_OFFSET 0x2018
#define PCI_BUS_DIAG_OFFSET 0x2020
#define pci_diag_mask 0x000e
#define STC_CNTRL_OFFSET 0x2800
#define STC_PGE_FLUSHI_OFFSET 0x2808
#define STC_FLUSHS_OFFSET 0x2810
#define STC_CXT_FLUSHI_OFFSET 0x2818
#define UPA64S_SLOT0_IMR_OFFSET 0x6000
#define UPA64S_SLOT1_IMR_OFFSET 0x8000
#define PERF_MONITOR_OFFSET 0x0100
#define PERF_COUNTER_OFFSET 0x0108
#define IDLE_CHECK_DIAGNOSTICS 0x0110
#define T_C0_COUNT_OFFSET 0x1c00
#define T_C0_LIMIT_OFFSET 0x1c08
#define T_C1_COUNT_OFFSET 0x1c10
#define T_C1_LIMIT_OFFSET 0x1c18
#define TIMER_REGS_START 0x1c00
#define TIMER_REGS_END 0x1c1f
#define IOMMU_DIAGS_START 0xa400
#define IOMMU_DIAGS_END 0xa6ff
#define STC_DIAGS_START 0xb000
#define STC_DIAGS_END 0x17fff
/* The Streaming Cache Registers */
#define STC_DATA_DIAG_STR 0x0000b000
#define STC_DATA_DIAG_END 0x0000b7ff
#define STC_ERROR_DIAG_STR 0x0000b800
#define STC_ERROR_DIAG_END 0x0000b9ff
#define STC_PTAG_DIAG_STR 0x0000ba00
#define STC_PTAG_DIAG_END 0x0000ba7f
#define STC_LTAG_DIAG_STR 0x0000bb00
#define STC_LTAG_DIAG_END 0x0000bb7f
#define STC_CNTX_MTCH_STR 0x00010000
#define STC_CNTX_MTCH_END 0x00017fff
/* Interrupt Retry Timer Register */
#define INTR_RETRY_OFFSET 0x1a00
/* PCI Consistent DMA Flush/Sync Register */
#define PCI_DMA_FLUSH_SYNC_REG 0x1a08
/* Interrupt State Diagnostic Registers */
#define PCIBUS_ISR_OFFSET 0xa800
#define OBIO_ISR_OFFSET 0xa808
/* Interrupt Mapping Registers in schizo 64 in total*//* pp 126 */
#define INTR_MAP_START 0x1000
#define INTR_MAP_END 0x11f0
/* Interrupt Clear Registers-45 in total *//* pp 127 */
// should have 64 of them.
#define CLR_REG_START 0x1400
//#define CLR_REG_END 0x15b8
#define CLR_REG_END 0x15f8
#define CIR_OFFSET(off) ((off) >= CLR_REG_START && (off) <= CLR_REG_END)
#define MAP_OFFSET(off) ((off) >= INTR_MAP_START && (off) <= INTR_MAP_END)
#define MDU_OFFSET(off) (CIR_OFFSET(off) || MAP_OFFSET(off))
#define PCIBUS_VA_DIAG 0x0000a400
#define TLB_TAG_CMPR 0x0000a408
#define LRU_Q_DIAG_STR 0x0000a500
#define LRU_Q_DIAG_END 0x0000a57f
#define TLB_TAG_DIAG_STR 0x0000a580
#define TLB_TAG_DIAG_END 0x0000a5ff
#define TLB_DATA_DIAG_STR 0x0000a600
#define TLB_DATA_DIAG_END 0x0000a67f
* Offsets of address spaces with psycho.
* Note: These are 32 bit offsets only.
#define PCI_CONFIG_SPACE_START 0x01000000
#define PCI_BUS_B_CONFIG_SPACE_START 0x01000000
#define PCI_BUS_B_CONFIG_SPACE_END 0x0100ffff
#define PCI_BUS_A_CONFIG_SPACE_START 0x01010000
#define PCI_BUS_A_CONFIG_SPACE_END 0x0101ffff
#define PCI_BUS_A_IO_SPACE_START 0x02000000
#define PCI_BUS_A_IO_SPACE_END 0x0200ffff
#define PCI_BUS_B_IO_SPACE_START 0x02010000
#define PCI_BUS_B_IO_SPACE_END 0x0201ffff
#define PCI_BUS_A_MEM_SPACE_START 0x00000000
#define PCI_BUS_A_MEM_SPACE_END 0x7fffffff
#define PCI_BUS_B_MEM_SPACE_START 0x80000000
#define PCI_BUS_B_MEM_SPACE_END 0xffffffff
#define PCI_BUS_DVMA_START 0x00000000
#define PCI_BUS_DVMA_END 0x7fffffff
/* PBM configuration headers */
#define CONFIG_VENDOR_ID 0x00
#define CONFIG_DEVICE_ID 0x02
#define CONFIG_COMMAND 0x04
#define CONFIG_STATUS 0x06
#define CONFIG_REVISION_ID 0x08
#define CONFIG_PROG_IF_CODE 0x09
#define CONFIG_SUB_CLASS_CODE 0x0a
#define CONFIG_BASE_CLASS_CODE 0x0b
#define CONFIG_LATENCY_TIMER 0x0d
#define CONFIG_HEADER_TYPE 0x0e
#define CONFIG_BUS_NUMBER 0x40
#define CONFIG_SUB_BUS_NUMBER 0x41
/* PBM configuration headers not defined in schizo */
#define CONFIG_CACHE_LINE_SIZE 0xc
#define CONFIG_BASE_ADDR_00 0x10
#define CONFIG_BASE_ADDR_01 0x14
#define CONFIG_BASE_ADDR_02 0x18
#define CONFIG_BASE_ADDR_03 0x1c
#define CONFIG_BASE_ADDR_04 0x20
#define CONFIG_BASE_ADDR_05 0x24
#define CONFIG_SUB_VENDOR_ID 0x2c
#define CONFIG_SUB_SYSTEM_ID 0x2e
#define CONFIG_EXPANSION_ROM 0x30
#define CONFIG_ROM_ADDR 0x32
#define CONFIG_CAP_POINTER 0x34
#define CONFIG_INTERRUPT_LINE 0x3c
#define CONFIG_INTERRUPT_PIN 0x3d
#define CONFIG_MIN_GNT 0x3e
#define CONFIG_MAX_LAT 0x3f
#define CONFIG_CAP_ID 0x44
#define CONFIG_NEXTITEM_POINTER 0x45
#define CONFIG_POWER_CAP 0x46
#define CONFIG_POWER_CTRL 0x48
#define CONFIG_POWER_BRIDGE_SUPPORT 0x4a
#define CONFIG_POWER_DATA 0x4b
/* For Address range Calculation */
typedef enum Address_space
{
typedef enum Safari_space
{
/* To find what the internal addr range is. */
typedef enum Register_set
{
/* Register descriptions. */
// schizo control/status register, pp 123 & 148
const unsigned int SCHIZO_CSR_OFFSET
= 0x10000;
//const uint64_t SCHIZO_CSR_MASK = 0x0;
typedef struct s_schizo_cntrl
{
uint32_t rsvd1
:6; /* 63:58, 0x0, r */
uint32_t dtl_mode
:24; /* 57:34, 0x777df7, r */
uint32_t sto
:2; /* 33:32, 0x0, rw, Safari Timeout */
uint32_t rsvd3
:2; /* 31:30, 0x0, r */
uint32_t nid
:5; /* 29:25, 0x0, rw, Safari Node id */
uint32_t aid
:5; /* 24:20, 0x8, r, Agent id */
uint32_t rsvd2
:5; /* 19:15, 0x0, r */
//FIXME set in init_regs() but never used, pp ???
typedef struct s_upa_port_id
{
uint32_t fcode_esc
:8; /* value is 0xfc (FCODE for FERR) */
uint32_t rsvd1
:21; /* reserved r as zero */
uint32_t eccnotv
:1; /* whether port can generate ecc */
uint32_t oneresd
:1; /* -r */
uint32_t rsvd2
:1; /* read as 0 -r */
uint32_t rsvd3
:1; /* read as 0 -r */
uint32_t preq_dq
:6; /* size of Q -r */
uint32_t preq_rq
:4; /* size of Q -r */
uint32_t upacap
:5; /* upas features -r */
uint32_t jedec
:16; /* jedec id -r */
// ecc control register, pp 123 & 159
const unsigned int ECC_CNTL_OFFSET
= 0x10020;
//const uint64_t ECC_CNTL_MASK = 0x0;
typedef struct s_ecc_cntrl
{
uint32_t ecc_en
:1; /* enables ecc checking -rw */
uint32_t ue_inten
:1; /* enable interrupt gen. -rw */
uint32_t ce_inten
:1; /* enable interrupt gen. -rw */
uint32_t rsvd1
:29; /* not used */
uint32_t rsvd2
:13; /* not used */
// correctable & uncorrectable error asynchronous fault status registers,
const unsigned int UE_AFSR_OFFSET
= 0x10030;
const unsigned int CE_AFSR_OFFSET
= 0x10040;
// UE_AFSR & CE_AFSR have the same register layout
// or just as a 64bit entity
//FIXME should be replaced by S_ceue_afsr
typedef struct s_ue_afsr
{
uint32_t p_pio
:1; // [63] prim ue caused by pio
uint32_t p_drd
:1; // [62] prim ue caued by pci bus dmard
uint32_t p_dwr
:1; // [61] prim ue caued by pci bus dmawr
uint32_t s_pio
:1; // [60] sec ue caused by pio
uint32_t s_dma
:1; // [59] sec ue caued by pci bus dma rd and wr
uint32_t rsvd1
:10; // [57:48] read as zero
uint32_t bytemask
:16; // [47:32] 16 bit UPA byte mask of access
uint32_t dw_off
:3; // [31:29] transfer size (read-only)
uint32_t upa_mid
:5; // [28:24} upa mid that caused it (read-only)
uint32_t blk
:1; // [23] was a block read/write?
uint32_t rsvd2
:23; // [22:00] read as zero
// correctable & uncorrectable error asynchronous fault address registers,
const unsigned int UE_AFAR_OFFSET
= 0x10038;
const unsigned int CE_AFAR_OFFSET
= 0x10048;
// UE_AFAR & CE_AFAR have the same register layout
unsigned int io_mem_cmd
:1;
unsigned int address_1
:11; // the two address fields must be
unsigned int address_2
:28; // concatenated to be useful.
//FIXME should be replaced by S_ceue_afar
typedef struct s_ue_afar
{
uint32_t rsvd
:20; // [63:44] read as zero
uint32_t io_mem
:1; // [43] I/O or Memory Safari command
uint32_t region
:4; // [42:39] which region?
uint32_t rsvd1
:3; // [38:36] read as zero
uint32_t ue_pa_h
:4; // [35:32] bits of PA
uint32_t ue_pa_l
:28; // [31:4] bits of PA
uint32_t rsvd2
:4; // [3:0] read as zero
//FIXME should be replaced by S_ceue_afsr
typedef struct s_ce_afsr
{
uint32_t p_pio
:1; // [63] prim ce caused by pio
uint32_t p_drd
:1; // [62] prim ce caued by pci bus dmard
uint32_t p_dwr
:1; // [61] prim ce caued by pci bus dmawr
uint32_t s_pio
:1; // [60] sec ce caused by pio
uint32_t s_dma
:1; // [59] sec ce caued by pci bus dma rd and wr
uint32_t rsvd1
:2; // [57:56] read as zero
uint32_t e_syn
:8; // [55:48] ce syndrome bits
uint32_t bytemask
:16; // [47:32] 16 bit UPA byte mask of access
uint32_t dw_off
:3; // [31:29] transfer size (read-only)
uint32_t upa_mid
:5; // [28:24} upa mid that caused it (read-only)
uint32_t blk
:1; // [23] block transaction
uint32_t rsvd2
:23; // [22:00] read as zero
//FIXME should be replaced by S_ceue_afar
typedef struct s_ce_afar
{
uint32_t rsvd
:20; // [63:44] read as zero
uint32_t io_mem
:1; // [43] I/O or Memory Safari command
uint32_t region
:4; // [42:39] which region?
uint32_t rsvd1
:3; // [38:36] read as zero
uint32_t ce_pa_h
:4; // [35:32] bits of PA
uint32_t ce_pa_l
:28; // [31:4] bits of PA
uint32_t rsvd2
:4; // [3:0] read as zero
//FIXME the pci registers are very different to pp 127 & 183-190 ???
typedef struct s_pci_bus_cntrl
{
uint32_t rsvd1
:29; // [63:35] reserved, read as zero
uint32_t pci_serr
:1; // [34] set when SERR# asserted
uint32_t pci_speed
:1; // [33] PCI bus speed
uint32_t garb_en
:1; // [32] global arbitration enable
uint32_t rsvd2
:18; // [31:14] reserved, read as zero
uint32_t bypass
:4; // [13:10] per device bypass enable bits
uint32_t wakeup_en
:1; // [09] power management wakeup enable
uint32_t errint_en
:1; // [08] PCI error interrupt enable
uint32_t rsvd3
:2; // [07:06] reserved, read as zero
uint32_t arb_scheme
:1; // [05] arbitration scheme
uint32_t arb_park
:1; // [04] arbitration bus parking
uint32_t arb_en
:4; // [03:00] PCI DMA arbitration enable
typedef struct s_pci_bus_afsr
{
uint32_t p_ma
:1; // [63] if primary error is master abort
uint32_t p_ta
:1; // [62] if primary error is target abort
uint32_t p_rtry
:1; // [61] if primary error is excessive retries
uint32_t p_perr
:1; // [60] if primary error is late error
uint32_t s_ma
:1; // [59] if secondary error is master abort
uint32_t s_ta
:1; // [58] if secondary error is target abort
uint32_t s_rtry
:1; // [57] if secondary error is excessive retries
uint32_t s_perr
:1; // [56] if secondary error is late error
uint32_t rsvd1
:8; // [55:48] reserved, read as zero
uint32_t bytemask
:16; // [47:32] bytemask of failed primary transfer
uint32_t blk
:1; // [31] failure on block transfer
uint32_t rsvd2
:1; // [30] reserved, read as zero
uint32_t upa_mid
:5; // [29:25] UPA MID that caused the error
uint32_t rsvd3
:25; // [24:00] reserved, read as zero
typedef struct s_pci_bus_afar
{
uint32_t rsvd
:23; // [63:41] reserved, read as zero
uint32_t ue_pa_h1
:9; // [40:32] upper 9 bits of PA -r
uint32_t ue_pa_h2
:12; // [31:20] upper 12 bits of PA -r
uint32_t ue_pa_l
:20; // [19:00] lower 20 bits of PA -r
typedef struct s_pci_bus_diag
{
typedef union u_pci_bus_diag
{
// configuration header registers:
typedef union u_vendor_id
{
typedef union u_device_id_reg
{
typedef union u_revision_id
{
typedef union u_prog_if_code
{
typedef union u_sub_class_code
{
typedef union u_base_class_code
{
typedef union u_bus_number
{
typedef union u_sub_bus_number
{
/*config header registers not implemented in schizo*/
typedef union u_cache_line_size
{
typedef union u_base_address
{
typedef union u_expansion_ROM
{
typedef union u_interrupt_line
{
typedef union u_interrupt_pin
{
typedef union u_MIN_GNT
{
typedef union u_MAX_LAT
{
typedef struct s_command
{
uint16_t rsvd
:6; // [15:10] reserved
uint16_t fast_en
:1; // [09] enable fast back to back cycle to diff targets
uint16_t serr_en
:1; // [08] enable driving of SERR# pin
uint16_t wait
:1; // [07] enable use of address/data stepping
uint16_t per
:1; // [06] enable reporting of paritiy errors
uint16_t vga
:1; // [05] enable vga pallete snooping
uint16_t mwi
:1; // [04] enable use of memory write & invalidate
uint16_t spcl
:1; // [03] enable monitoring of special cycles
uint16_t mstr
:1; // [02] enable bus master ability
uint16_t mem
:1; // [01] enable response to PCI MEM cycles
uint16_t io
:1; // [00] enable response to PCI I/O cycles
typedef union u_command
{
typedef struct s_status_reg
{
uint16_t dpe
:1; // [15] PBM detects parity error
uint16_t sse
:1; // [14] PBM signalled system error
uint16_t rma
:1; // [13] PBM recieves master abort
uint16_t rta
:1; // [12] PBM recieves target abort
uint16_t sta
:1; // [11] PBM generates target abort
uint16_t dvsl
:2; // [10:09] timing of DEVSEL#
uint16_t dpar
:1; // [08] set when parity error occurs
uint16_t fastcap
:1; // [07] ability to access fast back to back as target
uint16_t cap_66
:1; // [06] ability to access fast back to back as target
uint16_t rsvd
:6; // [05:00] reserved
typedef union u_status_reg
{
typedef struct s_latency_timer
{
uint8_t lat_tmr_hi
:5; // [07:03]
uint8_t lat_tmr_lo
:3; // [02:00] read-only
typedef union u_latency_timer
{
typedef struct s_header_type
{
uint8_t multi_func
:1; // [07]
uint8_t hdr_type
:7; // [06:00]
typedef union u_header_type
{
//---------------------------------------------
typedef struct s_upa_config
{
uint32_t rsvd1
:32; /* not used */
uint32_t rsvd2
:24; /* not used */
uint32_t sciq1
:4; /* size of input req q */
uint32_t sciq0
:4; /* unsed -rw */
typedef struct s_ecc_diag
{
uint32_t rsvd
:24; /* not used */
uint32_t syndrome
:8; /* syndrom bits of UPA -r */
typedef struct s_sbus_slot_config
{
uint32_t rsvd1
:32; /* reserved, must be zero-rw */
uint32_t rsvd2
:5; /* reserved, must be zero-rw */
uint32_t sega
:11; /* top 11 bits of paddr -rw */
uint32_t cp
:1; /* cacheable bit -rw */
uint32_t etm
:1; /* enables ext transfer mode-rw */
uint32_t pe
:1; /* enables SBus Parity checking-rw */
uint32_t rsvd
:8; /* not used */
uint32_t ba64
:1; /* supports 64-byte bursts -rw */
uint32_t ba32
:1; /* supports 32-byte bursts -rw */
uint32_t ba16
:1; /* supports 16-byte bursts -rw */
uint32_t ba8
:1; /* supports 8-byte bursts-rw */
uint32_t by
:1; /* bypass mode enabled -rw */
union u_sbus_slot_config
{
typedef struct s_sbus_afar
{
uint32_t rsvd
:24; /* read as zero -r */
uint32_t ue_pa_h1
:8; /* upper 8 bits of PA -r */
uint32_t ue_pa_h2
:12; /* upper 12 bits of PA -r */
uint32_t ue_pa_l
:20; /* lower 20 bits of PA -r */
typedef struct s_perf_monitor
{
uint32_t rsvd1
:32; /* read as zero -r */
uint32_t rsvd2
:16; /* read as zero -r */
uint32_t sel1
:4; /* select event for counter1 */
uint32_t rsvd3
:4; /* read as zero -r */
uint32_t sel2
:4; /* select event for counter2 */
uint32_t rsvd4
:4; /* read as zero -r */
typedef struct s_perf_counter
{
uint32_t cnt0
:32; /* value of event counter 1-r */
uint32_t cnt1
:32; /* value of event counter 2-r */
#endif /* SCHIZO_REGS_H */