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