#ifndef _SATA_DEFS_H
#define _SATA_DEFS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/scsi/generic/mode.h>
#define SATAC_DIAG 0x90
#define SATAC_RECAL 0x10
#define SATAC_FORMAT 0x50
#define SATAC_SET_FEATURES 0xef
#define SATAC_IDLE_IM 0xe1
#define SATAC_STANDBY_IM 0xe0
#define SATAC_DOOR_LOCK 0xde
#define SATAC_DOOR_UNLOCK 0xdf
#define SATAC_IDLE 0xe3
#define SATAC_STANDBY 0xe2
#define SATAC_DSM 0x06
#define SATAC_DEVICE_RESET 0x08
#define SATAC_DOWNLOAD_MICROCODE 0x92
#define SATAC_EJECT 0xed
#define SATAC_FLUSH_CACHE 0xe7
#define SATAC_ID_DEVICE 0xec
#define SATAC_ID_PACKET_DEVICE 0xa1
#define SATAC_INIT_DEVPARMS 0x91
#define SATAC_PACKET 0xa0
#define SATAC_RDMULT 0xc4
#define SATAC_RDSEC 0x20
#define SATAC_RDVER 0x40
#define SATAC_READ_DMA 0xc8
#define SATAC_SEEK 0x70
#define SATAC_SERVICE 0xa2
#define SATAC_SETMULT 0xc6
#define SATAC_WRITE_DMA 0xca
#define SATAC_WRMULT 0xc5
#define SATAC_WRSEC 0x30
#define SATAC_RDSEC_EXT 0x24
#define SATAC_READ_DMA_EXT 0x25
#define SATAC_RDMULT_EXT 0x29
#define SATAC_WRSEC_EXT 0x34
#define SATAC_WRITE_DMA_EXT 0x35
#define SATAC_WRMULT_EXT 0x39
#define SATAC_READ_DMA_QUEUED 0xc7
#define SATAC_READ_DMA_QUEUED_EXT 0x26
#define SATAC_WRITE_DMA_QUEUED 0xcc
#define SATAC_WRITE_DMA_QUEUED_EXT 0x36
#define SATAC_READ_PM_REG 0xe4
#define SATAC_WRITE_PM_REG 0xe8
#define SATAC_READ_FPDMA_QUEUED 0x60
#define SATAC_WRITE_FPDMA_QUEUED 0x61
#define SATAC_READ_LOG_EXT 0x2f
#define SATAC_SMART 0xb0
#define SATA_LOG_PAGE_10 0x10
#define SATAC_READ_PORTMULT 0xe4
#define SATAC_WRITE_PORTMULT 0xe8
#define SATAC_CHECK_POWER_MODE 0xe5
#define SATA_PWRMODE_STANDBY 0
#define SATA_PWRMODE_IDLE 0x80
#define SATA_PWRMODE_ACTIVE_SPINDOWN 0x40
#define SATA_PWRMODE_ACTIVE_SPINUP 0x41
#define SATA_PWRMODE_ACTIVE 0xFF
#define SATA_SMART_READ_DATA 0xd0
#define SATA_SMART_ATTR_AUTOSAVE 0xd2
#define SATA_SMART_EXECUTE_OFFLINE_IMM 0xd4
#define SATA_SMART_READ_LOG 0xd5
#define SATA_SMART_WRITE_LOG 0xd6
#define SATA_SMART_ENABLE_OPS 0xd8
#define SATA_SMART_DISABLE_OPS 0xd9
#define SATA_SMART_RETURN_STATUS 0xda
#define SATAC_SF_ENABLE_WRITE_CACHE 0x02
#define SATAC_SF_TRANSFER_MODE 0x03
#define SATAC_SF_DISABLE_RMSN 0x31
#define SATAC_SF_ENABLE_ACOUSTIC 0x42
#define SATAC_SF_DISABLE_READ_AHEAD 0x55
#define SATAC_SF_DISABLE_WRITE_CACHE 0x82
#define SATAC_SF_ENABLE_READ_AHEAD 0xaa
#define SATAC_SF_DISABLE_ACOUSTIC 0xc2
#define SATAC_SF_ENABLE_RMSN 0x95
#define SATAC_TRANSFER_MODE_PIO_DEFAULT 0x00
#define SATAC_TRANSFER_MODE_PIO_DISABLE_IODRY 0x01
#define SATAC_TRANSFER_MODE_PIO_FLOW_CONTROL 0x08
#define SATAC_TRANSFER_MODE_MULTI_WORD_DMA 0x20
#define SATAC_TRANSFER_MODE_ULTRA_DMA 0x40
#define SATA_DOWNLOAD_MCODE_TEMP 1
#define SATA_DOWNLOAD_MCODE_SAVE 7
#define SATA_TAG_QUEUING_SHIFT 3
#define SATA_TAG_QUEUING_MASK 0x1f
typedef struct sata_id {
ushort_t ai_config;
ushort_t ai_fixcyls;
ushort_t ai_resv0;
ushort_t ai_heads;
ushort_t ai_trksiz;
ushort_t ai_secsiz;
ushort_t ai_sectors;
ushort_t ai_resv1[3];
char ai_drvser[20];
ushort_t ai_buftype;
ushort_t ai_bufsz;
ushort_t ai_ecc;
char ai_fw[8];
char ai_model[40];
ushort_t ai_mult1;
ushort_t ai_dwcap;
ushort_t ai_cap;
ushort_t ai_resv2;
ushort_t ai_piomode;
ushort_t ai_dmamode;
ushort_t ai_validinfo;
ushort_t ai_curcyls;
ushort_t ai_curheads;
ushort_t ai_cursectrk;
ushort_t ai_cursccp[2];
ushort_t ai_mult2;
ushort_t ai_addrsec[2];
ushort_t ai_dirdma;
ushort_t ai_dworddma;
ushort_t ai_advpiomode;
ushort_t ai_minmwdma;
ushort_t ai_recmwdma;
ushort_t ai_minpio;
ushort_t ai_minpioflow;
ushort_t ai_addsupported;
ushort_t ai_resv3;
ushort_t ai_typtime[2];
ushort_t ai_resv4[2];
ushort_t ai_qdepth;
ushort_t ai_satacap;
ushort_t ai_resv5;
ushort_t ai_satafsup;
ushort_t ai_satafenbl;
ushort_t ai_majorversion;
ushort_t ai_minorversion;
ushort_t ai_cmdset82;
ushort_t ai_cmdset83;
ushort_t ai_cmdset84;
ushort_t ai_features85;
ushort_t ai_features86;
ushort_t ai_features87;
ushort_t ai_ultradma;
ushort_t ai_erasetime;
ushort_t ai_erasetimex;
ushort_t ai_adv_pwr_mgmt;
ushort_t ai_master_pwd;
ushort_t ai_hrdwre_reset;
ushort_t ai_acoustic;
ushort_t ai_stream_min_sz;
ushort_t ai_stream_xfer_d;
ushort_t ai_stream_lat;
ushort_t ai_streamperf[2];
ushort_t ai_addrsecxt[4];
ushort_t ai_stream_xfer_p;
ushort_t ai_maxcount;
ushort_t ai_phys_sect_sz;
ushort_t ai_seek_delay;
ushort_t ai_naa_ieee_oui;
ushort_t ai_ieee_oui_uid;
ushort_t ai_uid_mid;
ushort_t ai_uid_low;
ushort_t ai_resv_wwn[4];
ushort_t ai_incits;
ushort_t ai_words_lsec[2];
ushort_t ai_cmdset119;
ushort_t ai_features120;
ushort_t ai_padding1[6];
ushort_t ai_rmsn;
ushort_t ai_securestatus;
ushort_t ai_vendor[31];
ushort_t ai_padding2[8];
ushort_t ai_nomformfactor;
ushort_t ai_dsm;
ushort_t ai_padding3[6];
ushort_t ai_curmedser[30];
ushort_t ai_sctsupport;
ushort_t ai_padding4[10];
ushort_t ai_medrotrate;
ushort_t ai_padding5[37];
ushort_t ai_integrity;
} sata_id_t;
#define SATA_ATA_TYPE_MASK 0x8001
#define SATA_ATA_TYPE 0x0000
#define SATA_REM_MEDIA 0x0080
#define SATA_INCOMPLETE_DATA 0x0004
#define SATA_CFA_TYPE 0x848a
#define SATA_ID_SERIAL_OFFSET 10
#define SATA_ID_SERIAL_LEN 20
#define SATA_ID_MODEL_OFFSET 27
#define SATA_ID_MODEL_LEN 40
#define SATA_ID_FW_LEN 8
#define SATA_ID_BDC_LEN 0x3c
#define SATA_ID_ATA_INFO_LEN 0x238
#define SATA_DMA_SUPPORT 0x0100
#define SATA_LBA_SUPPORT 0x0200
#define SATA_IORDY_DISABLE 0x0400
#define SATA_IORDY_SUPPORT 0x0800
#define SATA_STANDBYTIMER 0x2000
#define SATA_VALIDINFO_88 0x0004
#define SATA_VALIDINFO_70_64 0x0004
#define SATA_DETERMINISTIC_READ 0x4000
#define SATA_READ_ZERO 0x0020
#define SATA_MAJVER_7 0x0080
#define SATA_MAJVER_654 0x0070
#define SATA_MAJVER_6 0x0040
#define SATA_MAJVER_5 0x0020
#define SATA_MAJVER_4 0x0010
#define SATA_EXT48 0x0400
#define SATA_PWRUP_IN_STANDBY 0x0020
#define SATA_RM_STATUS_NOTIFIC 0x0010
#define SATA_RW_DMA_QUEUED_CMD 0x0002
#define SATA_DWNLOAD_MCODE_CMD 0x0001
#define SATA_ACOUSTIC_MGMT 0x0200
#define SATA_SMART_SUPPORTED 0x0001
#define SATA_WRITE_CACHE 0x0020
#define SATA_LOOK_AHEAD 0x0040
#define SATA_DEVICE_RESET_CMD 0x0200
#define SATA_READ_BUFFER_CMD 0x2000
#define SATA_WRITE_BUFFER_CMD 0x1000
#define SATA_SMART_ENABLED 0x0001
#define SATA_SMART_SELF_TEST_SUPPORTED 0x0002
#define SATA_IDLE_UNLOAD_SUPPORTED 0x2000
#define SATA_GPL_SUPPORTED 0x0020
#define SATA_L2PS_CHECK_BIT 0x4000
#define SATA_L2PS_HAS_MULT 0x2000
#define SATA_L2PS_BIG_SECTORS 0x1000
#define SATA_L2PS_EXP_MASK 0x000f
#define SATA_MDMA_SEL_MASK 0x0700
#define SATA_MDMA_2_SEL 0x0400
#define SATA_MDMA_1_SEL 0x0200
#define SATA_MDMA_0_SEL 0x0100
#define SATA_MDMA_2_SUP 0x0004
#define SATA_MDMA_1_SUP 0x0002
#define SATA_MDMA_0_SUP 0x0001
#define SATA_MDMA_SUP_MASK 0x0007
#define SATA_UDMA_SUP_MASK 0x007f
#define SATA_UDMA_SEL_MASK 0x7f00
#define SATA_DSM_TRIM 0x0001
#define SATA_SCT_CMD_TRANS_SUP 0x0001
#define SATA_SCT_CMD_TRANS_LNG_SECT_SUP 0x0002
#define SATA_SCT_CMD_TRANS_WR_SAME_SUP 0x0004
#define SATA_SCT_CMD_TRANS_ERR_RCOV_SUP 0x0008
#define SATA_SCT_CMD_TRANS_FEAT_CTL_SUP 0x0010
#define SATA_SCT_CMD_TRANS_DATA_TBL_SUP 0x0020
#define SATA_DISK_SECTOR_SIZE 512
#define SATA_ATAPI_TYPE_MASK 0xc000
#define SATA_ATAPI_TYPE 0x8000
#define SATA_ATAPI_ID_PKT_SZ 0x0003
#define SATA_ATAPI_ID_PKT_12B 0x0000
#define SATA_ATAPI_ID_PKT_16B 0x0001
#define SATA_ATAPI_ID_DRQ_TYPE 0x0060
#define SATA_ATAPI_ID_DRQ_INTR 0x0020
#define SATA_ATAPI_ID_DEV_TYPE 0x1f00
#define SATA_ATAPI_ID_DEV_SHFT 8
#define SATA_ATAPI_DIRACC_DEV 0x0000
#define SATA_ATAPI_SQACC_DEV 0x0100
#define SATA_ATAPI_PROC_DEV 0x0300
#define SATA_ATAPI_CDROM_DEV 0x0500
#define SATA_ATAPI_I_COD 0x01
#define SATA_ATAPI_I_IO 0x02
#define SATA_ATAPI_I_RELEASE 0x04
#define SATA_ATAPI_F_DATA_DIR_READ 0x04
#define SATA_ATAPI_F_OVERLAP 0x02
#define SATA_ATAPI_F_DMA 0x01
#define SATA_ATAPI_ID_CAP_DMA 0x0100
#define SATA_ATAPI_ID_CAP_OVERLAP 0x2000
#define SATA_ATAPI_ID_DMADIR_REQ 0x8000
#define SATA_ATAPI_ID_DMA_SUP 0x0400
#define SATA_ATAPI_SIG_HI 0xeb
#define SATA_ATAPI_SIG_LO 0x14
#define SATA_ATAPI_SECTOR_SIZE 2048
#define SATA_ATAPI_MAX_BYTES_PER_DRQ 0xf800
#define SATA_ATAPI_HEADS 64
#define SATA_ATAPI_SECTORS_PER_TRK 32
#define SATA_NCQ 0x100
#define SATA_3_SPEED 0x008
#define SATA_2_SPEED 0x004
#define SATA_1_SPEED 0x002
#define SATA_READ_AHEAD_SUPPORTED(x) ((x).ai_cmdset82 & SATA_LOOK_AHEAD)
#define SATA_READ_AHEAD_ENABLED(x) ((x).ai_features85 & SATA_LOOK_AHEAD)
#define SATA_WRITE_CACHE_SUPPORTED(x) ((x).ai_cmdset82 & SATA_WRITE_CACHE)
#define SATA_WRITE_CACHE_ENABLED(x) ((x).ai_features85 & SATA_WRITE_CACHE)
#define SATA_RM_NOTIFIC_SUPPORTED(x) \
((x).ai_cmdset83 & SATA_RM_STATUS_NOTIFIC)
#define SATA_RM_NOTIFIC_ENABLED(x) \
((x).ai_features86 & SATA_RM_STATUS_NOTIFIC)
#define NQ 0x80
#define NCQ_TAG_MASK 0x1f
#define FIS_TYPE_REG_H2D 0x27
#define FIS_CMD_UPDATE 0x80
#define SATA_STATUS_BSY 0x80
#define SATA_STATUS_DRDY 0x40
#define SATA_STATUS_DF 0x20
#define SATA_STATUS_DSC 0x10
#define SATA_STATUS_DRQ 0x08
#define SATA_STATUS_CORR 0x04
#define SATA_STATUS_IDX 0x02
#define SATA_STATUS_ERR 0x01
#define SATA_ERROR_ICRC 0x80
#define SATA_ERROR_UNC 0x40
#define SATA_ERROR_MC 0x20
#define SATA_ERROR_IDNF 0x10
#define SATA_ERROR_MCR 0x08
#define SATA_ERROR_ABORT 0x04
#define SATA_ERROR_NM 0x02
#define SATA_ERROR_EOM 0x02
#define SATA_ERROR_ILI 0x01
#define SATA_DEVCTL_NIEN 0x02
#define SATA_DEVCTL_SRST 0x04
#define SATA_DEVCTL_HOB 0x80
#define SATA_ADH_LBA 0x40
#define SATA_ATAPI_TRANS_VERSION(inq) \
(*((uint8_t *)(inq) + 3) >> 4)
#define SCSI_LOG_PAGE_HDR_LEN 4
#define SCSI_LOG_PARAM_HDR_LEN 4
#define ENTRIES_PER_EXT_SELFTEST_LOG_BLK 19
#define SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS 20
#define SCSI_LOG_SENSE_SELFTEST_PARAM_LEN 0x10
#define DIAGNOSTIC_FAILURE_ON_COMPONENT 0x40
#define SCSI_COMPONENT_81 0x81
#define SCSI_COMPONENT_82 0x82
#define SCSI_COMPONENT_83 0x83
#define SCSI_COMPONENT_84 0x84
#define SCSI_COMPONENT_85 0x85
#define SCSI_COMPONENT_86 0x86
#define SCSI_COMPONENT_87 0x87
#define SCSI_COMPONENT_88 0x88
#define SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED 0x67
#define SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED 0x0b
#define SCSI_PREDICTED_FAILURE 0x5d
#define SCSI_GENERAL_HD_FAILURE 0x10
#define SCSI_INFO_EXCEPTIONS_PARAM_LEN 4
#define READ_LOG_EXT_LOG_DIRECTORY 0x00
#define DEVICE_STATS_LOG 0x04
#define DEVSTAT_GENERAL_STATS 0x01
#define DEVSTAT_ROTATING_MEDIA_PAGE 0x03
#define DEVSTAT_GENERAL_ERRORS_PAGE 0x04
#define DEVSTAT_TEMP_PAGE 0x05
#define DEVSTAT_SSD_PAGE 0x07
#define SMART_SELFTEST_LOG_PAGE 0x06
#define EXT_SMART_SELFTEST_LOG_PAGE 0x07
#define READ_LOG_EXT_NCQ_ERROR_RECOVERY 0x10
#define SATA_STAT_SUPPORTED(x) ((x) & (1ULL << 63))
#define SATA_STAT_VALID(x) ((x) & (1ULL << 62))
#define SATA_STAT_VALUE(x) ((x) & ((1ULL << 59) - 1))
struct sata_ncq_error_recovery_page {
uint8_t ncq_tag;
uint8_t reserved1;
uint8_t ncq_status;
uint8_t ncq_error;
uint8_t ncq_sector_number;
uint8_t ncq_cyl_low;
uint8_t ncq_cyl_high;
uint8_t ncq_dev_head;
uint8_t ncq_sector_number_ext;
uint8_t ncq_cyl_low_ext;
uint8_t ncq_cyl_high_ext;
uint8_t reserved2;
uint8_t ncq_sector_count;
uint8_t ncq_sector_count_ext;
uint8_t reserved3[242];
uint8_t ncq_vendor_unique[255];
uint8_t ncq_checksum;
};
#define SMART_START_STOP_COUNT_ID 0x4
struct smart_data {
uint8_t smart_vendor_specific[362];
uint8_t smart_offline_data_collection_status;
uint8_t smart_selftest_exec_status;
uint8_t smart_secs_to_complete_offline_data[2];
uint8_t smart_vendor_specific2;
uint8_t smart_offline_data_collection_capability;
uint8_t smart_capability[2];
uint8_t smart_error_logging_capability;
uint8_t smart_vendor_specific3;
uint8_t smart_short_selftest_polling_time;
uint8_t smart_extended_selftest_polling_time;
uint8_t smart_conveyance_selftest_polling_time;
uint8_t smart_reserved[11];
uint8_t smart_vendor_specific4[125];
uint8_t smart_checksum;
};
struct smart_selftest_log_entry {
uint8_t smart_selftest_log_lba_low;
uint8_t smart_selftest_log_status;
uint8_t smart_selftest_log_timestamp[2];
uint8_t smart_selftest_log_checkpoint;
uint8_t smart_selftest_log_failing_lba[4];
uint8_t smart_selftest_log_vendor_specific[15];
};
#define NUM_SMART_SELFTEST_LOG_ENTRIES 21
struct smart_selftest_log {
uint8_t smart_selftest_log_revision[2];
struct smart_selftest_log_entry
smart_selftest_log_entries[NUM_SMART_SELFTEST_LOG_ENTRIES];
uint8_t smart_selftest_log_vendor_specific[2];
uint8_t smart_selftest_log_index;
uint8_t smart_selftest_log_reserved[2];
uint8_t smart_selftest_log_checksum;
};
struct smart_ext_selftest_log_entry {
uint8_t smart_ext_selftest_log_lba_low;
uint8_t smart_ext_selftest_log_status;
uint8_t smart_ext_selftest_log_timestamp[2];
uint8_t smart_ext_selftest_log_checkpoint;
uint8_t smart_ext_selftest_log_failing_lba[6];
uint8_t smart_ext_selftest_log_vendor_specific[15];
};
struct smart_ext_selftest_log {
uint8_t smart_ext_selftest_log_rev;
uint8_t smart_ext_selftest_log_reserved;
uint8_t smart_ext_selftest_log_index[2];
struct smart_ext_selftest_log_entry smart_ext_selftest_log_entries[19];
uint8_t smart_ext_selftest_log_vendor_specific[2];
uint8_t smart_ext_selftest_log_reserved2[11];
uint8_t smart_ext_selftest_log_checksum;
};
struct read_log_ext_directory {
uint8_t read_log_ext_vers[2];
uint8_t read_log_ext_nblks[255][2];
};
#define CTL_BYTE_VENDOR_MASK 0xc0
#define CTL_BYTE_NACA_MASK 0x04
#define START_STOP_IMMED_MASK 0x01
#define START_STOP_POWER_COND_MASK 0xF0
#define START_STOP_START_MASK 0x01
#define START_STOP_LOEJ_MASK 0x02
#define START_STOP_NOFLUSH_MASK 0x04
#define START_STOP_MODIFIER_MASK 0x0f
#define START_STOP_POWER_COND_SHIFT 4
#define PC_CUMULATIVE_VALUES 0x01
#define PAGE_CODE_GET_SUPPORTED_LOG_PAGES 0x00
#define PAGE_CODE_READ_ERRORS 0x03
#define PAGE_CODE_TEMPERATURE 0x0d
#define PAGE_CODE_START_STOP_CYCLE_COUNTER 0x0e
#define PAGE_CODE_SELF_TEST_RESULTS 0x10
#define PAGE_CODE_SOLID_STATE_MEDIA 0x11
#define PAGE_CODE_GENERAL_STATS 0x19
#define PAGE_CODE_INFORMATION_EXCEPTIONS 0x2f
#define PAGE_CODE_SMART_READ_DATA 0x30
struct log_parameter {
uint8_t param_code[2];
uint8_t param_ctrl_flags;
uint8_t param_len;
uint8_t param_values[];
};
#define LOG_CTRL_LP 0x01
#define LOG_CTRL_LBIN 0x02
#define LOG_CTRL_TMC 0x0c
#define LOG_CTRL_ETC 0x10
#define LOG_CTRL_TSD 0x20
#define LOG_CTRL_DS 0x40
#define LOG_CTRL_DU 0x80
#define SMART_MAGIC_VAL_1 0x4f
#define SMART_MAGIC_VAL_2 0xc2
#define SMART_MAGIC_VAL_3 0xf4
#define SMART_MAGIC_VAL_4 0x2c
#define SCT_STATUS_LOG_PAGE 0xe0
#define SCSI_NO_TEMP 0xff
struct mode_acoustic_management {
struct mode_page mode_page;
uchar_t acoustic_manag_enable;
uchar_t acoustic_manag_level;
uchar_t vendor_recommended_value;
};
#define PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT 3
#define P_CNTRL_CURRENT 0
#define P_CNTRL_CHANGEABLE 1
#define P_CNTRL_DEFAULT 2
#define P_CNTRL_SAVED 3
#define ACOUSTIC_DISABLED 0
#define ACOUSTIC_ENABLED 1
#define MODEPAGE_ACOUSTIC_MANAG 0x30
#define SATA_PMULT_GSCR0 0x0
#define SATA_PMULT_GSCR1 0x1
#define SATA_PMULT_GSCR2 0x2
#define SATA_PMULT_GSCR32 0x20
#define SATA_PMULT_GSCR33 0x21
#define SATA_PMULT_GSCR64 0x40
#define SATA_PMULT_GSCR96 0x60
#define SATA_PMULT_PORTNUM_MASK 0xf
#define SATA_PMULT_PSCR0 0x0
#define SATA_PMULT_PSCR1 0x1
#define SATA_PMULT_PSCR2 0x2
#define SATA_PMULT_PSCR3 0x3
#define SATA_PMULT_PSCR4 0x4
#define SATA_PMULT_REG_SSTS (SATA_PMULT_PSCR0)
#define SATA_PMULT_REG_SERR (SATA_PMULT_PSCR1)
#define SATA_PMULT_REG_SCTL (SATA_PMULT_PSCR2)
#define SATA_PMULT_REG_SACT (SATA_PMULT_PSCR3)
#define SATA_PMULT_REG_SNTF (SATA_PMULT_PSCR4)
#define SATA_PMULT_CAP_BIST (1 << 0)
#define SATA_PMULT_CAP_PMREQ (1 << 1)
#define SATA_PMULT_CAP_SSC (1 << 2)
#define SATA_PMULT_CAP_SNOTIF (1 << 3)
#define SATA_PMULT_CAP_PHYEVENT (1 << 4)
#define SSTATUS_DET_SHIFT 0
#define SSTATUS_SPD_SHIFT 4
#define SSTATUS_IPM_SHIFT 8
#define SSTATUS_DET (0xf << SSTATUS_DET_SHIFT)
#define SSTATUS_SPD (0xf << SSTATUS_SPD_SHIFT)
#define SSTATUS_IPM (0xf << SSTATUS_IPM_SHIFT)
#define SSTATUS_DET_NODEV 0
#define SSTATUS_DET_DEVPRE_NOPHYCOM 1
#define SSTATUS_DET_DEVPRE_PHYCOM 3
#define SSTATUS_DET_PHYOFFLINE 4
#define SSTATUS_GET_DET(x) \
(x & SSTATUS_DET)
#define SSTATUS_SET_DET(x, new_val) \
(x = (x & ~SSTATUS_DET) | (new_val & SSTATUS_DET))
#define SSTATUS_SPD_NODEV 0
#define SSTATUS_SPD_GEN1 1
#define SSTATUS_SPD_GEN2 2
#define SSTATUS_SPD_GEN3 3
#define SSTATUS_IPM_NODEV_NOPHYCOM 0x0
#define SSTATUS_IPM_ACTIVE 0x1
#define SSTATUS_IPM_POWERPARTIAL 0x2
#define SSTATUS_IPM_POWERSLUMBER 0x6
#define SSTATUS_GET_IPM(x) \
((x & SSTATUS_IPM) >> SSTATUS_IPM_SHIFT)
#define SSTATUS_SET_IPM(x, new_val) \
(x = (x & ~SSTATUS_IPM) | \
((new_val << SSTATUS_IPM_SHIFT) & SSTATUS_IPM))
#define SERROR_DATA_ERR_FIXED (1 << 0)
#define SERROR_COMM_ERR_FIXED (1 << 1)
#define SERROR_DATA_ERR (1 << 8)
#define SERROR_PERSISTENT_ERR (1 << 9)
#define SERROR_PROTOCOL_ERR (1 << 10)
#define SERROR_INT_ERR (1 << 11)
#define SERROR_PHY_RDY_CHG (1 << 16)
#define SERROR_PHY_INT_ERR (1 << 17)
#define SERROR_COMM_WAKE (1 << 18)
#define SERROR_10B_TO_8B_ERR (1 << 19)
#define SERROR_DISPARITY_ERR (1 << 20)
#define SERROR_CRC_ERR (1 << 21)
#define SERROR_HANDSHAKE_ERR (1 << 22)
#define SERROR_LINK_SEQ_ERR (1 << 23)
#define SERROR_TRANS_ERR (1 << 24)
#define SERROR_FIS_TYPE (1 << 25)
#define SERROR_EXCHANGED_ERR (1 << 26)
#define SCONTROL_DET_SHIFT 0
#define SCONTROL_SPD_SHIFT 4
#define SCONTROL_IPM_SHIFT 8
#define SCONTROL_SPM_SHIFT 12
#define SCONTROL_DET (0xf << SCONTROL_DET_SHIFT)
#define SCONTROL_SPD (0xf << SCONTROL_SPD_SHIFT)
#define SCONTROL_IPM (0xf << SCONTROL_IPM_SHIFT)
#define SCONTROL_SPM (0xf << SCONTROL_SPM_SHIFT)
#define SCONTROL_GET_DET(x) \
(x & SCONTROL_DET)
#define SCONTROL_SET_DET(x, new_val) \
(x = (x & ~SCONTROL_DET) | (new_val & SCONTROL_DET))
#define SCONTROL_DET_NOACTION 0
#define SCONTROL_DET_COMRESET 1
#define SCONTROL_DET_DISABLE 4
#define SCONTROL_SPD_NOLIMIT 0
#define SCONTROL_SPD_GEN1 1
#define SCONTROL_SPD_GEN2 2
#define SCONTROL_SPD_GEN3 3
#define SCONTROL_GET_IPM(x) \
((x & SCONTROL_IPM) >> SCONTROL_IPM_SHIFT)
#define SCONTROL_SET_IPM(x, new_val) \
(x = (x & ~SCONTROL_IPM) | \
((new_val << SCONTROL_IPM_SHIFT) & SCONTROL_IPM))
#define SCONTROL_IPM_NORESTRICT 0
#define SCONTROL_IPM_DISABLE_PARTIAL 1
#define SCONTROL_IPM_DISABLE_SLUMBER 2
#define SCONTROL_IPM_DISABLE_BOTH 3
#define SCONTROL_IPM_DISABLE_DEVSLEEP 4
#define SCONTROL_IPM_DISABLE_ALL 7
#define SCONTROL_SPM_NORESTRICT 0
#define SCONTROL_SPM_DO_PARTIAL 1
#define SCONTROL_SPM_DO_SLUMBER 2
#define SCONTROL_SPM_DO_ACTIVE 4
#ifdef __cplusplus
}
#endif
#endif