xref: /freebsd/sys/cam/ata/ata_all.h (revision 95ee2897)
152c9ce25SScott Long /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3bec9534dSPedro F. Giffuni  *
452c9ce25SScott Long  * Copyright (c) 2009 Alexander Motin <mav@FreeBSD.org>
552c9ce25SScott Long  * All rights reserved.
652c9ce25SScott Long  *
752c9ce25SScott Long  * Redistribution and use in source and binary forms, with or without
852c9ce25SScott Long  * modification, are permitted provided that the following conditions
952c9ce25SScott Long  * are met:
1052c9ce25SScott Long  * 1. Redistributions of source code must retain the above copyright
1152c9ce25SScott Long  *    notice, this list of conditions and the following disclaimer,
1252c9ce25SScott Long  *    without modification, immediately at the beginning of the file.
1352c9ce25SScott Long  * 2. Redistributions in binary form must reproduce the above copyright
1452c9ce25SScott Long  *    notice, this list of conditions and the following disclaimer in the
1552c9ce25SScott Long  *    documentation and/or other materials provided with the distribution.
1652c9ce25SScott Long  *
1752c9ce25SScott Long  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1852c9ce25SScott Long  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1952c9ce25SScott Long  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2052c9ce25SScott Long  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2152c9ce25SScott Long  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2252c9ce25SScott Long  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2352c9ce25SScott Long  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2452c9ce25SScott Long  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2552c9ce25SScott Long  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2652c9ce25SScott Long  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2752c9ce25SScott Long  */
2852c9ce25SScott Long 
2952c9ce25SScott Long #ifndef	CAM_ATA_ALL_H
3052c9ce25SScott Long #define CAM_ATA_ALL_H 1
3152c9ce25SScott Long 
3252c9ce25SScott Long #include <sys/ata.h>
3352c9ce25SScott Long 
3452c9ce25SScott Long struct ccb_ataio;
3552c9ce25SScott Long struct cam_periph;
3652c9ce25SScott Long union  ccb;
3752c9ce25SScott Long 
382e1eb332SMarius Strobl #define	SID_DMA48	0x01 /* Abuse inq_flags bit to track enabled DMA48. */
393631c638SAlexander Motin #define	SID_AEN		0x04 /* Abuse inq_flags bit to track enabled AEN. */
40cf2b9a5fSAlexander Motin #define	SID_DMA		0x10 /* Abuse inq_flags bit to track enabled DMA. */
41cf2b9a5fSAlexander Motin 
4252c9ce25SScott Long struct ata_cmd {
439db2db6bSWarner Losh 	uint8_t	flags;		/* ATA command flags */
4452c9ce25SScott Long #define		CAM_ATAIO_48BIT		0x01	/* Command has 48-bit format */
4552c9ce25SScott Long #define		CAM_ATAIO_FPDMA		0x02	/* FPDMA command */
4652c9ce25SScott Long #define		CAM_ATAIO_CONTROL	0x04	/* Control, not a command */
4752c9ce25SScott Long #define		CAM_ATAIO_NEEDRESULT	0x08	/* Request requires result. */
48f3631e8dSAlexander Motin #define		CAM_ATAIO_DMA		0x10	/* DMA command */
4952c9ce25SScott Long 
509db2db6bSWarner Losh 	uint8_t	command;
519db2db6bSWarner Losh 	uint8_t	features;
5252c9ce25SScott Long 
539db2db6bSWarner Losh 	uint8_t	lba_low;
549db2db6bSWarner Losh 	uint8_t	lba_mid;
559db2db6bSWarner Losh 	uint8_t	lba_high;
569db2db6bSWarner Losh 	uint8_t	device;
5752c9ce25SScott Long 
589db2db6bSWarner Losh 	uint8_t	lba_low_exp;
599db2db6bSWarner Losh 	uint8_t	lba_mid_exp;
609db2db6bSWarner Losh 	uint8_t	lba_high_exp;
619db2db6bSWarner Losh 	uint8_t	features_exp;
6252c9ce25SScott Long 
639db2db6bSWarner Losh 	uint8_t	sector_count;
649db2db6bSWarner Losh 	uint8_t	sector_count_exp;
659db2db6bSWarner Losh 	uint8_t	control;
6652c9ce25SScott Long };
6752c9ce25SScott Long 
6852c9ce25SScott Long struct ata_res {
699db2db6bSWarner Losh 	uint8_t	flags;		/* ATA command flags */
7052c9ce25SScott Long #define		CAM_ATAIO_48BIT		0x01	/* Command has 48-bit format */
7152c9ce25SScott Long 
729db2db6bSWarner Losh 	uint8_t	status;
739db2db6bSWarner Losh 	uint8_t	error;
7452c9ce25SScott Long 
759db2db6bSWarner Losh 	uint8_t	lba_low;
769db2db6bSWarner Losh 	uint8_t	lba_mid;
779db2db6bSWarner Losh 	uint8_t	lba_high;
789db2db6bSWarner Losh 	uint8_t	device;
7952c9ce25SScott Long 
809db2db6bSWarner Losh 	uint8_t	lba_low_exp;
819db2db6bSWarner Losh 	uint8_t	lba_mid_exp;
829db2db6bSWarner Losh 	uint8_t	lba_high_exp;
8352c9ce25SScott Long 
849db2db6bSWarner Losh 	uint8_t	sector_count;
859db2db6bSWarner Losh 	uint8_t	sector_count_exp;
8652c9ce25SScott Long };
8752c9ce25SScott Long 
883089bb2eSAlexander Motin struct sep_identify_data {
893089bb2eSAlexander Motin 	uint8_t		length;		/* Enclosure descriptor length */
903089bb2eSAlexander Motin 	uint8_t		subenc_id;	/* Sub-enclosure identifier */
913089bb2eSAlexander Motin 	uint8_t		logical_id[8];	/* Enclosure logical identifier (WWN) */
923089bb2eSAlexander Motin 	uint8_t		vendor_id[8];	/* Vendor identification string */
933089bb2eSAlexander Motin 	uint8_t		product_id[16];	/* Product identification string */
943089bb2eSAlexander Motin 	uint8_t		product_rev[4];	/* Product revision string */
953089bb2eSAlexander Motin 	uint8_t		channel_id;	/* Channel identifier */
963089bb2eSAlexander Motin 	uint8_t		firmware_rev[4];/* Firmware revision */
973089bb2eSAlexander Motin 	uint8_t		interface_id[6];/* Interface spec ("S-E-S "/"SAF-TE")*/
983089bb2eSAlexander Motin 	uint8_t		interface_rev[4];/* Interface spec revision */
993089bb2eSAlexander Motin 	uint8_t		vend_spec[11];	/* Vendor specific information */
1003089bb2eSAlexander Motin };
1013089bb2eSAlexander Motin 
10252c9ce25SScott Long int	ata_version(int ver);
1038691755dSAlexander Motin 
1048691755dSAlexander Motin char *	ata_op_string(struct ata_cmd *cmd);
1058691755dSAlexander Motin char *	ata_cmd_string(struct ata_cmd *cmd, char *cmd_string, size_t len);
106c9767ca8SScott Long void	ata_cmd_sbuf(struct ata_cmd *cmd, struct sbuf *sb);
1078691755dSAlexander Motin char *	ata_res_string(struct ata_res *res, char *res_string, size_t len);
1088691755dSAlexander Motin int	ata_command_sbuf(struct ccb_ataio *ataio, struct sbuf *sb);
1098691755dSAlexander Motin int	ata_status_sbuf(struct ccb_ataio *ataio, struct sbuf *sb);
110c9767ca8SScott Long int	ata_res_sbuf(struct ata_res *res, struct sbuf *sb);
1118691755dSAlexander Motin 
11252c9ce25SScott Long void	ata_print_ident(struct ata_params *ident_data);
1135d01277fSScott Long void	ata_print_ident_sbuf(struct ata_params *ident_data, struct sbuf *sb);
1148d36a71bSAlexander Motin void	ata_print_ident_short(struct ata_params *ident_data);
1155d01277fSScott Long void	ata_print_ident_short_sbuf(struct ata_params *ident_data, struct sbuf *sb);
11652c9ce25SScott Long 
117c1bd46c2SAlexander Motin uint32_t	ata_logical_sector_size(struct ata_params *ident_data);
118c1bd46c2SAlexander Motin uint64_t	ata_physical_sector_size(struct ata_params *ident_data);
119c1bd46c2SAlexander Motin uint64_t	ata_logical_sector_offset(struct ata_params *ident_data);
120c1bd46c2SAlexander Motin 
1217606b445SAlexander Motin void	ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features,
12252c9ce25SScott Long     uint32_t lba, uint8_t sector_count);
12352c9ce25SScott Long void	ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features,
12452c9ce25SScott Long     uint64_t lba, uint16_t sector_count);
12552c9ce25SScott Long void	ata_ncq_cmd(struct ccb_ataio *ataio, uint8_t cmd,
12652c9ce25SScott Long     uint64_t lba, uint16_t sector_count);
12752c9ce25SScott Long void	ata_reset_cmd(struct ccb_ataio *ataio);
12852c9ce25SScott Long void	ata_pm_read_cmd(struct ccb_ataio *ataio, int reg, int port);
1292a3510fdSAlexander Motin void	ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint32_t val);
1309a6844d5SKenneth D. Merry void	ata_read_log(struct ccb_ataio *ataio, uint32_t retries,
1319a6844d5SKenneth D. Merry 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
1329a6844d5SKenneth D. Merry 		     uint32_t log_address, uint32_t page_number,
1339a6844d5SKenneth D. Merry 		     uint16_t block_count, uint32_t protocol,
1349a6844d5SKenneth D. Merry 		     uint8_t *data_ptr, uint32_t dxfer_len, uint32_t timeout);
13552c9ce25SScott Long 
136296218d4SWarner Losh void	ata_param_fixup(struct ata_params *ident_buf);
13752c9ce25SScott Long void	ata_bswap(int8_t *buf, int len);
13852c9ce25SScott Long void	ata_btrim(int8_t *buf, int len);
13952c9ce25SScott Long void	ata_bpack(int8_t *src, int8_t *dst, int len);
14052c9ce25SScott Long 
14152c9ce25SScott Long int	ata_max_pmode(struct ata_params *ap);
14252c9ce25SScott Long int	ata_max_wmode(struct ata_params *ap);
14352c9ce25SScott Long int	ata_max_umode(struct ata_params *ap);
144c8039fc6SAlexander Motin int	ata_max_mode(struct ata_params *ap, int maxmode);
145c8039fc6SAlexander Motin 
146c8039fc6SAlexander Motin char *	ata_mode2string(int mode);
147b447e682SAlexander Motin int	ata_string2mode(char *str);
148c8039fc6SAlexander Motin u_int	ata_mode2speed(int mode);
149c8039fc6SAlexander Motin u_int	ata_revision2speed(int revision);
150c8039fc6SAlexander Motin int	ata_speed2revision(u_int speed);
15152c9ce25SScott Long 
15230a4094fSAlexander Motin int	ata_identify_match(caddr_t identbuffer, caddr_t table_entry);
15330a4094fSAlexander Motin int	ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry);
15430a4094fSAlexander Motin 
1553089bb2eSAlexander Motin void	semb_print_ident(struct sep_identify_data *ident_data);
1565d01277fSScott Long void	semb_print_ident_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb);
1578d36a71bSAlexander Motin void	semb_print_ident_short(struct sep_identify_data *ident_data);
1585d01277fSScott Long void	semb_print_ident_short_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb);
1593089bb2eSAlexander Motin 
1603089bb2eSAlexander Motin void semb_receive_diagnostic_results(struct ccb_ataio *ataio,
1619db2db6bSWarner Losh 	uint32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*),
1623089bb2eSAlexander Motin 	uint8_t tag_action, int pcv, uint8_t page_code,
1633089bb2eSAlexander Motin 	uint8_t *data_ptr, uint16_t allocation_length, uint32_t timeout);
1643089bb2eSAlexander Motin 
1653089bb2eSAlexander Motin void semb_send_diagnostic(struct ccb_ataio *ataio,
1669db2db6bSWarner Losh 	uint32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *),
1673089bb2eSAlexander Motin 	uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length,
1683089bb2eSAlexander Motin 	uint32_t timeout);
1693089bb2eSAlexander Motin 
1703089bb2eSAlexander Motin void semb_read_buffer(struct ccb_ataio *ataio,
1719db2db6bSWarner Losh 	uint32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb*),
1723089bb2eSAlexander Motin 	uint8_t tag_action, uint8_t page_code,
1733089bb2eSAlexander Motin 	uint8_t *data_ptr, uint16_t allocation_length, uint32_t timeout);
1743089bb2eSAlexander Motin 
1753089bb2eSAlexander Motin void semb_write_buffer(struct ccb_ataio *ataio,
1769db2db6bSWarner Losh 	uint32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *),
1773089bb2eSAlexander Motin 	uint8_t tag_action, uint8_t *data_ptr, uint16_t param_list_length,
1783089bb2eSAlexander Motin 	uint32_t timeout);
1793089bb2eSAlexander Motin 
1809a6844d5SKenneth D. Merry void ata_zac_mgmt_out(struct ccb_ataio *ataio, uint32_t retries,
1819a6844d5SKenneth D. Merry 	void (*cbfcnp)(struct cam_periph *, union ccb *),
1829a6844d5SKenneth D. Merry 	int use_ncq __unused, uint8_t zm_action, uint64_t zone_id,
1839a6844d5SKenneth D. Merry 	uint8_t zone_flags, uint16_t sector_count, uint8_t *data_ptr,
1849a6844d5SKenneth D. Merry 	uint32_t dxfer_len, uint32_t timeout);
1859a6844d5SKenneth D. Merry 
1869a6844d5SKenneth D. Merry void ata_zac_mgmt_in(struct ccb_ataio *ataio, uint32_t retries,
1879a6844d5SKenneth D. Merry 	void (*cbfcnp)(struct cam_periph *, union ccb *),
1889a6844d5SKenneth D. Merry 	int use_ncq __unused, uint8_t zm_action, uint64_t zone_id,
1899a6844d5SKenneth D. Merry 	uint8_t zone_flags, uint8_t *data_ptr, uint32_t dxfer_len,
1909a6844d5SKenneth D. Merry 	uint32_t timeout);
1919a6844d5SKenneth D. Merry 
19252c9ce25SScott Long #endif
193