nv_sata.h revision 13106:98bb3694e858
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 (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 24 */ 25 26#ifndef _NV_SATA_H 27#define _NV_SATA_H 28 29 30#ifdef __cplusplus 31extern "C" { 32#endif 33 34 35/* 36 * SGPIO Support 37 * Enable SGPIO support only on x86/x64, because it is implemented using 38 * functions that are only available on x86/x64. 39 */ 40 41#define NV_MAX_PORTS(nvc) nvc->nvc_sata_hba_tran.sata_tran_hba_num_cports 42 43typedef struct nv_port nv_port_t; 44 45#ifdef SGPIO_SUPPORT 46typedef struct nv_sgp_cmn nv_sgp_cmn_t; 47#endif 48 49/* 50 * sizes of strings to allocate 51 */ 52#define NV_STR_LEN 10 53#define NV_LOGBUF_LEN 512 54#define NV_REASON_LEN 30 55 56 57typedef struct nv_ctl { 58 /* 59 * Each of these are specific to the chipset in use. 60 */ 61 uint_t (*nvc_interrupt)(caddr_t arg1, caddr_t arg2); 62 void (*nvc_reg_init)(struct nv_ctl *nvc, 63 ddi_acc_handle_t pci_conf_handle); 64 65 dev_info_t *nvc_dip; /* devinfo pointer of controller */ 66 67 struct nv_port *nvc_port; /* array of pointers to port struct */ 68 69 /* 70 * handle and base address to register space. 71 * 72 * 0: port 0 task file 73 * 1: port 0 status 74 * 2: port 1 task file 75 * 3: port 1 status 76 * 4: bus master for both ports 77 * 5: extended registers for SATA features 78 */ 79 ddi_acc_handle_t nvc_bar_hdl[6]; 80 uchar_t *nvc_bar_addr[6]; 81 82 /* 83 * sata registers in bar 5 which are shared on all devices 84 * on the channel. 85 */ 86 uint32_t *nvc_mcp5x_ctl; 87 uint32_t *nvc_mcp5x_ncq; /* NCQ status control bits */ 88 89 kmutex_t nvc_mutex; /* ctrl level lock */ 90 91 ddi_intr_handle_t *nvc_htable; /* For array of interrupts */ 92 int nvc_intr_type; /* What type of interrupt */ 93 int nvc_intr_cnt; /* # of intrs count returned */ 94 size_t nvc_intr_size; /* Size of intr array to */ 95 uint_t nvc_intr_pri; /* Interrupt priority */ 96 int nvc_intr_cap; /* Interrupt capabilities */ 97 uint8_t *nvc_ck804_int_status; /* interrupt status ck804 */ 98 99 sata_hba_tran_t nvc_sata_hba_tran; /* sata_hba_tran for ctrl */ 100 101 /* 102 * enable/disable interrupts, controller specific 103 */ 104 void (*nvc_set_intr)(nv_port_t *nvp, int flag); 105 int nvc_state; /* state flags of ctrl see below */ 106 uint8_t nvc_revid; /* PCI revid of device */ 107 boolean_t dma_40bit; /* 40bit DMA support */ 108 109#ifdef SGPIO_SUPPORT 110 int nvc_mcp5x_flag; /* is the controller MCP51/MCP55 */ 111 uint8_t nvc_ctlr_num; /* controller number within the part */ 112 uint32_t nvc_sgp_csr; /* SGPIO CSR i/o address */ 113 volatile nv_sgp_cb_t *nvc_sgp_cbp; /* SGPIO Control Block */ 114 nv_sgp_cmn_t *nvc_sgp_cmn; /* SGPIO shared data */ 115#endif 116} nv_ctl_t; 117 118 119struct nv_port { 120 121 struct nv_ctl *nvp_ctlp; /* back pointer to controller */ 122 123 uint8_t nvp_port_num; /* port number, ie 0 or 1 */ 124 125 uint8_t nvp_type; /* SATA_DTYPE_{NONE,ATADISK,UNKNOWN} */ 126 uint32_t nvp_signature; /* sig acquired from task file regs */ 127 uchar_t *nvp_cmd_addr; /* base addr for cmd regs for port */ 128 uchar_t *nvp_bm_addr; /* base addr for bus master for port */ 129 uchar_t *nvp_ctl_addr; /* base addr for ctrl regs for port */ 130 131 ddi_acc_handle_t nvp_cmd_hdl; 132 uchar_t *nvp_data; /* data register */ 133 uchar_t *nvp_error; /* error register (read) */ 134 uchar_t *nvp_feature; /* features (write) */ 135 uchar_t *nvp_count; /* sector count */ 136 uchar_t *nvp_sect; /* sector number */ 137 uchar_t *nvp_lcyl; /* cylinder low byte */ 138 uchar_t *nvp_hcyl; /* cylinder high byte */ 139 uchar_t *nvp_drvhd; /* drive/head register */ 140 uchar_t *nvp_status; /* status/command register */ 141 uchar_t *nvp_cmd; /* status/command register */ 142 143 ddi_acc_handle_t nvp_ctl_hdl; 144 uchar_t *nvp_altstatus; /* alternate status (read) */ 145 uchar_t *nvp_devctl; /* device control (write) */ 146 147 ddi_acc_handle_t nvp_bm_hdl; 148 uchar_t *nvp_bmisx; 149 uint32_t *nvp_bmidtpx; 150 uchar_t *nvp_bmicx; 151 152 ddi_dma_handle_t *nvp_sg_dma_hdl; /* dma handle to prd table */ 153 caddr_t *nvp_sg_addr; /* virtual addr of prd table */ 154 uint32_t *nvp_sg_paddr; /* physical address of prd table */ 155 ddi_acc_handle_t *nvp_sg_acc_hdl; /* mem acc handle to the prd table */ 156 157 uint32_t *nvp_sstatus; 158 uint32_t *nvp_serror; 159 uint32_t *nvp_sctrl; 160 uint32_t *nvp_sactive; 161 162 kmutex_t nvp_mutex; /* main per port mutex */ 163 kcondvar_t nvp_sync_cv; /* handshake btwn ISR and start thrd */ 164 kcondvar_t nvp_reset_cv; /* when reset is synchronous */ 165 166 /* 167 * nvp_slot is a pointer to an array of nv_slot 168 */ 169 struct nv_slot *nvp_slot; 170 uint32_t nvp_sactive_cache; /* cache of SACTIVE */ 171 uint8_t nvp_queue_depth; 172 173 /* 174 * NCQ flow control. During NCQ operation, no other commands 175 * allowed. The following are used to enforce this. 176 */ 177 int nvp_ncq_run; 178 int nvp_non_ncq_run; 179 int nvp_seq; 180 181 timeout_id_t nvp_timeout_id; 182 183 clock_t nvp_reset_time; /* time of last reset */ 184 clock_t nvp_link_event_time; /* time of last plug event */ 185 int nvp_reset_retry_count; 186 clock_t nvp_wait_sig; /* wait before rechecking sig */ 187 188 int nvp_state; /* state of port. flags defined below */ 189 190 uint16_t *nvp_mcp5x_int_status; 191 uint16_t *nvp_mcp5x_int_ctl; 192 193#ifdef SGPIO_SUPPORT 194 uint8_t nvp_sgp_ioctl_mod; /* LEDs modified by ioctl */ 195#endif 196 clock_t nvp_timeout_duration; 197 198 199 /* 200 * debug and statistical information 201 */ 202 clock_t nvp_rem_time; 203 clock_t nvp_add_time; 204 clock_t nvp_trans_link_time; 205 int nvp_trans_link_count; 206 207 uint8_t nvp_last_cmd; 208 uint8_t nvp_previous_cmd; 209 int nvp_reset_count; 210 char nvp_first_reset_reason[NV_REASON_LEN]; 211 char nvp_reset_reason[NV_REASON_LEN]; 212 clock_t intr_duration; /* max length of port intr (ticks) */ 213 clock_t intr_start_time; 214 int intr_loop_cnt; 215}; 216 217 218typedef struct nv_device_table { 219 ushort_t vendor_id; /* vendor id */ 220 ushort_t device_id; /* device id */ 221 ushort_t type; /* chipset type, ck804 or mcp51/mcp55 */ 222} nv_device_table_t; 223 224 225typedef struct nv_slot { 226 caddr_t nvslot_v_addr; /* I/O buffer address */ 227 size_t nvslot_byte_count; /* # bytes left to read/write */ 228 sata_pkt_t *nvslot_spkt; 229 uint8_t nvslot_rqsense_buff[SATA_ATAPI_RQSENSE_LEN]; 230 clock_t nvslot_stime; 231 int (*nvslot_start)(nv_port_t *nvp, int queue); 232 void (*nvslot_intr)(nv_port_t *nvp, 233 struct nv_slot *nv_slotp); 234 uint32_t nvslot_flags; 235} nv_slot_t; 236 237 238#ifdef SGPIO_SUPPORT 239struct nv_sgp_cmn { 240 uint8_t nvs_in_use; /* bit-field of active ctlrs */ 241 uint8_t nvs_connected; /* port connected bit-field flag */ 242 uint8_t nvs_activity; /* port usage bit-field flag */ 243 int nvs_cbp; /* SGPIO Control Block Pointer */ 244 int nvs_taskq_delay; /* rest time for activity LED taskq */ 245 kmutex_t nvs_slock; /* lock for shared data */ 246 kmutex_t nvs_tlock; /* lock for taskq */ 247 kcondvar_t nvs_cv; /* condition variable for taskq wait */ 248 ddi_taskq_t *nvs_taskq; /* activity LED taskq */ 249}; 250 251struct nv_sgp_cbp2cmn { 252 uint32_t c2cm_cbp; /* ctlr block ptr from pci cfg space */ 253 nv_sgp_cmn_t *c2cm_cmn; /* point to common space */ 254}; 255#endif 256 257 258/* 259 * nvslot_flags 260 */ 261#define NVSLOT_COMPLETE 0x01 262#define NVSLOT_NCQ 0x02 /* NCQ is active */ 263#define NVSLOT_RQSENSE 0x04 /* processing request sense */ 264 265/* 266 * state values for nv_attach 267 */ 268#define ATTACH_PROGRESS_NONE (1 << 0) 269#define ATTACH_PROGRESS_STATEP_ALLOC (1 << 1) 270#define ATTACH_PROGRESS_PCI_HANDLE (1 << 2) 271#define ATTACH_PROGRESS_BARS (1 << 3) 272#define ATTACH_PROGRESS_INTR_ADDED (1 << 4) 273#define ATTACH_PROGRESS_MUTEX_INIT (1 << 5) 274#define ATTACH_PROGRESS_CTL_SETUP (1 << 6) 275#define ATTACH_PROGRESS_TRAN_SETUP (1 << 7) 276#define ATTACH_PROGRESS_COUNT (1 << 8) 277#define ATTACH_PROGRESS_CONF_HANDLE (1 << 9) 278#define ATTACH_PROGRESS_SATA_MODULE (1 << 10) 279 280#ifdef DEBUG 281 282#define NV_DEBUG 1 283 284#endif /* DEBUG */ 285 286 287/* 288 * nv_debug_flags 289 */ 290#define NVDBG_ALWAYS 0x00001 291#define NVDBG_INIT 0x00002 292#define NVDBG_ENTRY 0x00004 293#define NVDBG_DELIVER 0x00008 294#define NVDBG_EVENT 0x00010 295#define NVDBG_SYNC 0x00020 296#define NVDBG_PKTCOMP 0x00040 297#define NVDBG_TIMEOUT 0x00080 298#define NVDBG_INFO 0x00100 299#define NVDBG_VERBOSE 0x00200 300#define NVDBG_INTR 0x00400 301#define NVDBG_ERRS 0x00800 302#define NVDBG_COOKIES 0x01000 303#define NVDBG_HOT 0x02000 304#define NVDBG_RESET 0x04000 305#define NVDBG_ATAPI 0x08000 306 307#define NVLOG(flag, nvc, nvp, fmt, args ...) \ 308 if (nv_debug_flags & (flag)) { \ 309 nv_log(nvc, nvp, fmt, ## args); \ 310 } 311 312 313#define NV_SUCCESS 0 314#define NV_FAILURE -1 315 316/* 317 * indicates whether nv_wait functions can sleep or not. 318 */ 319#define NV_SLEEP 1 320#define NV_NOSLEEP 2 321 322 323/* 324 * port offsets from base address ioaddr1 325 */ 326#define NV_DATA 0x00 /* data register */ 327#define NV_ERROR 0x01 /* error register (read) */ 328#define NV_FEATURE 0x01 /* features (write) */ 329#define NV_COUNT 0x02 /* sector count */ 330#define NV_SECT 0x03 /* sector number */ 331#define NV_LCYL 0x04 /* cylinder low byte */ 332#define NV_HCYL 0x05 /* cylinder high byte */ 333#define NV_DRVHD 0x06 /* drive/head register */ 334#define NV_STATUS 0x07 /* status/command register */ 335#define NV_CMD 0x07 /* status/command register */ 336 337/* 338 * port offsets from base address ioaddr2 339 */ 340#define NV_ALTSTATUS 0x02 /* alternate status (read) */ 341#define NV_DEVCTL 0x02 /* device control (write) */ 342 343/* 344 * device control register 345 */ 346#define ATDC_NIEN 0x02 /* disable interrupts */ 347#define ATDC_SRST 0x04 /* controller reset */ 348#define ATDC_D3 0x08 /* mysterious bit */ 349#define ATDC_HOB 0x80 /* high order byte to read 48-bit values */ 350 351/* 352 * MCP5x NCQ and INTR control registers 353 */ 354#define MCP5X_CTL 0x400 /* queuing control */ 355#define MCP5X_INT_STATUS 0x440 /* status bits for interrupt */ 356#define MCP5X_INT_CTL 0x444 /* enable bits for interrupt */ 357#define MCP5X_NCQ 0x448 /* NCQ status and ctrl bits */ 358 359/* 360 * if either of these bits are set, when using NCQ, if no other commands are 361 * active while a new command is started, DMA engine can be programmed ahead 362 * of time to save extra interrupt. Presumably pre-programming is discarded 363 * if a subsequent command ends up finishing first. 364 */ 365#define MCP_SATA_AE_NCQ_PDEV_FIRST_CMD (1 << 7) 366#define MCP_SATA_AE_NCQ_SDEV_FIRST_CMD (1 << 23) 367 368/* 369 * bit definitions to indicate which NCQ command requires 370 * DMA setup. 371 */ 372#define MCP_SATA_AE_NCQ_PDEV_DMA_SETUP_TAG_SHIFT 2 373#define MCP_SATA_AE_NCQ_SDEV_DMA_SETUP_TAG_SHIFT 18 374#define MCP_SATA_AE_NCQ_DMA_SETUP_TAG_MASK 0x1f 375 376 377/* 378 * Bits for NV_MCP5X_INT_CTL and NV_MCP5X_INT_STATUS 379 */ 380#define MCP5X_INT_SNOTIFY 0x200 /* snotification set */ 381#define MCP5X_INT_SERROR 0x100 /* serror set */ 382#define MCP5X_INT_DMA_SETUP 0x80 /* DMA to be programmed */ 383#define MCP5X_INT_DH_REGFIS 0x40 /* REGFIS received */ 384#define MCP5X_INT_SDB_FIS 0x20 /* SDB FIS */ 385#define MCP5X_INT_TX_BACKOUT 0x10 /* TX backout */ 386#define MCP5X_INT_REM 0x08 /* device removed */ 387#define MCP5X_INT_ADD 0x04 /* device added */ 388#define MCP5X_INT_PM 0x02 /* power changed */ 389#define MCP5X_INT_COMPLETE 0x01 /* device interrupt */ 390 391/* 392 * Bits above that are not used for now. 393 */ 394#define MCP5X_INT_IGNORE (MCP5X_INT_DMA_SETUP|MCP5X_INT_DH_REGFIS|\ 395 MCP5X_INT_SDB_FIS|MCP5X_INT_TX_BACKOUT|MCP5X_INT_PM|\ 396 MCP5X_INT_SNOTIFY|MCP5X_INT_SERROR) 397 398/* 399 * Bits for MCP_SATA_AE_CTL 400 */ 401#define MCP_SATA_AE_CTL_PRI_SWNCQ (1 << 1) /* software NCQ chan 0 */ 402#define MCP_SATA_AE_CTL_SEC_SWNCQ (1 << 2) /* software NCQ chan 1 */ 403 404#define NV_DELAY_NSEC(wait_ns) \ 405{ \ 406 hrtime_t start, end; \ 407 start = end = gethrtime(); \ 408 while ((end - start) < wait_ns) \ 409 end = gethrtime(); \ 410} 411 412/* 413 * signature in task file registers after device reset 414 */ 415#define NV_DISK_SIG 0x00000101 416#define NV_ATAPI_SIG 0xeb140101 417#define NV_PM_SIG 0x96690101 418#define NV_NO_SIG 0x00000000 419 420/* 421 * These bar5 offsets are common to mcp51/mcp55/ck804 and thus 422 * prefixed with NV. 423 */ 424#define NV_SSTATUS 0x00 425#define NV_SERROR 0x04 426#define NV_SCTRL 0x08 427#define NV_SACTIVE 0x0c 428#define NV_SNOTIFICATION 0x10 429 430#define CH0_SREG_OFFSET 0x0 431#define CH1_SREG_OFFSET 0x40 432 433 434/* 435 * The following config space offsets are needed to enable 436 * bar 5 register access in ck804/mcp51/mcp55 437 */ 438#define NV_SATA_CFG_20 0x50 439#define NV_BAR5_SPACE_EN 0x04 440#define NV_40BIT_PRD 0x20 441 442#define NV_SATA_CFG_23 0x60 443 444/* 445 * ck804 interrupt status register 446 */ 447 448/* 449 * offsets to bar 5 registers 450 */ 451#define CK804_SATA_INT_STATUS 0x440 452#define CK804_SATA_INT_EN 0x441 453 454 455/* 456 * bit fields for int status and int enable 457 * registers 458 */ 459#define CK804_INT_PDEV_INT 0x01 /* completion interrupt */ 460#define CK804_INT_PDEV_PM 0x02 /* power change */ 461#define CK804_INT_PDEV_ADD 0x04 /* hot plug */ 462#define CK804_INT_PDEV_REM 0x08 /* hot remove */ 463#define CK804_INT_PDEV_HOT CK804_INT_PDEV_ADD|CK804_INT_PDEV_REM 464 465#define CK804_INT_SDEV_INT 0x10 /* completion interrupt */ 466#define CK804_INT_SDEV_PM 0x20 /* power change */ 467#define CK804_INT_SDEV_ADD 0x40 /* hot plug */ 468#define CK804_INT_SDEV_REM 0x80 /* hot remove */ 469#define CK804_INT_SDEV_HOT CK804_INT_SDEV_ADD|CK804_INT_SDEV_REM 470 471#define CK804_INT_PDEV_ALL CK804_INT_PDEV_INT|CK804_INT_PDEV_HOT|\ 472 CK804_INT_PDEV_PM 473#define CK804_INT_SDEV_ALL CK804_INT_SDEV_INT|CK804_INT_SDEV_HOT|\ 474 CK804_INT_SDEV_PM 475 476/* 477 * config space offset 42 478 */ 479#define NV_SATA_CFG_42 0xac 480 481/* 482 * bit in CFG_42 which delays hotplug interrupt until 483 * PHY ready 484 */ 485#define CK804_CFG_DELAY_HOTPLUG_INTR (0x1 << 12) 486 487 488/* 489 * bar 5 offsets for SATA registers in ck804 490 */ 491#define CK804_CH1_SSTATUS 0x00 492#define CK804_CH1_SERROR 0x04 493#define CK804_CH1_SCTRL 0x08 494#define CK804_CH1_SACTIVE 0x0c 495#define CK804_CH1_SNOTIFICATION 0x10 496 497#define CK804_CH2_SSTATUS 0x40 498#define CK804_CH2_SERROR 0x44 499#define CK804_CH2_SCTRL 0x48 500#define CK804_CH2_SACTIVE 0x4c 501#define CK804_CH2_SNOTIFICATION 0x50 502 503 504/* 505 * bar 5 offsets for ADMACTL settings for both ck804/mcp51/mcp/55 506 */ 507#define NV_ADMACTL_X 0x4C0 508#define NV_ADMACTL_Y 0x5C0 509 510/* 511 * Bits for NV_ADMACTL_X and NV_ADMACTL_Y 512 */ 513#define NV_HIRQ_EN 0x01 /* hot plug/unplug interrupt enable */ 514#define NV_CH_RST 0x04 /* reset channel */ 515 516 517/* 518 * bar 5 offset for ADMASTAT regs for ck804 519 */ 520#define CK804_ADMASTAT_X 0x4C4 521#define CK804_ADMASTAT_Y 0x5C4 522 523/* 524 * Bits for CK804_ADMASTAT_X and CK804_ADMASTAT_Y 525 */ 526#define CK804_HPIRQ 0x4 527#define MCP05_HUIRQ 0x2 528 529 530/* 531 * bar 4 offset to bus master command registers 532 */ 533#define BMICX_REG 0 534 535/* 536 * bit definitions for BMICX_REG 537 */ 538#define BMICX_SSBM 0x01 /* Start/Stop Bus Master */ 539 /* 1=Start (Enable) */ 540 /* 0=Start (Disable) */ 541 542/* 543 * NOTE: "read" and "write" are the actions of the DMA engine 544 * on the PCI bus, not the SATA bus. Therefore for a ATA READ 545 * command, program the DMA engine to "write to memory" mode 546 * (and vice versa). 547 */ 548#define BMICX_RWCON 0x08 /* Read/Write Control */ 549#define BMICX_RWCON_WRITE_TO_MEMORY 0x08 /* 1=Write (dev to host) */ 550#define BMICX_RWCON_READ_FROM_MEMORY 0x00 /* 0=Read (host to dev) */ 551 552/* 553 * BMICX bits to preserve during updates 554 */ 555#define BMICX_MASK (~(BMICX_SSBM | BMICX_RWCON)) 556 557/* 558 * bar 4 offset to bus master status register 559 */ 560#define BMISX_REG 2 561 562/* 563 * bit fields for bus master status register 564 */ 565#define BMISX_BMIDEA 0x01 /* Bus Master IDE Active */ 566#define BMISX_IDERR 0x02 /* IDE DMA Error */ 567#define BMISX_IDEINTS 0x04 /* IDE Interrupt Status */ 568 569/* 570 * bus master status register bits to preserve 571 */ 572#define BMISX_MASK 0xf8 573 574/* 575 * bar4 offset to bus master PRD descriptor table 576 */ 577#define BMIDTPX_REG 4 578 579 580/* 581 * structure for a single entry in the PRD table 582 * (physical region descriptor table) 583 */ 584typedef struct prde { 585 uint32_t p_address; /* physical address */ 586 uint32_t p_count; /* byte count, EOT in high order bit */ 587} prde_t; 588 589 590#define PRDE_EOT ((uint_t)0x80000000) 591 592#define NV_DMA_NSEGS 257 /* at least 1MB (4KB/pg * 256) + 1 if misaligned */ 593 594/* 595 * ck804 and mcp55 both have 2 ports per controller 596 */ 597#define NV_NUM_PORTS 2 598 599/* 600 * Number of slots to allocate in data nv_sata structures to handle 601 * multiple commands at once. This does not reflect the capability of 602 * the drive or the hardware, and in many cases will not match. 603 * 1 or 32 slots are allocated, so in cases where the driver has NCQ 604 * enabled but the drive doesn't support it, or supports fewer than 605 * 32 slots, here may be an over allocation of memory. 606 */ 607#ifdef NCQ 608#define NV_QUEUE_SLOTS 32 609#else 610#define NV_QUEUE_SLOTS 1 611#endif 612 613#define NV_BM_64K_BOUNDARY 0x10000ull 614 615#define NV_MAX_INTR_PER_DEV 20 /* Empirical value */ 616 617/* 618 * 1 second (in microseconds) 619 */ 620#define NV_ONE_SEC 1000000 621 622/* 623 * 1 millisecond (in microseconds) 624 */ 625#define NV_ONE_MSEC 1000 626 627/* 628 * initial wait before checking for signature, in microseconds 629 */ 630#define NV_WAIT_SIG 2500 631 632 633/* 634 * Length of port reset (microseconds) - SControl bit 0 set to 1 635 */ 636#define NV_RESET_LENGTH 1000 637 638/* 639 * the maximum number of comresets to issue while 640 * performing link reset in nv_reset() 641 */ 642#define NV_COMRESET_ATTEMPTS 3 643 644/* 645 * amount of time to wait for a signature in reset, in ms, before 646 * issuing another reset 647 */ 648#define NV_RETRY_RESET_SIG 5000 649 650/* 651 * the maximum number of resets to issue to gather signature 652 * before giving up 653 */ 654#define NV_MAX_RESET_RETRY 8 655 656/* 657 * amount of time (us) to wait after receiving a link event 658 * before acting on it. This is because of flakey hardware 659 * sometimes issues the wrong, multiple, or out of order link 660 * events. 661 */ 662#define NV_LINK_EVENT_SETTLE 500000 663 664/* 665 * The amount of time (ms) a link can be missing 666 * before declaring it removed. 667 */ 668#define NV_LINK_EVENT_DOWN 200 669 670/* 671 * nvp_state flags 672 */ 673#define NV_DEACTIVATED 0x001 674#define NV_ABORTING 0x002 675#define NV_FAILED 0x004 676#define NV_RESET 0x008 677#define NV_RESTORE 0x010 678#define NV_LINK_EVENT 0x020 679#define NV_ATTACH 0x040 680#define NV_HOTPLUG 0x080 681 682 683/* 684 * flags for nv_report_link_event() 685 */ 686#define NV_ADD_DEV 0 687#define NV_REM_DEV 1 688 689/* 690 * nvc_state flags 691 */ 692#define NV_CTRL_SUSPEND 0x1 693 694 695/* 696 * flags for ck804_set_intr/mcp5x_set_intr 697 */ 698#define NV_INTR_DISABLE 0x1 699#define NV_INTR_ENABLE 0x2 700#define NV_INTR_CLEAR_ALL 0x4 701#define NV_INTR_DISABLE_NON_BLOCKING 0x8 702 703 704#define NV_BYTES_PER_SEC 512 705 706#define NV_WAIT_REG_CHECK 10 /* 10 microseconds */ 707#define NV_ATA_NUM_CMDS 256 /* max num ATA cmds possible, 8 bits */ 708#define NV_PRINT_INTERVAL 40 /* throttle debug msg from flooding */ 709#define MCP5X_INT_CLEAR 0xffff /* clear all interrupts */ 710 711/* 712 * definition labels for the BAR registers 713 */ 714#define NV_BAR_0 0 /* chan 0 task file regs */ 715#define NV_BAR_1 1 /* chan 0 status reg */ 716#define NV_BAR_2 2 /* chan 1 task file regs */ 717#define NV_BAR_3 3 /* chan 1 status reg */ 718#define NV_BAR_4 4 /* bus master regs */ 719#define NV_BAR_5 5 /* extra regs mostly SATA related */ 720 721/* 722 * transform seconds to microseconds 723 */ 724#define NV_SEC2USEC(x) x * MICROSEC 725 726 727/* 728 * ck804 maps in task file regs into bar 5. These are 729 * only used to identify ck804, therefore only this reg is 730 * listed here. 731 */ 732#define NV_BAR5_TRAN_LEN_CH_X 0x518 733 734/* 735 * if after this many iterations through the interrupt 736 * processing loop, declare the interrupt wedged and 737 * disable. 738 */ 739#define NV_MAX_INTR_LOOP 10 740 741/* 742 * flag values for nv_copy_regs_out 743 */ 744#define NV_COPY_COMPLETE 0x01 /* normal command completion */ 745#define NV_COPY_ERROR 0x02 /* error, did not complete ok */ 746#define NV_COPY_SSREGS 0x04 /* SS port registers */ 747 748#ifdef SGPIO_SUPPORT 749#define NV_MAX_CBPS 16 /* Maximum # of Control Block */ 750 /* Pointers. Corresponds to */ 751 /* each MCP55 and IO55 */ 752#define SGPIO_LOOP_WAIT_USECS 62500 /* 1/16 second (in usecs) */ 753#define SGPIO_TQ_NAME_LEN 32 754 755/* 756 * The drive number format is ccp (binary). 757 * cc is the controller number (0-based number) 758 * p is the port number (0 or 1) 759 */ 760#define SGP_DRV_TO_PORT(d) ((d) & 1) 761#define SGP_DRV_TO_CTLR(d) ((d) >> 1) 762#define SGP_CTLR_PORT_TO_DRV(c, p) (((c) << 1) | ((p) & 1)) 763#endif 764 765#ifdef __cplusplus 766} 767#endif 768 769#endif /* _NV_SATA_H */ 770