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