1*1708Sstevel /* 2*1708Sstevel * CDDL HEADER START 3*1708Sstevel * 4*1708Sstevel * The contents of this file are subject to the terms of the 5*1708Sstevel * Common Development and Distribution License (the "License"). 6*1708Sstevel * You may not use this file except in compliance with the License. 7*1708Sstevel * 8*1708Sstevel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*1708Sstevel * or http://www.opensolaris.org/os/licensing. 10*1708Sstevel * See the License for the specific language governing permissions 11*1708Sstevel * and limitations under the License. 12*1708Sstevel * 13*1708Sstevel * When distributing Covered Code, include this CDDL HEADER in each 14*1708Sstevel * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*1708Sstevel * If applicable, add the following below this CDDL HEADER, with the 16*1708Sstevel * fields enclosed by brackets "[]" replaced with your own identifying 17*1708Sstevel * information: Portions Copyright [yyyy] [name of copyright owner] 18*1708Sstevel * 19*1708Sstevel * CDDL HEADER END 20*1708Sstevel */ 21*1708Sstevel 22*1708Sstevel /* 23*1708Sstevel * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 24*1708Sstevel * Use is subject to license terms. 25*1708Sstevel */ 26*1708Sstevel 27*1708Sstevel #ifndef _SYS_AXQ_H 28*1708Sstevel #define _SYS_AXQ_H 29*1708Sstevel 30*1708Sstevel #pragma ident "%Z%%M% %I% %E% SMI" 31*1708Sstevel 32*1708Sstevel #ifdef __cplusplus 33*1708Sstevel extern "C" { 34*1708Sstevel #endif 35*1708Sstevel 36*1708Sstevel /* AXQ register offset constant */ 37*1708Sstevel #define AXQ_REG_OFFSET 0x20 38*1708Sstevel #define AXQ_REGOFF(idx) ((idx) * AXQ_REG_OFFSET) 39*1708Sstevel 40*1708Sstevel /* 41*1708Sstevel * AXQ system register offsets 42*1708Sstevel * Each Starcat AXQ asic instance is logically 43*1708Sstevel * associated with each slot in the expander board. 44*1708Sstevel * Slot 0 is the full slot (or full bandwidth slot) 45*1708Sstevel * and Slot1 is the half slot (or half bandwidth slot). 46*1708Sstevel * Some system registers are only accessible in certain 47*1708Sstevel * slot type. 48*1708Sstevel */ 49*1708Sstevel 50*1708Sstevel /* domain control register (slot0 & slot1) */ 51*1708Sstevel #define AXQ_SLOT0_DOMCTRL AXQ_REGOFF(0x1) 52*1708Sstevel #define AXQ_SLOT1_DOMCTRL AXQ_REGOFF(0x2) 53*1708Sstevel 54*1708Sstevel /* cpu2ssc intr register */ 55*1708Sstevel #define AXQ_SLOT_CPU2SSC_INTR AXQ_REGOFF(0x3) 56*1708Sstevel 57*1708Sstevel /* performance counters (one set per slot) */ 58*1708Sstevel #define AXQ_SLOT0_PERFCNT_SEL AXQ_REGOFF(0x9) 59*1708Sstevel #define AXQ_SLOT0_PERFCNT0 AXQ_REGOFF(0xA) 60*1708Sstevel #define AXQ_SLOT0_PERFCNT1 AXQ_REGOFF(0xB) 61*1708Sstevel #define AXQ_SLOT0_PERFCNT2 AXQ_REGOFF(0xC) 62*1708Sstevel #define AXQ_SLOT1_PERFCNT_SEL AXQ_REGOFF(0x8) 63*1708Sstevel #define AXQ_SLOT1_PERFCNT0 AXQ_REGOFF(0xD) 64*1708Sstevel #define AXQ_SLOT1_PERFCNT1 AXQ_REGOFF(0xE) 65*1708Sstevel #define AXQ_SLOT1_PERFCNT2 AXQ_REGOFF(0xF) 66*1708Sstevel 67*1708Sstevel /* CASM slots (for both slot0 & slot1) */ 68*1708Sstevel #define AXQ_CASM_SLOT_START AXQ_REGOFF(0x10) 69*1708Sstevel #define AXQ_CASM_SLOT_END AXQ_REGOFF(0x21) 70*1708Sstevel 71*1708Sstevel /* CDC registers (only available in slot0) */ 72*1708Sstevel #define AXQ_SLOT0_CDC_ADR_TEST AXQ_REGOFF(0x2C) 73*1708Sstevel #define AXQ_SLOT0_CDC_CTL_TEST AXQ_REGOFF(0x2D) 74*1708Sstevel #define AXQ_SLOT0_CDC_DATA_WR3 AXQ_REGOFF(0x2E) 75*1708Sstevel #define AXQ_SLOT0_CDC_DATA_WR2 AXQ_REGOFF(0x2F) 76*1708Sstevel #define AXQ_SLOT0_CDC_DATA_WR1 AXQ_REGOFF(0x30) 77*1708Sstevel #define AXQ_SLOT0_CDC_DATA_WR0 AXQ_REGOFF(0x31) 78*1708Sstevel #define AXQ_SLOT0_CDC_CNT_TEST AXQ_REGOFF(0x32) 79*1708Sstevel #define AXQ_SLOT0_CDC_RD_DATA3 AXQ_REGOFF(0x33) 80*1708Sstevel #define AXQ_SLOT0_CDC_RD_DATA2 AXQ_REGOFF(0x34) 81*1708Sstevel #define AXQ_SLOT0_CDC_RD_DATA1 AXQ_REGOFF(0x35) 82*1708Sstevel #define AXQ_SLOT0_CDC_RD_DATA0 AXQ_REGOFF(0x36) 83*1708Sstevel 84*1708Sstevel /* NASM registers */ 85*1708Sstevel #define AXQ_SLOT0_NASM AXQ_REGOFF(0x37) 86*1708Sstevel #define AXQ_SLOT1_NASM AXQ_REGOFF(0x38) 87*1708Sstevel 88*1708Sstevel #define AXQ_NASM_TYPE_IO 0 89*1708Sstevel #define AXQ_NASM_TYPE_SLOT0_CMMU 1 90*1708Sstevel #define AXQ_NASM_TYPE_WIB 2 91*1708Sstevel #define AXQ_NASM_TYPE_WIB_STRIPED 3 92*1708Sstevel #define AXQ_NASM_TYPE_SHIFT 5 93*1708Sstevel 94*1708Sstevel /* SDI Timeout register */ 95*1708Sstevel #define AXQ_SLOT_SDI_TIMEOUT_RD AXQ_REGOFF(0x2A) 96*1708Sstevel #define AXQ_SLOT_SDI_TIMEOUT_RDCLR AXQ_REGOFF(0x2B) 97*1708Sstevel 98*1708Sstevel /* 99*1708Sstevel * Bits for domain control register 100*1708Sstevel */ 101*1708Sstevel #define AXQ_DOMCTRL_BUSY 0x1 102*1708Sstevel #define AXQ_DOMCTRL_PAUSE 0x10 103*1708Sstevel #define AXQ_DOMCTRL_PIOFIX 0x40 104*1708Sstevel 105*1708Sstevel /* 106*1708Sstevel * Bits for CDC registers 107*1708Sstevel */ 108*1708Sstevel /* CDC control test register */ 109*1708Sstevel #define AXQ_CDC_TMODE_WR 0x20000 110*1708Sstevel #define AXQ_CDC_TMODE_RDCMP 0x40000 111*1708Sstevel #define AXQ_CDC_TMODE_WR_RDCMP0 0x60000 112*1708Sstevel #define AXQ_CDC_TMODE_WR_RDCMP1 0x80000 113*1708Sstevel #define AXQ_CDC_DATA_ECC_CHK_EN 0x10000 114*1708Sstevel #define AXQ_CDC_ADR_PAR_CHK_EN 0x08000 115*1708Sstevel #define AXQ_CDC_DATA_ECC_GEN_EN 0x04000 116*1708Sstevel #define AXQ_CDC_ADR_PAR_GEN_EN 0x02000 117*1708Sstevel #define AXQ_CDC_DATA2PAR_MUX_SEL_DATA 0x00800 118*1708Sstevel #define AXQ_CDC_ADR2SRAM_MUX_SEL_TEST 0x00080 119*1708Sstevel #define AXQ_CDC_ADR_INCR_XOR_CTRL 0x00010 120*1708Sstevel #define AXQ_CDC_DIS 0x00001 121*1708Sstevel 122*1708Sstevel /* CDC Address Test register */ 123*1708Sstevel #define AXQ_CDC_ADR_TEST_EN 0x80000 124*1708Sstevel 125*1708Sstevel /* CDC counter test register */ 126*1708Sstevel #define AXQ_CDC_CNT_TEST_DONE 0x80000000 127*1708Sstevel 128*1708Sstevel /* 129*1708Sstevel * Bits for CPU to SSC interrupt register 130*1708Sstevel */ 131*1708Sstevel #define AXQ_CPU2SSC_INTR_PEND 0x80000000 132*1708Sstevel 133*1708Sstevel /* 134*1708Sstevel * Each AXQ instance has one pcr (performance control 135*1708Sstevel * register) controlling 3 pics (performance instru- 136*1708Sstevel * mentation counter). pic0 and pic1 are similar 137*1708Sstevel * and have identical inputs to their muxes. pic2 138*1708Sstevel * only counts the clock. 139*1708Sstevel */ 140*1708Sstevel 141*1708Sstevel /* Bit masks for selecting pic mux input */ 142*1708Sstevel #define FREEZE_CNT 0x0 143*1708Sstevel #define COUNT_CLK 0x1 144*1708Sstevel #define HA_INPUT_FIFO 0x2 145*1708Sstevel #define HA_INTR_INFO 0x3 146*1708Sstevel #define HA_PIO_FIFO 0x4 147*1708Sstevel #define HA_ADR_FIFO_LK3 0x5 148*1708Sstevel #define HA_ADR_FIFO_LK2 0x6 149*1708Sstevel #define HA_ADR_FIFO_LK1 0x7 150*1708Sstevel #define HA_ADR_FIFO_LK0 0x8 151*1708Sstevel #define HA_DUMP_Q 0x9 152*1708Sstevel #define HA_RD_F_STB_Q 0xA 153*1708Sstevel #define HA_DP_WR_Q 0xB 154*1708Sstevel #define HA_INT_Q 0xC 155*1708Sstevel #define HA_WRB_Q 0xD 156*1708Sstevel #define HA_WR_MP_Q 0xE 157*1708Sstevel #define HA_WRTAG_Q 0xF 158*1708Sstevel #define HA_WT_WAIT_FIFO 0x10 159*1708Sstevel #define HA_WRB_STB_FIFO 0x11 160*1708Sstevel #define HA_AP0_Q 0x12 161*1708Sstevel #define HA_AP1_Q 0x13 162*1708Sstevel #define HA_NEW_WR_Q 0x14 163*1708Sstevel #define HA_DP_RD_Q 0x15 164*1708Sstevel #define HA_UNLOCK_Q 0x16 165*1708Sstevel #define HA_CDC_UPD_Q 0x17 166*1708Sstevel #define HA_DS_Q 0x18 167*1708Sstevel #define HA_UNLK_WAIT_Q 0x19 168*1708Sstevel #define HA_RD_MP_Q 0x1A 169*1708Sstevel #define L2_IO_Q 0x1B 170*1708Sstevel #define L2_SB_Q 0x1C 171*1708Sstevel #define L2_RA_Q 0x1D 172*1708Sstevel #define L2_HA_Q 0x1E 173*1708Sstevel #define L2_SA_Q 0x1F 174*1708Sstevel #define RA_WAIT_FIFO 0x20 175*1708Sstevel #define RA_WRB_INV_FIFO 0x21 176*1708Sstevel #define RA_WRB_FIFO 0x22 177*1708Sstevel #define RA_CC_PTR_FIFO 0x23 178*1708Sstevel #define RA_IO_PTR_FIFO 0x24 179*1708Sstevel #define RA_INT_PTR_FIFO 0x25 180*1708Sstevel #define RA_RP_Q 0x26 181*1708Sstevel #define RA_WRB_RP_Q 0x27 182*1708Sstevel #define RA_DP_Q 0x28 183*1708Sstevel #define RA_DP_STB_Q 0x29 184*1708Sstevel #define RA_GTARG_Q 0x2A 185*1708Sstevel #define SDC_RECV_Q 0x2B 186*1708Sstevel #define SDC_REDIR_IO_Q 0x2C 187*1708Sstevel #define SDC_REDIR_SB_Q 0x2D 188*1708Sstevel #define SDC_OUTB_IO_Q 0x2E 189*1708Sstevel #define SDC_OUTB_SB_Q 0x2F 190*1708Sstevel #define SA_ADD1_INPUT_Q 0x30 191*1708Sstevel #define SA_ADD2_INPUT_Q 0x31 192*1708Sstevel #define SA_INV_Q 0x32 193*1708Sstevel #define SA_NO_INV_Q 0x33 194*1708Sstevel #define SA_INT_DP_Q 0x34 195*1708Sstevel #define SA_DP_Q 0x35 196*1708Sstevel #define SL_WRTAG_Q 0x36 197*1708Sstevel #define SL_RTO_DP_Q 0x37 198*1708Sstevel #define SYSREG_INPUT_Q 0x38 199*1708Sstevel #define SDI_SYS_STATUS1 0x39 200*1708Sstevel #define SDI_SYS_STATUS0 0x3A 201*1708Sstevel #define CDC_HITS 0x3B 202*1708Sstevel #define TOTAL_CDC_READ 0x3C 203*1708Sstevel #define HA_WATRANID_SD 0x3D 204*1708Sstevel #define HA_STB_SD 0x3E 205*1708Sstevel #define HA_L2_IRQ_SD 0x3F 206*1708Sstevel #define HA_SL_WRTAG_SD 0x40 207*1708Sstevel #define AA_HOME_CC_FULL 0x41 208*1708Sstevel #define AA_HOME_IO_FULL 0x42 209*1708Sstevel #define AA_SLAVE_FULL 0x43 210*1708Sstevel #define AA_RP_FULL 0x44 211*1708Sstevel 212*1708Sstevel /* Shift definitions into pcr for programming pics */ 213*1708Sstevel #define AXQ_PIC_SHIFT 7 214*1708Sstevel 215*1708Sstevel /* event constants */ 216*1708Sstevel #define AXQ_NUM_EVENTS 0x45 217*1708Sstevel #define AXQ_PIC0_1_NUM_EVENTS 0x45 218*1708Sstevel #define AXQ_PIC2_NUM_EVENTS 0x2 219*1708Sstevel #define AXQ_NUM_PICS 3 220*1708Sstevel #define AXQ_PIC_CLEAR_MASK 0x7F 221*1708Sstevel 222*1708Sstevel /* AXQ constants */ 223*1708Sstevel #define SLOT0_AXQ 0 224*1708Sstevel #define SLOT1_AXQ 1 225*1708Sstevel #define AXQ_MAX_EXP 18 226*1708Sstevel #define AXQ_MAX_SLOT_PER_EXP 2 227*1708Sstevel #define AXQ_CDC_SRAM_SIZE 0x40000 228*1708Sstevel #define AXQ_CDC_FLUSH_WAIT 4 229*1708Sstevel #define AXQ_INTR_PEND_WAIT 10 230*1708Sstevel #define AXQ_NASM_SIZE 256 231*1708Sstevel 232*1708Sstevel /* 233*1708Sstevel * Struct element describing a eventname and 234*1708Sstevel * its pcr-mask. 235*1708Sstevel */ 236*1708Sstevel typedef struct axq_event_mask { 237*1708Sstevel char *event_name; 238*1708Sstevel uint64_t pcr_mask; 239*1708Sstevel } axq_event_mask_t; 240*1708Sstevel 241*1708Sstevel /* 242*1708Sstevel * NASM RAM system register for reading 243*1708Sstevel */ 244*1708Sstevel typedef union { 245*1708Sstevel struct axq_nasm_read { 246*1708Sstevel uint32_t pad : 16; 247*1708Sstevel uint32_t valid : 1; 248*1708Sstevel uint32_t addr : 8; 249*1708Sstevel uint32_t data : 7; 250*1708Sstevel } bit; 251*1708Sstevel uint32_t val; 252*1708Sstevel } axq_nasm_read_u; 253*1708Sstevel 254*1708Sstevel /* 255*1708Sstevel * NASM RAM system register for reading 256*1708Sstevel */ 257*1708Sstevel typedef union { 258*1708Sstevel struct axq_nasm_write { 259*1708Sstevel uint32_t pad : 16; 260*1708Sstevel uint32_t addr : 8; 261*1708Sstevel uint32_t rw : 1; 262*1708Sstevel uint32_t data : 7; 263*1708Sstevel } bit; 264*1708Sstevel uint32_t val; 265*1708Sstevel } axq_nasm_write_u; 266*1708Sstevel 267*1708Sstevel 268*1708Sstevel /* 269*1708Sstevel * Global data structure that is used to 270*1708Sstevel * export certain axq registers in 271*1708Sstevel * local space. Right now, the only 272*1708Sstevel * register we want to access in local space 273*1708Sstevel * is the cheetah2ssc interrupt reg. There 274*1708Sstevel * could be more in future. 275*1708Sstevel */ 276*1708Sstevel struct axq_local_regs { 277*1708Sstevel kmutex_t axq_local_lock; 278*1708Sstevel int initflag; 279*1708Sstevel caddr_t laddress; 280*1708Sstevel ddi_acc_handle_t ac; 281*1708Sstevel volatile uint32_t *axq_cpu2ssc_intr; 282*1708Sstevel }; 283*1708Sstevel 284*1708Sstevel /* 285*1708Sstevel * axq soft state data structure. 286*1708Sstevel */ 287*1708Sstevel struct axq_soft_state { 288*1708Sstevel dev_info_t *dip; /* devinfo of myself */ 289*1708Sstevel uint32_t portid; /* port id */ 290*1708Sstevel uint32_t expid; /* expander id */ 291*1708Sstevel uchar_t slotnum; /* slot 0 or 1 */ 292*1708Sstevel caddr_t address; /* mapped devnode addr property */ 293*1708Sstevel ddi_acc_handle_t ac0; /* access handle for reg0 mapping */ 294*1708Sstevel uint64_t axq_phyaddr; /* physical address of conf space */ 295*1708Sstevel kmutex_t axq_lock; /* mutex protecting this softstate */ 296*1708Sstevel 297*1708Sstevel volatile uint32_t *axq_domain_ctrl; 298*1708Sstevel 299*1708Sstevel /* CASM register slots */ 300*1708Sstevel volatile uint32_t *axq_casm_slot[18]; 301*1708Sstevel 302*1708Sstevel /* NASM register */ 303*1708Sstevel volatile uint32_t *axq_nasm; 304*1708Sstevel 305*1708Sstevel /* CDC registers (only in slot0) */ 306*1708Sstevel volatile uint32_t *axq_cdc_addrtest; 307*1708Sstevel volatile uint32_t *axq_cdc_ctrltest; 308*1708Sstevel volatile uint32_t *axq_cdc_datawrite0; 309*1708Sstevel volatile uint32_t *axq_cdc_datawrite1; 310*1708Sstevel volatile uint32_t *axq_cdc_datawrite2; 311*1708Sstevel volatile uint32_t *axq_cdc_datawrite3; 312*1708Sstevel volatile uint32_t *axq_cdc_counter; 313*1708Sstevel volatile uint32_t *axq_cdc_readdata0; 314*1708Sstevel volatile uint32_t *axq_cdc_readdata1; 315*1708Sstevel volatile uint32_t *axq_cdc_readdata2; 316*1708Sstevel volatile uint32_t *axq_cdc_readdata3; 317*1708Sstevel 318*1708Sstevel /* performance counters */ 319*1708Sstevel volatile uint32_t *axq_pcr; 320*1708Sstevel volatile uint32_t *axq_pic0; 321*1708Sstevel volatile uint32_t *axq_pic1; 322*1708Sstevel volatile uint32_t *axq_pic2; 323*1708Sstevel kstat_t *axq_counters_ksp; /* perf counter kstat */ 324*1708Sstevel 325*1708Sstevel /* SDI timeout register */ 326*1708Sstevel volatile uint32_t *axq_sdi_timeout_rd; 327*1708Sstevel volatile uint32_t *axq_sdi_timeout_rdclr; 328*1708Sstevel 329*1708Sstevel uint32_t axq_cdc_state; /* CDC state - enabled/disabled */ 330*1708Sstevel int paused; /* AXQ_DOMCTRL_PAUSE asserted */ 331*1708Sstevel 332*1708Sstevel #ifndef _AXQ_LOCAL_ACCESS_SUPPORTED 333*1708Sstevel /* 334*1708Sstevel * No local access for cpu2ssc intr 335*1708Sstevel * Need to provide per instance explicit expander addressing 336*1708Sstevel */ 337*1708Sstevel volatile uint32_t *axq_cpu2ssc_intr; 338*1708Sstevel #endif /* _AXQ_LOCAL_ACCESS_SUPPORTED */ 339*1708Sstevel }; 340*1708Sstevel 341*1708Sstevel /* 342*1708Sstevel * Public interface 343*1708Sstevel */ 344*1708Sstevel extern int axq_cdc_flush(uint32_t, int, int); 345*1708Sstevel extern int axq_cdc_flush_all(); 346*1708Sstevel extern int axq_cdc_disable_flush_all(); 347*1708Sstevel extern void axq_cdc_enable_all(); 348*1708Sstevel extern int axq_iopause_enable_all(uint32_t *); 349*1708Sstevel extern void axq_iopause_disable_all(); 350*1708Sstevel extern uint32_t axq_casm_read(uint32_t, uint32_t, int); 351*1708Sstevel extern int axq_casm_write(uint32_t, uint32_t, int, uint32_t); 352*1708Sstevel extern int axq_casm_write_all(int, uint32_t); 353*1708Sstevel extern int axq_do_casm_rename_script(uint64_t **, int, int); 354*1708Sstevel extern int axq_cpu2ssc_intr(uint8_t); 355*1708Sstevel extern uint32_t axq_read_sdi_timeout_reg(uint32_t, uint32_t, int); 356*1708Sstevel extern int axq_nasm_read(uint32_t expid, uint32_t slot, uint32_t nasm_entry, 357*1708Sstevel uint32_t *data); 358*1708Sstevel extern int axq_nasm_write(uint32_t expid, uint32_t slot, uint32_t nasm_entry, 359*1708Sstevel uint32_t data); 360*1708Sstevel extern int axq_nasm_write_all(uint32_t nasm_entry, uint32_t data); 361*1708Sstevel extern void axq_array_rw_enter(void); 362*1708Sstevel extern void axq_array_rw_exit(void); 363*1708Sstevel 364*1708Sstevel #ifdef __cplusplus 365*1708Sstevel } 366*1708Sstevel #endif 367*1708Sstevel 368*1708Sstevel #endif /* _SYS_AXQ_H */ 369