nv_sgpio.h revision 10336:d12a11a8c2b8
1272343Sngie/* 2272343Sngie * CDDL HEADER START 3272343Sngie * 4272343Sngie * The contents of this file are subject to the terms of the 5272343Sngie * Common Development and Distribution License (the "License"). 6272343Sngie * You may not use this file except in compliance with the License. 7272343Sngie * 8272343Sngie * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9272343Sngie * or http://www.opensolaris.org/os/licensing. 10272343Sngie * See the License for the specific language governing permissions 11272343Sngie * and limitations under the License. 12272343Sngie * 13272343Sngie * When distributing Covered Code, include this CDDL HEADER in each 14272343Sngie * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15272343Sngie * If applicable, add the following below this CDDL HEADER, with the 16272343Sngie * fields enclosed by brackets "[]" replaced with your own identifying 17272343Sngie * information: Portions Copyright [yyyy] [name of copyright owner] 18272343Sngie * 19272343Sngie * CDDL HEADER END 20272343Sngie */ 21272343Sngie 22272343Sngie/* 23272343Sngie * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24272343Sngie * Use is subject to license terms. 25272343Sngie */ 26272343Sngie 27272343Sngie#ifndef _NV_SGPIO_H 28272343Sngie#define _NV_SGPIO_H 29272343Sngie 30272343Sngie 31272343Sngie#ifdef __cplusplus 32272343Sngieextern "C" { 33272343Sngie#endif 34272343Sngie 35272343Sngie/* 36272343Sngie * SGPIO Command Timeout (2000ms, in usecs) 37272343Sngie */ 38272343Sngie#define NV_SGP_CMD_TIMEOUT 2000000 39272343Sngie 40272343Sngie/* 41272343Sngie * SGPIO Configuration Space Offsets 42272343Sngie */ 43272343Sngie#define SGPIO_CSRP 0x58 44272343Sngie#define SGPIO_CBP 0x5c 45272343Sngie 46272343Sngie 47272343Sngie/* 48272343Sngie * SGPIO Command/Status Register 49272343Sngie */ 50272343Sngie 51272343Sngie/* Command field - write-only */ 52272343Sngie#define SGPIO_CSR_CMD_MASK 0x000000e0 53272343Sngie#define SGPIO_CSR_CMD_SHFT 5 54272343Sngie#define SGPIO_CSR_CMD_SET(y) (((y) << SGPIO_CSR_CMD_SHFT) & \ 55272343Sngie SGPIO_CSR_CMD_MASK) 56272343Sngie 57272343Sngie/* Command field values */ 58272343Sngie#define SGPIO_CMD_RESET 0x0 59272343Sngie#define SGPIO_CMD_READ_PARAMS 0x1 60272343Sngie#define SGPIO_CMD_READ_DATA 0x2 61272343Sngie#define SGPIO_CMD_WRITE_DATA 0x3 62272343Sngie 63272343Sngie/* Command Status field - read-only */ 64272343Sngie#define SGPIO_CSR_CSTAT_MASK 0x00000018 65272343Sngie#define SGPIO_CSR_CSTAT_SHFT 3 66272343Sngie#define SGPIO_CSR_CSTAT(x) (((x) & SGPIO_CSR_CSTAT_MASK) >> \ 67272343Sngie SGPIO_CSR_CSTAT_SHFT) 68272343Sngie 69272343Sngie/* Command Status field values */ 70272343Sngie#define SGPIO_CMD_OK 0x0 71272343Sngie#define SGPIO_CMD_ACTIVE 0x1 72272343Sngie#define SGPIO_CMD_ERROR 0x2 73272343Sngie 74272343Sngie/* Sequence field - read-only */ 75272343Sngie#define SGPIO_CSR_SEQ_MASK 0x00000004 76272343Sngie#define SGPIO_CSR_SEQ_SHFT 2 77272343Sngie#define SGPIO_CSR_SEQ(x) (((x) & SGPIO_CSR_SEQ_MASK) >> \ 78272343Sngie SGPIO_CSR_SEQ_SHFT) 79272343Sngie 80272343Sngie/* SGPIO Status field - read-only */ 81272343Sngie#define SGPIO_CSR_SSTAT_MASK 0x00000003 82272343Sngie#define SGPIO_CSR_SSTAT_SHFT 0 83272343Sngie#define SGPIO_CSR_SSTAT(x) (((x) & SGPIO_CSR_SSTAT_MASK) >> \ 84272343Sngie SGPIO_CSR_SSTAT_SHFT) 85272343Sngie 86272343Sngie/* SGPIO Status field values */ 87272343Sngie#define SGPIO_STATE_RESET 0x0 88272343Sngie#define SGPIO_STATE_OPERATIONAL 0x1 89272343Sngie#define SGPIO_STATE_ERROR 0x2 90272343Sngie 91272343Sngie 92272343Sngie/* 93272343Sngie * SGPIO Control Block 94272343Sngie * This is not the entire control block. It stops at the last register 95272343Sngie * that could possibly be used. 96272343Sngie */ 97272343Sngietypedef struct nv_sgp_cb { 98272343Sngie#if defined(__amd64) 99272343Sngie uint64_t sgpio_sr; /* Scratch Register 0-1 */ 100272343Sngie#else 101272343Sngie uint32_t sgpio_sr; /* Scratch Register 0-1 */ 102272343Sngie uint32_t sgpio_sr1; /* Scratch Register 0-1 */ 103272343Sngie#endif 104272343Sngie uint32_t sgpio_nvcr; /* NVIDIA Configuration Register */ 105272343Sngie uint32_t sgpio_cr0; /* Configuration Register 0 */ 106272343Sngie uint32_t sgpio_cr1; /* Configuration Register 1 */ 107272343Sngie uint32_t rsrd; 108272343Sngie uint32_t sgpio_gptxcr; /* General Purpose Transmit */ 109272343Sngie /* Configuration Register */ 110272343Sngie uint32_t sgpio_gprxcr; /* General Purpose Receive */ 111272343Sngie /* Configuration Register */ 112272343Sngie uint32_t sgpio0_tr; /* SGPIO 0 Transmit Register */ 113272343Sngie uint32_t sgpio1_tr; /* SGPIO 1 Transmit Register */ 114272343Sngie} nv_sgp_cb_t; 115272343Sngie 116272343Sngie 117272343Sngie/* 118272343Sngie * NVIDIA Configuration Register (SGPIO_NVCR) 119272343Sngie * Contains read-only configuration fields that are unique to NVIDIA's 120272343Sngie * implementation of SGPIO and therefore not defined in SFF8485. 121272343Sngie */ 122272343Sngie 123272343Sngie/* Initiator Count */ 124272343Sngie#define SGP_NVCR_INIT_CNT_MASK 0x0000000f 125272343Sngie#define SGP_NVCR_INIT_CNT_SHFT 0 126272343Sngie#define SGP_NVCR_INIT_CNT(x) (((x) & SGP_NVCR_INIT_CNT_MASK) >> \ 127272343Sngie SGP_NVCR_INIT_CNT_SHFT) 128272343Sngie 129272343Sngie/* fixed value */ 130272343Sngie#define SGPIO_NVCR_INIT_CNT_VAL 0x2 131272343Sngie 132272343Sngie/* Command Block Size */ 133272343Sngie#define SGP_NVCR_CB_SIZE_MASK 0x0000ff00 134272343Sngie#define SGP_NVCR_CB_SIZE_SHFT 8 135272343Sngie#define SGP_NVCR_CB_SIZE(x) (((x) & SGP_NVCR_CB_SIZE_MASK) >> \ 136272343Sngie SGP_NVCR_CB_SIZE_SHFT) 137272343Sngie 138272343Sngie/* Command Block Version */ 139272343Sngie#define SGP_NVCR_CB_VERS_MASK 0x00ff0000 140272343Sngie#define SGP_NVCR_CB_VERS_SHFT 16 141272343Sngie#define SGP_NVCR_CB_VERS(x) (((x) & SGP_NVCR_CB_VERS_MASK) >> \ 142272343Sngie SGP_NVCR_CB_VERS_SHFT) 143272343Sngie 144272343Sngie/* current version value */ 145272343Sngie#define SGP_NVCR_CB_VERSION 0 146272343Sngie 147272343Sngie 148272343Sngie/* 149272343Sngie * SGPIO Configuration Register 0 (SGPIO_CR0) 150272343Sngie */ 151272343Sngie 152272343Sngie/* Version */ 153272343Sngie#define SGP_CR0_VERS_MASK 0x00000f00 154272343Sngie#define SGP_CR0_VERS_SHFT 8 155272343Sngie#define SGP_CR0_VERS(x) (((x) & SGP_CR0_VERS_MASK) >> \ 156272343Sngie SGP_CR0_VERS_SHFT) 157272343Sngie 158272343Sngie/* fixed value */ 159272343Sngie#define SGP_CR0_VERSION 0 160272343Sngie 161272343Sngie/* Enable - write-only */ 162272343Sngie#define SGP_CR0_ENABLE_MASK 0x00800000 163272343Sngie 164272343Sngie/* CFG Register Count */ 165272343Sngie#define SGP_CR0_CFG_RC_MASK 0x00700000 166272343Sngie#define SGP_CR0_CFG_RC_SHFT 20 167272343Sngie#define SGP_CR0_CFG_RC(x) (((x) & SGP_CR0_CFG_RC_MASK) >> \ 168272343Sngie SGP_CR0_CFG_RC_SHFT) 169272343Sngie 170272343Sngie/* fixed value */ 171272343Sngie#define SGPIO_CR_GP_REG_COUNT 0x1 172272343Sngie 173272343Sngie/* GP Register Count */ 174272343Sngie#define SGP_CR0_GP_RC_MASK 0x000f0000 175272343Sngie#define SGP_CR0_GP_RC_SHFT 16 176272343Sngie#define SGP_CR0_GP_RC(x) (((x) & SGP_CR0_GP_RC_MASK) >> \ 177272343Sngie SGP_CR0_GP_RC_SHFT) 178272343Sngie 179272343Sngie/* fixed value */ 180272343Sngie#define SGPIO_CR_CFG_REG_COUNT 0x2 181272343Sngie 182272343Sngie/* Supported Drive Count */ 183272343Sngie#define SGP_CR0_DRV_CNT_MASK 0xff000000 184272343Sngie#define SGP_CR0_DRV_CNT_SHFT 24 185272343Sngie#define SGP_CR0_DRV_CNT(x) (((x) & SGP_CR0_DRV_CNT_MASK) >> \ 186272343Sngie SGP_CR0_DRV_CNT_SHFT) 187272343Sngie 188272343Sngie/* fixed value */ 189272343Sngie#define SGPIO_DRV_CNT_VALUE 4 190272343Sngie 191272343Sngie/* 192272343Sngie * SGPIO Configuration Register 1 (SGPIO_CR1) 193272343Sngie */ 194272343Sngie 195272343Sngie#ifdef SGPIO_BLINK 196272343Sngie/* 197272343Sngie * NVIDIA documents these Blink Generator Rate values. However, 198272343Sngie * setting up the LEDs to use these Blink Generators does not result 199272343Sngie * in blinking LEDs. 200272343Sngie */ 201272343Sngie 202272343Sngie/* Blink Generator Rate B */ 203272343Sngie#define SGPIO_CR1_BGR_B_MASK 0x0000f000 204272343Sngie#define SGPIO_CR1_BGR_B_SHFT 12 205272343Sngie#define SGPIO_CR1_BGR_B_SET(y) ((y) << SGPIO_CR1_BGR_B_SHFT) & \ 206272343Sngie SGPIO_CR1_BGR_B_MASK) 207272343Sngie 208272343Sngie/* Blink Generator Rate A */ 209272343Sngie#define SGPIO_CR1_BGR_A_MASK 0x00000f00 210272343Sngie#define SGPIO_CR1_BGR_A_SHFT 8 211272343Sngie#define SGPIO_CR1_BGR_A_SET(y) ((y) << SGPIO_CR1_BGR_A_SHFT) & \ 212272343Sngie SGPIO_CR1_BGR_A_MASK) 213272343Sngie 214272343Sngie/* Blink Generator Rate values */ 215272343Sngie#define SGPIO_BLK_1_8 0x0 /* 1/8 seconds */ 216272343Sngie#define SGPIO_BLK_2_8 0x1 /* 2/8 seconds */ 217272343Sngie#define SGPIO_BLK_3_8 0x2 /* 3/8 seconds */ 218272343Sngie#define SGPIO_BLK_4_8 0x3 /* 4/8 seconds */ 219272343Sngie#define SGPIO_BLK_5_8 0x4 /* 5/8 seconds */ 220272343Sngie#define SGPIO_BLK_6_8 0x5 /* 6/8 seconds */ 221272343Sngie#define SGPIO_BLK_7_8 0x6 /* 7/8 seconds */ 222272343Sngie#define SGPIO_BLK_8_8 0x7 /* 8/8 seconds */ 223272343Sngie#define SGPIO_BLK_9_8 0x8 /* 9/8 seconds */ 224272343Sngie#define SGPIO_BLK_10_8 0x9 /* 10/8 seconds */ 225272343Sngie#define SGPIO_BLK_11_8 0xa /* 11/8 seconds */ 226272343Sngie#define SGPIO_BLK_12_8 0xb /* 12/8 seconds */ 227272343Sngie#define SGPIO_BLK_13_8 0xc /* 13/8 seconds */ 228272343Sngie#define SGPIO_BLK_14_8 0xd /* 14/8 seconds */ 229272343Sngie#define SGPIO_BLK_15_8 0xe /* 15/8 seconds */ 230272343Sngie#define SGPIO_BLK_16_8 0xf /* 16/8 seconds */ 231272343Sngie#endif /* SGPIO_BLINK */ 232272343Sngie 233272343Sngie/* 234272343Sngie * SGPIO 0 Transmit Register (SGPIO_0_TR) 235272343Sngie */ 236272343Sngie 237272343Sngie/* Drive x Activity/Locate/Error */ 238272343Sngie#define SGPIO0_TR_DRV_SET(y, a) (((y) & 0xff) << ((3 - (a)) * 8)) 239272343Sngie#define SGPIO0_TR_DRV_CLR(a) ~(0xff << ((3 - (a)) * 8)) 240272343Sngie#define SGPIO0_TR_DRV(x, a) (((x) >> ((3 - (a)) * 8)) & 0xff) 241272343Sngie#define TR_ACTIVE_MASK_ALL 0xe0e0e0e0 242272343Sngie#define TR_LOCATE_MASK_ALL 0x18181818 243272343Sngie#define TR_ERROR_MASK_ALL 0x07070707 244272343Sngie 245272343Sngie/* Drive x Activity */ 246272343Sngie#define TR_ACTIVE_MASK 0xe0 247272343Sngie#define TR_ACTIVE_SHFT 5 248272343Sngie#define TR_ACTIVE_SET(y) (((y) << TR_ACTIVE_SHFT) & TR_ACTIVE_MASK) 249272343Sngie#define TR_ACTIVE(x) (((x) & TR_ACTIVE_MASK) >> TR_ACTIVE_SHFT) 250272343Sngie 251272343Sngie/* Drive x Activity values */ 252272343Sngie#define TR_ACTIVE_DISABLE 0x0 /* Disable activity indicator */ 253272343Sngie#define TR_ACTIVE_ENABLE 0x1 /* Enable activity indicator */ 254272343Sngie#ifdef SGPIO_BLINK 255272343Sngie#define TR_ACTIVE_BLINK_A_ON 0x2 /* Select blink generator A, 50% */ 256272343Sngie /* duty cycle, on for the first */ 257272343Sngie /* half-cycle, off for the second */ 258272343Sngie /* half. */ 259272343Sngie#define TR_ACTIVE_BLINK_A_OFF 0x3 /* Select blink generator A, 50% */ 260272343Sngie /* duty cycle, off for the first */ 261272343Sngie /* half-cycle, on for the second */ 262272343Sngie /* half. */ 263272343Sngie#define TR_ACTIVE_BLINK_B_ON 0x6 /* Select blink generator B, 50% */ 264272343Sngie /* duty cycle, on for the first */ 265272343Sngie /* half-cycle, off for the second */ 266272343Sngie /* half. */ 267272343Sngie#define TR_ACTIVE_BLINK_B_OFF 0x7 /* Select blink generator B, 50% */ 268272343Sngie /* duty cycle, off for the first */ 269272343Sngie /* half-cycle, on for the second */ 270272343Sngie /* half. */ 271272343Sngie#endif /* SGPIO_BLINK */ 272272343Sngie 273272343Sngie/* Drive x Locate */ 274272343Sngie#define TR_LOCATE_MASK 0x18 275272343Sngie#define TR_LOCATE_SHFT 3 276272343Sngie#define TR_LOCATE_SET(y) (((y) << TR_LOCATE_SHFT) & TR_LOCATE_MASK) 277272343Sngie#define TR_LOCATE(x) (((x) & TR_LOCATE_MASK) >> TR_LOCATE_SHFT) 278272343Sngie 279272343Sngie/* Drive x Locate values */ 280272343Sngie#define TR_LOCATE_DISABLE 0x0 /* Disable locate indicator */ 281272343Sngie#define TR_LOCATE_ENABLE 0x1 /* Enable locate indicator */ 282272343Sngie#ifdef SGPIO_BLINK 283272343Sngie#define TR_LOCATE_BLINK_ON 0x2 /* Select blink generator A, 50% */ 284272343Sngie /* duty cycle, on for the first */ 285272343Sngie /* half-cycle, off for the second */ 286272343Sngie /* half. */ 287272343Sngie#define TR_LOCATE_BLINK_OFF 0x3 /* Select blink generator A, 50% */ 288272343Sngie /* duty cycle, off for the first */ 289272343Sngie /* half-cycle, on for the second */ 290272343Sngie /* half. */ 291272343Sngie#endif /* SGPIO_BLINK */ 292272343Sngie 293272343Sngie/* Drive x Error */ 294272343Sngie#define TR_ERROR_MASK 0x07 295272343Sngie#define TR_ERROR_SHFT 0 296272343Sngie#define TR_ERROR_SET(y) (((y) << TR_ERROR_SHFT) & TR_ERROR_MASK) 297272343Sngie#define TR_ERROR(x) (((x) & TR_ERROR_MASK) >> TR_ERROR_SHFT) 298272343Sngie 299272343Sngie/* Drive x Error values */ 300272343Sngie#define TR_ERROR_DISABLE 0x0 /* Disable error indicator */ 301272343Sngie#define TR_ERROR_ENABLE 0x1 /* Enable error indicator */ 302272343Sngie#ifdef SGPIO_BLINK 303272343Sngie#define TR_ERROR_BLINK_A_ON 0x2 /* Select blink generator A, 50% */ 304272343Sngie /* duty cycle, on for the first */ 305272343Sngie /* half-cycle, off for the second */ 306272343Sngie /* half for error indicator. */ 307272343Sngie#define TR_ERROR_BLINK_A_OFF 0x3 /* Select blink generator A, 50% */ 308272343Sngie /* duty cycle, off for the first */ 309272343Sngie /* half-cycle, on for the second */ 310272343Sngie /* half for error indicator. */ 311272343Sngie#define TR_ERROR_BLINK_B_ON 0x6 /* Select blink generator B, 50% */ 312272343Sngie /* duty cycle, on for the first */ 313272343Sngie /* half-cycle, off for the second */ 314272343Sngie /* half for error indicator. */ 315272343Sngie#define TR_ERROR_BLINK_B_OFF 0x7 /* Select blink generator B, 50% */ 316272343Sngie /* duty cycle, off for the first */ 317272343Sngie /* half-cycle, on for the second */ 318272343Sngie /* half for error indicator. */ 319272343Sngie#endif /* SGPIO_BLINK */ 320272343Sngie 321272343Sngie/* 322272343Sngie * SGPIO 1 Transmit Register (SGPIO_1_TR) 323272343Sngie */ 324272343Sngie 325272343Sngie/* Drive x Activity/Locate/Error */ 326272343Sngie#define SGPIO1_TR_DRV_SET(y, a) (((y) & 0xff) << ((7 - (a)) * 8)) 327272343Sngie#define SGPIO1_TR_DRV_CLR(a) ~(0xff << ((7 - (a)) * 8)) 328272343Sngie#define SGPIO1_TR_DRV(x, a) (((x) >> ((7 - (a)) * 8)) & 0xff) 329272343Sngie 330272343Sngie#ifdef __cplusplus 331272343Sngie} 332272343Sngie#endif 333272343Sngie 334272343Sngie#endif /* _NV_SGPIO_H */ 335272343Sngie