1230557Sjimharris/*- 2230557Sjimharris * This file is provided under a dual BSD/GPLv2 license. When using or 3230557Sjimharris * redistributing this file, you may do so under either license. 4230557Sjimharris * 5230557Sjimharris * GPL LICENSE SUMMARY 6230557Sjimharris * 7230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8230557Sjimharris * 9230557Sjimharris * This program is free software; you can redistribute it and/or modify 10230557Sjimharris * it under the terms of version 2 of the GNU General Public License as 11230557Sjimharris * published by the Free Software Foundation. 12230557Sjimharris * 13230557Sjimharris * This program is distributed in the hope that it will be useful, but 14230557Sjimharris * WITHOUT ANY WARRANTY; without even the implied warranty of 15230557Sjimharris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16230557Sjimharris * General Public License for more details. 17230557Sjimharris * 18230557Sjimharris * You should have received a copy of the GNU General Public License 19230557Sjimharris * along with this program; if not, write to the Free Software 20230557Sjimharris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21230557Sjimharris * The full GNU General Public License is included in this distribution 22230557Sjimharris * in the file called LICENSE.GPL. 23230557Sjimharris * 24230557Sjimharris * BSD LICENSE 25230557Sjimharris * 26230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27230557Sjimharris * All rights reserved. 28230557Sjimharris * 29230557Sjimharris * Redistribution and use in source and binary forms, with or without 30230557Sjimharris * modification, are permitted provided that the following conditions 31230557Sjimharris * are met: 32230557Sjimharris * 33230557Sjimharris * * Redistributions of source code must retain the above copyright 34230557Sjimharris * notice, this list of conditions and the following disclaimer. 35230557Sjimharris * * Redistributions in binary form must reproduce the above copyright 36230557Sjimharris * notice, this list of conditions and the following disclaimer in 37230557Sjimharris * the documentation and/or other materials provided with the 38230557Sjimharris * distribution. 39230557Sjimharris * 40230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41230557Sjimharris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42230557Sjimharris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43230557Sjimharris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44230557Sjimharris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45230557Sjimharris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46230557Sjimharris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47230557Sjimharris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48230557Sjimharris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49230557Sjimharris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50230557Sjimharris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51230557Sjimharris * 52230557Sjimharris * $FreeBSD$ 53230557Sjimharris */ 54230557Sjimharris#ifndef _SATI_UTIL_H_ 55230557Sjimharris#define _SATI_UTIL_H_ 56230557Sjimharris 57230557Sjimharris/** 58230557Sjimharris * @file 59230557Sjimharris * @brief This file contains all of the interface methods, macros, structures 60230557Sjimharris * that provide general support for SATI. Some methods can be utilized 61230557Sjimharris * by a user to construct ATA/ATAPI commands, copy ATA device 62230557Sjimharris * structure data, fill in sense data, etc. 63230557Sjimharris */ 64230557Sjimharris 65265571Sjimharris#include <sys/param.h> 66265571Sjimharris 67230557Sjimharris#include <dev/isci/scil/sati_types.h> 68230557Sjimharris#include <dev/isci/scil/sati_translator_sequence.h> 69230557Sjimharris 70230557Sjimharris#include <dev/isci/scil/intel_sata.h> 71230557Sjimharris#include <dev/isci/scil/intel_sas.h> 72230557Sjimharris 73230557Sjimharris/** 74230557Sjimharris * This macro allows the translator to be able to handle environments where 75230557Sjimharris * the contents of the CDB are of a different endian nature of byte swapped 76230557Sjimharris * in some fashion. 77230557Sjimharris */ 78230557Sjimharris#define sati_get_cdb_byte(the_cdb, index) (the_cdb)[(index)] 79230557Sjimharris 80230557Sjimharris#define sati_get_ata_status(the_reg_fis) ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->status 81230557Sjimharris#define sati_get_ata_error(the_reg_fis) ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->error 82230557Sjimharris 83230557Sjimharris#define sati_get_ata_command(the_reg_fis) \ 84230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->command 85230557Sjimharris 86230557Sjimharris#define sati_get_ata_sector_count(the_reg_fis) \ 87230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->sector_count 88230557Sjimharris#define sati_get_ata_sector_count_exp(the_reg_fis) \ 89230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->sector_count_exp 90230557Sjimharris#define sati_get_ata_lba_low(the_reg_fis) \ 91230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_low 92230557Sjimharris#define sati_get_ata_lba_mid(the_reg_fis) \ 93230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_mid 94230557Sjimharris#define sati_get_ata_lba_high(the_reg_fis) \ 95230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_high 96230557Sjimharris#define sati_get_ata_sector_count_ext(the_reg_fis) \ 97230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->sector_count_exp 98230557Sjimharris#define sati_get_ata_lba_low_ext(the_reg_fis) \ 99230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_low_exp 100230557Sjimharris#define sati_get_ata_lba_mid_ext(the_reg_fis) \ 101230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_mid_exp 102230557Sjimharris#define sati_get_ata_lba_high_ext(the_reg_fis) \ 103230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->lba_high_exp 104230557Sjimharris#define sati_get_ata_device(the_reg_fis) \ 105230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->device 106230557Sjimharris 107230557Sjimharris#define sati_set_ata_status(the_reg_fis, value) \ 108230557Sjimharris ((SATA_FIS_REG_D2H_T*)(the_reg_fis))->status = (value) 109230557Sjimharris#define sati_set_sata_fis_type(the_reg_fis, value) \ 110230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->fis_type = (value) 111230557Sjimharris#define sati_set_sata_command_flag(the_reg_fis) \ 112230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->command_flag = 1 113230557Sjimharris#define sati_clear_sata_command_flag(the_reg_fis) \ 114230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->command_flag = 0 115230557Sjimharris 116230557Sjimharris#define sati_set_ata_command(the_reg_fis, value) \ 117230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->command = (value) 118230557Sjimharris#define sati_set_ata_features(the_reg_fis, value) \ 119230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->features = (value) 120230557Sjimharris#define sati_set_ata_features_exp(the_reg_fis, value) \ 121230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->features_exp = (value) 122230557Sjimharris#define sati_set_ata_control(the_reg_fis, value) \ 123230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->control = (value) 124230557Sjimharris#define sati_set_ata_sector_count(the_reg_fis, value) \ 125230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->sector_count = (value) 126230557Sjimharris#define sati_set_ata_sector_count_exp(the_reg_fis, value) \ 127230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->sector_count_exp = (value) 128230557Sjimharris#define sati_set_ata_lba_low(the_reg_fis, value) \ 129230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_low = (value) 130230557Sjimharris#define sati_set_ata_lba_mid(the_reg_fis, value) \ 131230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_mid = (value) 132230557Sjimharris#define sati_set_ata_lba_high(the_reg_fis, value) \ 133230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_high = (value) 134230557Sjimharris#define sati_set_ata_lba_low_exp(the_reg_fis, value) \ 135230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_low_exp = (value) 136230557Sjimharris#define sati_set_ata_lba_mid_exp(the_reg_fis, value) \ 137230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_mid_exp = (value) 138230557Sjimharris#define sati_set_ata_lba_high_exp(the_reg_fis, value) \ 139230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->lba_high_exp = (value) 140230557Sjimharris#define sati_set_ata_device_head(the_reg_fis, value) \ 141230557Sjimharris ((SATA_FIS_REG_H2D_T*)(the_reg_fis))->device = (value) 142230557Sjimharris 143230557Sjimharris#define ATA_MID_REGISTER_THRESHOLD_EXCEEDED 0xF4 144230557Sjimharris#define ATA_HIGH_REGISTER_THRESHOLD_EXCEEDED 0x2C 145230557Sjimharris 146230557Sjimharris#define ATA_MICROCODE_OFFSET_DOWNLOAD 0x03 147230557Sjimharris#define ATA_MICROCODE_DOWNLOAD_SAVE 0x07 148230557Sjimharris 149230557Sjimharrisvoid sati_ata_non_data_command( 150230557Sjimharris void * ata_io, 151230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 152230557Sjimharris); 153230557Sjimharris 154230557Sjimharrisvoid sati_ata_identify_device_construct( 155230557Sjimharris void * ata_io, 156230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 157230557Sjimharris); 158230557Sjimharris 159230557Sjimharrisvoid sati_ata_execute_device_diagnostic_construct( 160230557Sjimharris void * ata_io, 161230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 162230557Sjimharris); 163230557Sjimharris 164230557Sjimharrisvoid sati_ata_identify_device_copy_data( 165230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 166230557Sjimharris void * destination_scsi_io, 167230557Sjimharris U32 destination_offset, 168230557Sjimharris U8 * source_buffer, 169230557Sjimharris U32 source_offset, 170230557Sjimharris U32 length, 171230557Sjimharris BOOL use_printable_chars 172230557Sjimharris); 173230557Sjimharris 174230557Sjimharrisvoid sati_copy_data( 175230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 176230557Sjimharris void * destination_scsi_io, 177230557Sjimharris U32 destination_offset, 178230557Sjimharris U8 * source_buffer, 179230557Sjimharris U32 length 180230557Sjimharris); 181230557Sjimharris 182230557Sjimharrisvoid sati_ata_identify_device_get_sector_info( 183230557Sjimharris ATA_IDENTIFY_DEVICE_DATA_T * identify, 184230557Sjimharris U32 * lba_high, 185230557Sjimharris U32 * lba_low, 186230557Sjimharris U32 * sector_size 187230557Sjimharris); 188230557Sjimharris 189230557Sjimharrisvoid sati_ata_check_power_mode_construct( 190230557Sjimharris void * ata_io, 191230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 192230557Sjimharris); 193230557Sjimharris 194230557SjimharrisU8 sati_scsi_get_sense_data_length( 195230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 196230557Sjimharris void * scsi_io 197230557Sjimharris); 198230557Sjimharris 199230557Sjimharrisvoid sati_scsi_common_response_iu_construct( 200230557Sjimharris SCI_SSP_RESPONSE_IU_T * rsp_iu, 201230557Sjimharris U8 scsi_status, 202230557Sjimharris U8 sense_data_length, 203230557Sjimharris U8 data_present 204230557Sjimharris); 205230557Sjimharris 206230557Sjimharrisvoid sati_scsi_sense_data_construct( 207230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 208230557Sjimharris void * scsi_io, 209230557Sjimharris U8 status, 210230557Sjimharris U8 sense_key, 211230557Sjimharris U8 additional_sense_code, 212230557Sjimharris U8 additional_sense_code_qualifier 213230557Sjimharris); 214230557Sjimharris 215230557Sjimharrisvoid sati_scsi_fixed_sense_data_construct( 216230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 217230557Sjimharris void * scsi_io, 218230557Sjimharris U8 response_code, 219230557Sjimharris U8 scsi_status, 220230557Sjimharris U8 sense_key, 221230557Sjimharris U8 additional_sense_code, 222230557Sjimharris U8 additional_sense_code_qualifier 223230557Sjimharris); 224230557Sjimharris 225230557Sjimharrisvoid sati_scsi_descriptor_sense_data_construct( 226230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 227230557Sjimharris void * scsi_io, 228230557Sjimharris U8 response_code, 229230557Sjimharris U8 scsi_status, 230230557Sjimharris U8 sense_key, 231230557Sjimharris U8 additional_sense_code, 232230557Sjimharris U8 additional_sense_code_qualifier 233230557Sjimharris); 234230557Sjimharris 235230557Sjimharrisvoid sati_scsi_read_ncq_error_sense_construct( 236230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 237230557Sjimharris void * scsi_io, 238230557Sjimharris void * ata_input_data, 239230557Sjimharris U8 scsi_status, 240230557Sjimharris U8 sense_key, 241230557Sjimharris U8 additional_sense_code, 242230557Sjimharris U8 additional_sense_code_qualifier 243230557Sjimharris); 244230557Sjimharris 245230557Sjimharrisvoid sati_scsi_read_error_sense_construct( 246230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 247230557Sjimharris void * scsi_io, 248230557Sjimharris void * ata_io, 249230557Sjimharris U8 status, 250230557Sjimharris U8 sense_key, 251230557Sjimharris U8 additional_sense_code, 252230557Sjimharris U8 additional_sense_code_qualifier 253230557Sjimharris); 254230557Sjimharris 255230557Sjimharrisvoid sati_scsi_response_data_construct( 256230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 257230557Sjimharris void * scsi_io, 258230557Sjimharris U8 response_data 259230557Sjimharris); 260230557Sjimharris 261230557Sjimharrisvoid sati_get_data_byte( 262230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 263230557Sjimharris void * scsi_io, 264230557Sjimharris U32 byte_offset, 265230557Sjimharris U8 * value 266230557Sjimharris); 267230557Sjimharris 268230557Sjimharrisvoid sati_set_data_byte( 269230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 270230557Sjimharris void * scsi_io, 271230557Sjimharris U32 byte_offset, 272230557Sjimharris U8 value 273230557Sjimharris); 274230557Sjimharris 275230557Sjimharrisvoid sati_set_data_dword( 276230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 277230557Sjimharris void * scsi_io, 278230557Sjimharris U32 byte_offset, 279230557Sjimharris U32 value 280230557Sjimharris); 281230557Sjimharris 282230557Sjimharrisvoid sati_set_sense_data_byte( 283230557Sjimharris U8 * sense_data, 284230557Sjimharris U32 max_sense_data_len, 285230557Sjimharris U32 byte_offset, 286230557Sjimharris U8 value 287230557Sjimharris); 288230557Sjimharris 289230557Sjimharrisvoid sati_ata_flush_cache_construct( 290230557Sjimharris void * ata_io, 291230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 292230557Sjimharris); 293230557Sjimharris 294230557Sjimharrisvoid sati_ata_standby_construct( 295230557Sjimharris void * ata_io, 296230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 297230557Sjimharris U16 count 298230557Sjimharris); 299230557Sjimharris 300230557Sjimharrisvoid sati_ata_standby_immediate_construct( 301230557Sjimharris void * ata_io, 302230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 303230557Sjimharris); 304230557Sjimharris 305230557Sjimharrisvoid sati_ata_idle_immediate_construct( 306230557Sjimharris void * ata_io, 307230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 308230557Sjimharris); 309230557Sjimharris 310230557Sjimharrisvoid sati_ata_idle_immediate_unload_construct( 311230557Sjimharris void * ata_io, 312230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 313230557Sjimharris); 314230557Sjimharris 315230557Sjimharrisvoid sati_ata_idle_construct( 316230557Sjimharris void * ata_io, 317230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 318230557Sjimharris); 319230557Sjimharris 320230557Sjimharrisvoid sati_ata_media_eject_construct( 321230557Sjimharris void * ata_io, 322230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 323230557Sjimharris); 324230557Sjimharris 325230557Sjimharrisvoid sati_ata_read_verify_sectors_construct( 326230557Sjimharris void * ata_io, 327230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 328230557Sjimharris); 329230557Sjimharris 330230557Sjimharrisvoid sati_ata_smart_return_status_construct( 331230557Sjimharris void * ata_io, 332230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 333230557Sjimharris U8 feature_value 334230557Sjimharris); 335230557Sjimharris 336230557Sjimharrisvoid sati_ata_smart_read_log_construct( 337230557Sjimharris void * ata_io, 338230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 339230557Sjimharris U8 log_address, 340230557Sjimharris U32 transfer_length 341230557Sjimharris); 342230557Sjimharris 343230557Sjimharrisvoid sati_ata_write_uncorrectable_construct( 344230557Sjimharris void * ata_io, 345230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 346230557Sjimharris U8 feature_value 347230557Sjimharris); 348230557Sjimharris 349230557Sjimharrisvoid sati_ata_set_features_construct( 350230557Sjimharris void * ata_io, 351230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 352230557Sjimharris U8 feature 353230557Sjimharris); 354230557Sjimharris 355230557Sjimharrisvoid sati_ata_read_log_ext_construct( 356230557Sjimharris void * ata_io, 357230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 358230557Sjimharris U8 log_address, 359230557Sjimharris U32 transfer_length 360230557Sjimharris); 361230557Sjimharris 362230557SjimharrisBOOL sati_device_state_stopped( 363230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 364230557Sjimharris void * scsi_io 365230557Sjimharris); 366230557Sjimharris 367230557Sjimharrisvoid sati_ata_read_buffer_construct( 368230557Sjimharris void * ata_io, 369230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 370230557Sjimharris); 371230557Sjimharris 372230557Sjimharrisvoid sati_ata_write_buffer_construct( 373230557Sjimharris void * ata_io, 374230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence 375230557Sjimharris); 376230557Sjimharris 377230557Sjimharrisvoid sati_ata_download_microcode_construct( 378230557Sjimharris void * ata_io, 379230557Sjimharris SATI_TRANSLATOR_SEQUENCE_T * sequence, 380230557Sjimharris U8 mode, 381230557Sjimharris U32 block_count, 382230557Sjimharris U32 buffer_offset 383230557Sjimharris); 384230557Sjimharris 385230557Sjimharris#endif // _SATI_UTIL_H_ 386230557Sjimharris 387