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