1104476Ssam/* SPDX-License-Identifier: GPL-2.0-or-later */
2139825Simp/*
3104476Ssam *  libata.h - helper library for ATA
4104476Ssam *
5104476Ssam *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved.
6104476Ssam *  Copyright 2003-2004 Jeff Garzik
7104476Ssam *
8104476Ssam *  libata documentation is available via 'make {ps|pdf}docs',
9116191Sobrien *  as Documentation/driver-api/libata.rst
10116191Sobrien */
11116191Sobrien
12104476Ssam#ifndef __LIBATA_H__
13104476Ssam#define __LIBATA_H__
14104476Ssam
15104476Ssam#define DRV_NAME	"libata"
16104476Ssam#define DRV_VERSION	"3.00"	/* must be exactly four chars */
17104476Ssam
18104476Ssam/* libata-core.c */
19104476Ssamenum {
20104476Ssam	/* flags for ata_dev_read_id() */
21104476Ssam	ATA_READID_POSTRESET	= (1 << 0), /* reading ID after reset */
22104476Ssam
23104476Ssam	/* selector for ata_down_xfermask_limit() */
24104476Ssam	ATA_DNXFER_PIO		= 0,	/* speed down PIO */
25104476Ssam	ATA_DNXFER_DMA		= 1,	/* speed down DMA */
26104476Ssam	ATA_DNXFER_40C		= 2,	/* apply 40c cable limit */
27104476Ssam	ATA_DNXFER_FORCE_PIO	= 3,	/* force PIO */
28104476Ssam	ATA_DNXFER_FORCE_PIO0	= 4,	/* force PIO0 */
29104476Ssam
30104476Ssam	ATA_DNXFER_QUIET	= (1 << 31),
31104476Ssam};
32104476Ssam
33104476Ssam#define ATA_PORT_TYPE_NAME	"ata_port"
34104476Ssam
35104476Ssamextern atomic_t ata_print_id;
36104476Ssamextern int atapi_passthru16;
37104476Ssamextern int libata_fua;
38104476Ssamextern int libata_noacpi;
39104476Ssamextern int libata_allow_tpm;
40104476Ssamextern const struct device_type ata_port_type;
41104476Ssamextern struct ata_link *ata_dev_phys_link(struct ata_device *dev);
42104476Ssam#ifdef CONFIG_ATA_FORCE
43104476Ssamextern void ata_force_cbl(struct ata_port *ap);
44104476Ssam#else
45104476Ssamstatic inline void ata_force_cbl(struct ata_port *ap) { }
46104476Ssam#endif
47104476Ssamextern u64 ata_tf_to_lba(const struct ata_taskfile *tf);
48104476Ssamextern u64 ata_tf_to_lba48(const struct ata_taskfile *tf);
49104476Ssamextern int ata_build_rw_tf(struct ata_queued_cmd *qc, u64 block, u32 n_block,
50104476Ssam			   unsigned int tf_flags, int dld, int class);
51104476Ssamextern u64 ata_tf_read_block(const struct ata_taskfile *tf,
52104476Ssam			     struct ata_device *dev);
53104476Ssamunsigned int ata_exec_internal(struct ata_device *dev, struct ata_taskfile *tf,
54104476Ssam			       const u8 *cdb, enum dma_data_direction dma_dir,
55104476Ssam			       void *buf, unsigned int buflen,
56104476Ssam			       unsigned int timeout);
57104476Ssamextern int ata_wait_ready(struct ata_link *link, unsigned long deadline,
58104476Ssam			  int (*check_ready)(struct ata_link *link));
59104476Ssamextern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
60104476Ssam			   unsigned int flags, u16 *id);
61104476Ssamextern int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags);
62104476Ssamextern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
63104476Ssam			      unsigned int readid_flags);
64104476Ssamextern int ata_dev_configure(struct ata_device *dev);
65104476Ssamextern bool ata_dev_power_init_tf(struct ata_device *dev,
66104476Ssam				  struct ata_taskfile *tf, bool set_active);
67104476Ssamextern void ata_dev_power_set_standby(struct ata_device *dev);
68104476Ssamextern void ata_dev_power_set_active(struct ata_device *dev);
69104476Ssamextern int sata_down_spd_limit(struct ata_link *link, u32 spd_limit);
70104476Ssamextern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
71104476Ssamextern unsigned int ata_dev_set_feature(struct ata_device *dev,
72104476Ssam					u8 subcmd, u8 action);
73104476Ssamextern void ata_qc_free(struct ata_queued_cmd *qc);
74104476Ssamextern void ata_qc_issue(struct ata_queued_cmd *qc);
75104476Ssamextern void __ata_qc_complete(struct ata_queued_cmd *qc);
76104476Ssamextern int atapi_check_dma(struct ata_queued_cmd *qc);
77104476Ssamextern void swap_buf_le16(u16 *buf, unsigned int buf_words);
78104476Ssamextern bool ata_phys_link_online(struct ata_link *link);
79104476Ssamextern bool ata_phys_link_offline(struct ata_link *link);
80104476Ssamextern void ata_dev_init(struct ata_device *dev);
81104476Ssamextern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp);
82104476Ssamextern int sata_link_init_spd(struct ata_link *link);
83104476Ssamextern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
84104476Ssamextern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
85104476Ssamextern struct ata_port *ata_port_alloc(struct ata_host *host);
86104476Ssamextern const char *sata_spd_string(unsigned int spd);
87104476Ssamextern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
88104476Ssam				      u8 page, void *buf, unsigned int sectors);
89104476Ssam
90104476Ssam#define to_ata_port(d) container_of(d, struct ata_port, tdev)
91104476Ssam
92104476Ssam/* libata-acpi.c */
93104476Ssam#ifdef CONFIG_ATA_ACPI
94104476Ssamextern unsigned int ata_acpi_gtf_filter;
95104476Ssamextern void ata_acpi_dissociate(struct ata_host *host);
96104476Ssamextern void ata_acpi_on_resume(struct ata_port *ap);
97104476Ssamextern int ata_acpi_on_devcfg(struct ata_device *dev);
98104476Ssamextern void ata_acpi_on_disable(struct ata_device *dev);
99104476Ssamextern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state);
100104476Ssamextern void ata_acpi_bind_port(struct ata_port *ap);
101104476Ssamextern void ata_acpi_bind_dev(struct ata_device *dev);
102104476Ssamextern acpi_handle ata_dev_acpi_handle(struct ata_device *dev);
103104476Ssam#else
104104476Ssamstatic inline void ata_acpi_dissociate(struct ata_host *host) { }
105104476Ssamstatic inline void ata_acpi_on_resume(struct ata_port *ap) { }
106104476Ssamstatic inline int ata_acpi_on_devcfg(struct ata_device *dev) { return 0; }
107104476Ssamstatic inline void ata_acpi_on_disable(struct ata_device *dev) { }
108104476Ssamstatic inline void ata_acpi_set_state(struct ata_port *ap,
109104476Ssam				      pm_message_t state) { }
110104476Ssamstatic inline void ata_acpi_bind_port(struct ata_port *ap) {}
111104476Ssamstatic inline void ata_acpi_bind_dev(struct ata_device *dev) {}
112104476Ssam#endif
113104476Ssam
114104476Ssam/* libata-scsi.c */
115104476Ssamextern struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
116104476Ssam					    const struct scsi_device *scsidev);
117104476Ssamextern int ata_scsi_add_hosts(struct ata_host *host,
118104476Ssam			      const struct scsi_host_template *sht);
119104476Ssamextern void ata_scsi_scan_host(struct ata_port *ap, int sync);
120104476Ssamextern int ata_scsi_offline_dev(struct ata_device *dev);
121104476Ssamextern bool ata_scsi_sense_is_valid(u8 sk, u8 asc, u8 ascq);
122104476Ssamextern void ata_scsi_set_sense(struct ata_device *dev,
123104476Ssam			       struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
124104476Ssamextern void ata_scsi_set_sense_information(struct ata_device *dev,
125104476Ssam					   struct scsi_cmnd *cmd,
126104476Ssam					   const struct ata_taskfile *tf);
127104476Ssamextern void ata_scsi_media_change_notify(struct ata_device *dev);
128104476Ssamextern void ata_scsi_hotplug(struct work_struct *work);
129104476Ssamextern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
130104476Ssamextern void ata_scsi_dev_rescan(struct work_struct *work);
131104476Ssamextern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
132104476Ssam			      unsigned int id, u64 lun);
133104476Ssamvoid ata_scsi_sdev_config(struct scsi_device *sdev);
134104476Ssamint ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim,
135104476Ssam		struct ata_device *dev);
136104476Ssamint __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);
137104476Ssam
138104476Ssam/* libata-eh.c */
139104476Ssamextern unsigned int ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
140104476Ssamextern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
141104476Ssamextern void ata_eh_acquire(struct ata_port *ap);
142104476Ssamextern void ata_eh_release(struct ata_port *ap);
143104476Ssamextern void ata_scsi_error(struct Scsi_Host *host);
144104476Ssamextern void ata_eh_fastdrain_timerfn(struct timer_list *t);
145104476Ssamextern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
146104476Ssamextern void ata_dev_disable(struct ata_device *dev);
147104476Ssamextern void ata_eh_detach_dev(struct ata_device *dev);
148104476Ssamextern void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
149104476Ssam			       unsigned int action);
150104476Ssamextern void ata_eh_done(struct ata_link *link, struct ata_device *dev,
151104476Ssam			unsigned int action);
152104476Ssamextern void ata_eh_autopsy(struct ata_port *ap);
153104476Ssamconst char *ata_get_cmd_name(u8 command);
154104476Ssamextern void ata_eh_report(struct ata_port *ap);
155104476Ssamextern int ata_eh_reset(struct ata_link *link, int classify,
156104476Ssam			ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
157104476Ssam			ata_reset_fn_t hardreset, ata_postreset_fn_t postreset);
158104476Ssamextern int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
159104476Ssamextern int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
160104476Ssam			  ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
161104476Ssam			  ata_postreset_fn_t postreset,
162104476Ssam			  struct ata_link **r_failed_disk);
163104476Ssamextern void ata_eh_finish(struct ata_port *ap);
164104476Ssamextern int ata_ering_map(struct ata_ering *ering,
165104476Ssam			 int (*map_fn)(struct ata_ering_entry *, void *),
166104476Ssam			 void *arg);
167104476Ssamextern unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key);
168104476Ssamextern unsigned int atapi_eh_request_sense(struct ata_device *dev,
169104476Ssam					   u8 *sense_buf, u8 dfl_sense_key);
170104476Ssam
171104476Ssam/* libata-pmp.c */
172104476Ssam#ifdef CONFIG_SATA_PMP
173104476Ssamextern int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *val);
174104476Ssamextern int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val);
175104476Ssamextern int sata_pmp_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
176104476Ssam			    unsigned hints);
177104476Ssamextern int sata_pmp_attach(struct ata_device *dev);
178104476Ssam#else /* CONFIG_SATA_PMP */
179104476Ssamstatic inline int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *val)
180104476Ssam{
181104476Ssam	return -EINVAL;
182104476Ssam}
183104476Ssam
184104476Ssamstatic inline int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
185104476Ssam{
186104476Ssam	return -EINVAL;
187104476Ssam}
188104476Ssam
189104476Ssamstatic inline int sata_pmp_set_lpm(struct ata_link *link,
190104476Ssam				   enum ata_lpm_policy policy, unsigned hints)
191104476Ssam{
192104476Ssam	return -EINVAL;
193104476Ssam}
194104476Ssam
195104476Ssamstatic inline int sata_pmp_attach(struct ata_device *dev)
196104476Ssam{
197104476Ssam	return -EINVAL;
198104476Ssam}
199104476Ssam#endif /* CONFIG_SATA_PMP */
200104476Ssam
201104476Ssam/* libata-sff.c */
202104476Ssam#ifdef CONFIG_ATA_SFF
203104476Ssamextern void ata_sff_flush_pio_task(struct ata_port *ap);
204104476Ssamextern void ata_sff_port_init(struct ata_port *ap);
205104476Ssamextern int ata_sff_init(void);
206104476Ssamextern void ata_sff_exit(void);
207104476Ssam#else /* CONFIG_ATA_SFF */
208104476Ssamstatic inline void ata_sff_flush_pio_task(struct ata_port *ap)
209104476Ssam{ }
210104476Ssamstatic inline void ata_sff_port_init(struct ata_port *ap)
211104476Ssam{ }
212104476Ssamstatic inline int ata_sff_init(void)
213104476Ssam{ return 0; }
214104476Ssamstatic inline void ata_sff_exit(void)
215104476Ssam{ }
216104476Ssam#endif /* CONFIG_ATA_SFF */
217104476Ssam
218104476Ssam/* libata-zpodd.c */
219104476Ssam#ifdef CONFIG_SATA_ZPODD
220104476Ssamvoid zpodd_init(struct ata_device *dev);
221104476Ssamvoid zpodd_exit(struct ata_device *dev);
222104476Ssamstatic inline bool zpodd_dev_enabled(struct ata_device *dev)
223104476Ssam{
224104476Ssam	return dev->zpodd != NULL;
225104476Ssam}
226104476Ssamvoid zpodd_on_suspend(struct ata_device *dev);
227104476Ssambool zpodd_zpready(struct ata_device *dev);
228104476Ssamvoid zpodd_enable_run_wake(struct ata_device *dev);
229104476Ssamvoid zpodd_disable_run_wake(struct ata_device *dev);
230104476Ssamvoid zpodd_post_poweron(struct ata_device *dev);
231104476Ssam#else /* CONFIG_SATA_ZPODD */
232104476Ssamstatic inline void zpodd_init(struct ata_device *dev) {}
233104476Ssamstatic inline void zpodd_exit(struct ata_device *dev) {}
234104476Ssamstatic inline bool zpodd_dev_enabled(struct ata_device *dev) { return false; }
235104476Ssamstatic inline void zpodd_on_suspend(struct ata_device *dev) {}
236104476Ssamstatic inline bool zpodd_zpready(struct ata_device *dev) { return false; }
237104476Ssamstatic inline void zpodd_enable_run_wake(struct ata_device *dev) {}
238104476Ssamstatic inline void zpodd_disable_run_wake(struct ata_device *dev) {}
239104476Ssamstatic inline void zpodd_post_poweron(struct ata_device *dev) {}
240104476Ssam#endif /* CONFIG_SATA_ZPODD */
241104476Ssam
242104476Ssam#endif /* __LIBATA_H__ */
243104476Ssam