xref: /kernel/linux/linux-5.10/drivers/ata/libata.h (revision 8c2ecf20)
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 *  libata.h - helper library for ATA
4 *
5 *  Copyright 2003-2004 Red Hat, Inc.  All rights reserved.
6 *  Copyright 2003-2004 Jeff Garzik
7 *
8 *  libata documentation is available via 'make {ps|pdf}docs',
9 *  as Documentation/driver-api/libata.rst
10 */
11
12#ifndef __LIBATA_H__
13#define __LIBATA_H__
14
15#define DRV_NAME	"libata"
16#define DRV_VERSION	"3.00"	/* must be exactly four chars */
17
18/* libata-core.c */
19enum {
20	/* flags for ata_dev_read_id() */
21	ATA_READID_POSTRESET	= (1 << 0), /* reading ID after reset */
22
23	/* selector for ata_down_xfermask_limit() */
24	ATA_DNXFER_PIO		= 0,	/* speed down PIO */
25	ATA_DNXFER_DMA		= 1,	/* speed down DMA */
26	ATA_DNXFER_40C		= 2,	/* apply 40c cable limit */
27	ATA_DNXFER_FORCE_PIO	= 3,	/* force PIO */
28	ATA_DNXFER_FORCE_PIO0	= 4,	/* force PIO0 */
29
30	ATA_DNXFER_QUIET	= (1 << 31),
31};
32
33#define ATA_PORT_TYPE_NAME	"ata_port"
34
35extern atomic_t ata_print_id;
36extern int atapi_passthru16;
37extern int libata_fua;
38extern int libata_noacpi;
39extern int libata_allow_tpm;
40extern const struct device_type ata_port_type;
41extern struct ata_link *ata_dev_phys_link(struct ata_device *dev);
42#ifdef CONFIG_ATA_FORCE
43extern void ata_force_cbl(struct ata_port *ap);
44#else
45static inline void ata_force_cbl(struct ata_port *ap) { }
46#endif
47extern u64 ata_tf_to_lba(const struct ata_taskfile *tf);
48extern u64 ata_tf_to_lba48(const struct ata_taskfile *tf);
49extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev, int tag);
50extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev,
51			   u64 block, u32 n_block, unsigned int tf_flags,
52			   unsigned int tag, int class);
53extern u64 ata_tf_read_block(const struct ata_taskfile *tf,
54			     struct ata_device *dev);
55extern unsigned ata_exec_internal(struct ata_device *dev,
56				  struct ata_taskfile *tf, const u8 *cdb,
57				  int dma_dir, void *buf, unsigned int buflen,
58				  unsigned long timeout);
59extern unsigned ata_exec_internal_sg(struct ata_device *dev,
60				     struct ata_taskfile *tf, const u8 *cdb,
61				     int dma_dir, struct scatterlist *sg,
62				     unsigned int n_elem, unsigned long timeout);
63extern int ata_wait_ready(struct ata_link *link, unsigned long deadline,
64			  int (*check_ready)(struct ata_link *link));
65extern int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
66			   unsigned int flags, u16 *id);
67extern int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags);
68extern int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
69			      unsigned int readid_flags);
70extern int ata_dev_configure(struct ata_device *dev);
71extern int sata_down_spd_limit(struct ata_link *link, u32 spd_limit);
72extern int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel);
73extern unsigned int ata_dev_set_feature(struct ata_device *dev,
74					u8 enable, u8 feature);
75extern void ata_qc_free(struct ata_queued_cmd *qc);
76extern void ata_qc_issue(struct ata_queued_cmd *qc);
77extern void __ata_qc_complete(struct ata_queued_cmd *qc);
78extern int atapi_check_dma(struct ata_queued_cmd *qc);
79extern void swap_buf_le16(u16 *buf, unsigned int buf_words);
80extern bool ata_phys_link_online(struct ata_link *link);
81extern bool ata_phys_link_offline(struct ata_link *link);
82extern void ata_dev_init(struct ata_device *dev);
83extern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp);
84extern int sata_link_init_spd(struct ata_link *link);
85extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
86extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
87extern struct ata_port *ata_port_alloc(struct ata_host *host);
88extern const char *sata_spd_string(unsigned int spd);
89extern int ata_port_probe(struct ata_port *ap);
90extern void __ata_port_probe(struct ata_port *ap);
91extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
92				      u8 page, void *buf, unsigned int sectors);
93
94#define to_ata_port(d) container_of(d, struct ata_port, tdev)
95
96/* libata-sata.c */
97#ifdef CONFIG_SATA_HOST
98int ata_sas_allocate_tag(struct ata_port *ap);
99void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
100#else
101static inline int ata_sas_allocate_tag(struct ata_port *ap)
102{
103	return -EOPNOTSUPP;
104}
105static inline void ata_sas_free_tag(unsigned int tag, struct ata_port *ap) { }
106#endif
107
108/* libata-acpi.c */
109#ifdef CONFIG_ATA_ACPI
110extern unsigned int ata_acpi_gtf_filter;
111extern void ata_acpi_dissociate(struct ata_host *host);
112extern int ata_acpi_on_suspend(struct ata_port *ap);
113extern void ata_acpi_on_resume(struct ata_port *ap);
114extern int ata_acpi_on_devcfg(struct ata_device *dev);
115extern void ata_acpi_on_disable(struct ata_device *dev);
116extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state);
117extern void ata_acpi_bind_port(struct ata_port *ap);
118extern void ata_acpi_bind_dev(struct ata_device *dev);
119extern acpi_handle ata_dev_acpi_handle(struct ata_device *dev);
120#else
121static inline void ata_acpi_dissociate(struct ata_host *host) { }
122static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
123static inline void ata_acpi_on_resume(struct ata_port *ap) { }
124static inline int ata_acpi_on_devcfg(struct ata_device *dev) { return 0; }
125static inline void ata_acpi_on_disable(struct ata_device *dev) { }
126static inline void ata_acpi_set_state(struct ata_port *ap,
127				      pm_message_t state) { }
128static inline void ata_acpi_bind_port(struct ata_port *ap) {}
129static inline void ata_acpi_bind_dev(struct ata_device *dev) {}
130#endif
131
132/* libata-scsi.c */
133extern struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
134					    const struct scsi_device *scsidev);
135extern int ata_scsi_add_hosts(struct ata_host *host,
136			      struct scsi_host_template *sht);
137extern void ata_scsi_scan_host(struct ata_port *ap, int sync);
138extern int ata_scsi_offline_dev(struct ata_device *dev);
139extern void ata_scsi_set_sense(struct ata_device *dev,
140			       struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq);
141extern void ata_scsi_set_sense_information(struct ata_device *dev,
142					   struct scsi_cmnd *cmd,
143					   const struct ata_taskfile *tf);
144extern void ata_scsi_media_change_notify(struct ata_device *dev);
145extern void ata_scsi_hotplug(struct work_struct *work);
146extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
147extern void ata_scsi_dev_rescan(struct work_struct *work);
148extern int ata_bus_probe(struct ata_port *ap);
149extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
150			      unsigned int id, u64 lun);
151void ata_scsi_sdev_config(struct scsi_device *sdev);
152int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev);
153void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd);
154int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);
155
156/* libata-eh.c */
157extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
158extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
159extern void ata_eh_acquire(struct ata_port *ap);
160extern void ata_eh_release(struct ata_port *ap);
161extern void ata_scsi_error(struct Scsi_Host *host);
162extern void ata_eh_fastdrain_timerfn(struct timer_list *t);
163extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
164extern void ata_dev_disable(struct ata_device *dev);
165extern void ata_eh_detach_dev(struct ata_device *dev);
166extern void ata_eh_about_to_do(struct ata_link *link, struct ata_device *dev,
167			       unsigned int action);
168extern void ata_eh_done(struct ata_link *link, struct ata_device *dev,
169			unsigned int action);
170extern void ata_eh_autopsy(struct ata_port *ap);
171const char *ata_get_cmd_descript(u8 command);
172extern void ata_eh_report(struct ata_port *ap);
173extern int ata_eh_reset(struct ata_link *link, int classify,
174			ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
175			ata_reset_fn_t hardreset, ata_postreset_fn_t postreset);
176extern int ata_set_mode(struct ata_link *link, struct ata_device **r_failed_dev);
177extern int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,
178			  ata_reset_fn_t softreset, ata_reset_fn_t hardreset,
179			  ata_postreset_fn_t postreset,
180			  struct ata_link **r_failed_disk);
181extern void ata_eh_finish(struct ata_port *ap);
182extern int ata_ering_map(struct ata_ering *ering,
183			 int (*map_fn)(struct ata_ering_entry *, void *),
184		  	 void *arg);
185extern unsigned int atapi_eh_tur(struct ata_device *dev, u8 *r_sense_key);
186extern unsigned int atapi_eh_request_sense(struct ata_device *dev,
187					   u8 *sense_buf, u8 dfl_sense_key);
188
189/* libata-pmp.c */
190#ifdef CONFIG_SATA_PMP
191extern int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *val);
192extern int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val);
193extern int sata_pmp_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
194			    unsigned hints);
195extern int sata_pmp_attach(struct ata_device *dev);
196#else /* CONFIG_SATA_PMP */
197static inline int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *val)
198{
199	return -EINVAL;
200}
201
202static inline int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
203{
204	return -EINVAL;
205}
206
207static inline int sata_pmp_set_lpm(struct ata_link *link,
208				   enum ata_lpm_policy policy, unsigned hints)
209{
210	return -EINVAL;
211}
212
213static inline int sata_pmp_attach(struct ata_device *dev)
214{
215	return -EINVAL;
216}
217#endif /* CONFIG_SATA_PMP */
218
219/* libata-sff.c */
220#ifdef CONFIG_ATA_SFF
221extern void ata_sff_flush_pio_task(struct ata_port *ap);
222extern void ata_sff_port_init(struct ata_port *ap);
223extern int ata_sff_init(void);
224extern void ata_sff_exit(void);
225#else /* CONFIG_ATA_SFF */
226static inline void ata_sff_flush_pio_task(struct ata_port *ap)
227{ }
228static inline void ata_sff_port_init(struct ata_port *ap)
229{ }
230static inline int ata_sff_init(void)
231{ return 0; }
232static inline void ata_sff_exit(void)
233{ }
234#endif /* CONFIG_ATA_SFF */
235
236/* libata-zpodd.c */
237#ifdef CONFIG_SATA_ZPODD
238void zpodd_init(struct ata_device *dev);
239void zpodd_exit(struct ata_device *dev);
240static inline bool zpodd_dev_enabled(struct ata_device *dev)
241{
242	return dev->zpodd != NULL;
243}
244void zpodd_on_suspend(struct ata_device *dev);
245bool zpodd_zpready(struct ata_device *dev);
246void zpodd_enable_run_wake(struct ata_device *dev);
247void zpodd_disable_run_wake(struct ata_device *dev);
248void zpodd_post_poweron(struct ata_device *dev);
249#else /* CONFIG_SATA_ZPODD */
250static inline void zpodd_init(struct ata_device *dev) {}
251static inline void zpodd_exit(struct ata_device *dev) {}
252static inline bool zpodd_dev_enabled(struct ata_device *dev) { return false; }
253static inline void zpodd_on_suspend(struct ata_device *dev) {}
254static inline bool zpodd_zpready(struct ata_device *dev) { return false; }
255static inline void zpodd_enable_run_wake(struct ata_device *dev) {}
256static inline void zpodd_disable_run_wake(struct ata_device *dev) {}
257static inline void zpodd_post_poweron(struct ata_device *dev) {}
258#endif /* CONFIG_SATA_ZPODD */
259
260#endif /* __LIBATA_H__ */
261