Lines Matching +full:tf +full:- +full:a
1 // SPDX-License-Identifier: GPL-2.0-only
3 * libata-acpi.c
26 …fermode, 0x2=lock/freeze lock, 0x4=DIPM, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-…
33 u8 tf[REGS_PER_GTF]; /* regs. 0x1f1 - 0x1f7 */ member
38 kfree(dev->gtf_cache); in ata_acpi_clear_gtf()
39 dev->gtf_cache = NULL; in ata_acpi_clear_gtf()
50 #define ata_hotplug_data(context) (container_of((context), struct ata_acpi_hotplug_context, hp)->da…
53 * ata_dev_acpi_handle - provide the acpi_handle for an ata_device
62 return dev->flags & ATA_DFLAG_ACPI_DISABLED ? in ata_dev_acpi_handle()
63 NULL : ACPI_HANDLE(&dev->tdev); in ata_dev_acpi_handle()
70 dev->flags |= ATA_DFLAG_DETACH; in ata_acpi_detach_device()
77 tdev->flags |= ATA_DFLAG_DETACH; in ata_acpi_detach_device()
84 * ata_acpi_handle_hotplug - ACPI event handler backend
90 * the event is port-wide @dev is NULL. If the event is specific to a
94 * port-wide while unplug only kills the target device on device-wide
103 struct ata_eh_info *ehi = &ap->link.eh_info; in ata_acpi_handle_hotplug()
107 spin_lock_irqsave(ap->lock, flags); in ata_acpi_handle_hotplug()
129 spin_unlock_irqrestore(ap->lock, flags); in ata_acpi_handle_hotplug()
137 struct ata_device *dev = ata_hotplug_data(adev->hp).dev; in ata_acpi_dev_notify_dock()
138 ata_acpi_handle_hotplug(dev->link->ap, dev, event); in ata_acpi_dev_notify_dock()
144 ata_acpi_handle_hotplug(ata_hotplug_data(adev->hp).ap, NULL, event); in ata_acpi_ap_notify_dock()
156 if (dev->sdev) in ata_acpi_uevent()
157 kobj = &dev->sdev->sdev_gendev.kobj; in ata_acpi_uevent()
159 kobj = &ap->dev->kobj; in ata_acpi_uevent()
169 ata_acpi_uevent(ata_hotplug_data(adev->hp).ap, NULL, event); in ata_acpi_ap_uevent()
174 struct ata_device *dev = ata_hotplug_data(adev->hp).dev; in ata_acpi_dev_uevent()
175 ata_acpi_uevent(dev->link->ap, dev, event); in ata_acpi_dev_uevent()
181 struct acpi_device *host_companion = ACPI_COMPANION(ap->host->dev); in ata_acpi_bind_port()
185 if (libata_noacpi || ap->flags & ATA_FLAG_ACPI_SATA || !host_companion) in ata_acpi_bind_port()
188 acpi_preset_companion(&ap->tdev, host_companion, ap->port_no); in ata_acpi_bind_port()
190 if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0) in ata_acpi_bind_port()
191 ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; in ata_acpi_bind_port()
193 adev = ACPI_COMPANION(&ap->tdev); in ata_acpi_bind_port()
194 if (!adev || adev->hp) in ata_acpi_bind_port()
201 context->data.ap = ap; in ata_acpi_bind_port()
202 acpi_initialize_hp_context(adev, &context->hp, ata_acpi_ap_notify_dock, in ata_acpi_bind_port()
208 struct ata_port *ap = dev->link->ap; in ata_acpi_bind_dev()
209 struct acpi_device *port_companion = ACPI_COMPANION(&ap->tdev); in ata_acpi_bind_dev()
210 struct acpi_device *host_companion = ACPI_COMPANION(ap->host->dev); in ata_acpi_bind_dev()
220 (!(ap->flags & ATA_FLAG_ACPI_SATA) && !port_companion)) in ata_acpi_bind_dev()
223 if (ap->flags & ATA_FLAG_ACPI_SATA) { in ata_acpi_bind_dev()
225 adr = SATA_ADR(ap->port_no, NO_PORT_MULT); in ata_acpi_bind_dev()
227 adr = SATA_ADR(ap->port_no, dev->link->pmp); in ata_acpi_bind_dev()
230 adr = dev->devno; in ata_acpi_bind_dev()
234 acpi_preset_companion(&dev->tdev, parent, adr); in ata_acpi_bind_dev()
235 adev = ACPI_COMPANION(&dev->tdev); in ata_acpi_bind_dev()
236 if (!adev || adev->hp) in ata_acpi_bind_dev()
243 context->data.dev = dev; in ata_acpi_bind_dev()
244 acpi_initialize_hp_context(adev, &context->hp, ata_acpi_dev_notify_dock, in ata_acpi_bind_dev()
249 * ata_acpi_dissociate - dissociate ATA host from ACPI objects
265 for (i = 0; i < host->n_ports; i++) { in ata_acpi_dissociate()
266 struct ata_port *ap = host->ports[i]; in ata_acpi_dissociate()
269 if (ACPI_HANDLE(&ap->tdev) && gtm) in ata_acpi_dissociate()
275 * ata_acpi_gtm - execute _GTM
285 * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure.
293 acpi_handle handle = ACPI_HANDLE(&ap->tdev); in ata_acpi_gtm()
296 return -EINVAL; in ata_acpi_gtm()
300 rc = -ENOENT; in ata_acpi_gtm()
304 rc = -EINVAL; in ata_acpi_gtm()
312 if (out_obj->type != ACPI_TYPE_BUFFER) { in ata_acpi_gtm()
314 out_obj->type); in ata_acpi_gtm()
319 if (out_obj->buffer.length != sizeof(struct ata_acpi_gtm)) { in ata_acpi_gtm()
321 out_obj->buffer.length); in ata_acpi_gtm()
325 memcpy(gtm, out_obj->buffer.pointer, sizeof(struct ata_acpi_gtm)); in ata_acpi_gtm()
335 * ata_acpi_stm - execute _STM
345 * 0 on success, -ENOENT if _STM doesn't exist, -errno on failure.
360 in_params[1].buffer.pointer = (u8 *)ap->link.device[0].id; in ata_acpi_stm()
363 in_params[2].buffer.pointer = (u8 *)ap->link.device[1].id; in ata_acpi_stm()
368 status = acpi_evaluate_object(ACPI_HANDLE(&ap->tdev), "_STM", in ata_acpi_stm()
372 return -ENOENT; in ata_acpi_stm()
376 return -EINVAL; in ata_acpi_stm()
384 * ata_dev_get_GTF - get the drive bootup default taskfile settings
391 * It returns a variable number of register set values (registers
393 * The <variable number> is not known in advance, so have ACPI-CA
400 * Number of taskfiles on success, 0 if _GTF doesn't exist. -EINVAL
405 struct ata_port *ap = dev->link->ap; in ata_dev_get_GTF()
412 if (dev->gtf_cache) { in ata_dev_get_GTF()
413 out_obj = dev->gtf_cache; in ata_dev_get_GTF()
419 output.pointer = NULL; /* ACPI-CA sets this; save/free it later */ in ata_dev_get_GTF()
423 __func__, ap->port_no); in ata_dev_get_GTF()
428 out_obj = dev->gtf_cache = output.pointer; in ata_dev_get_GTF()
434 rc = -EINVAL; in ata_dev_get_GTF()
445 rc = -EINVAL; in ata_dev_get_GTF()
449 if (out_obj->type != ACPI_TYPE_BUFFER) { in ata_dev_get_GTF()
451 out_obj->type); in ata_dev_get_GTF()
452 rc = -EINVAL; in ata_dev_get_GTF()
456 if (out_obj->buffer.length % REGS_PER_GTF) { in ata_dev_get_GTF()
458 out_obj->buffer.length); in ata_dev_get_GTF()
459 rc = -EINVAL; in ata_dev_get_GTF()
464 rc = out_obj->buffer.length / REGS_PER_GTF; in ata_dev_get_GTF()
466 *gtf = (void *)out_obj->buffer.pointer; in ata_dev_get_GTF()
479 * ata_acpi_gtm_xfermode - determine xfermode from GTM parameter
500 unit = dev->devno; in ata_acpi_gtm_xfermask()
501 if (!(gtm->flags & 0x10)) in ata_acpi_gtm_xfermask()
505 mode = ata_timing_cycle2mode(ATA_SHIFT_PIO, gtm->drive[unit].pio); in ata_acpi_gtm_xfermask()
512 if (!(gtm->flags & (1 << (2 * unit)))) in ata_acpi_gtm_xfermask()
517 mode = ata_timing_cycle2mode(type, gtm->drive[unit].dma); in ata_acpi_gtm_xfermask()
525 * ata_acpi_cbl_80wire - Check for 80 wire cable
535 ata_for_each_dev(dev, &ap->link, ENABLED) { in ata_acpi_cbl_80wire()
551 struct ata_taskfile *tf) in ata_acpi_gtf_to_tf() argument
553 ata_tf_init(dev, tf); in ata_acpi_gtf_to_tf()
555 tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; in ata_acpi_gtf_to_tf()
556 tf->protocol = ATA_PROT_NODATA; in ata_acpi_gtf_to_tf()
557 tf->feature = gtf->tf[0]; /* 0x1f1 */ in ata_acpi_gtf_to_tf()
558 tf->nsect = gtf->tf[1]; /* 0x1f2 */ in ata_acpi_gtf_to_tf()
559 tf->lbal = gtf->tf[2]; /* 0x1f3 */ in ata_acpi_gtf_to_tf()
560 tf->lbam = gtf->tf[3]; /* 0x1f4 */ in ata_acpi_gtf_to_tf()
561 tf->lbah = gtf->tf[4]; /* 0x1f5 */ in ata_acpi_gtf_to_tf()
562 tf->device = gtf->tf[5]; /* 0x1f6 */ in ata_acpi_gtf_to_tf()
563 tf->command = gtf->tf[6]; /* 0x1f7 */ in ata_acpi_gtf_to_tf()
567 const struct ata_taskfile *tf, in ata_acpi_filter_tf() argument
570 if (dev->gtf_filter & ATA_ACPI_FILTER_SETXFER) { in ata_acpi_filter_tf()
574 if (tf->command == ATA_CMD_SET_FEATURES && in ata_acpi_filter_tf()
575 tf->feature == SETFEATURES_XFER) in ata_acpi_filter_tf()
579 if (dev->gtf_filter & ATA_ACPI_FILTER_LOCK) { in ata_acpi_filter_tf()
585 if (tf->command == ATA_CMD_CONF_OVERLAY && in ata_acpi_filter_tf()
586 tf->feature == ATA_DCO_FREEZE_LOCK) in ata_acpi_filter_tf()
590 if (tf->command == ATA_CMD_SEC_FREEZE_LOCK) in ata_acpi_filter_tf()
594 if ((!ptf || ptf->command != ATA_CMD_READ_NATIVE_MAX) && in ata_acpi_filter_tf()
595 tf->command == ATA_CMD_SET_MAX && in ata_acpi_filter_tf()
596 (tf->feature == ATA_SET_MAX_LOCK || in ata_acpi_filter_tf()
597 tf->feature == ATA_SET_MAX_FREEZE_LOCK)) in ata_acpi_filter_tf()
601 if (tf->command == ATA_CMD_SET_FEATURES && in ata_acpi_filter_tf()
602 tf->feature == SETFEATURES_SATA_ENABLE) { in ata_acpi_filter_tf()
604 if (dev->gtf_filter & ATA_ACPI_FILTER_DIPM && in ata_acpi_filter_tf()
605 tf->nsect == SATA_DIPM) in ata_acpi_filter_tf()
608 /* inhibit FPDMA non-zero offset */ in ata_acpi_filter_tf()
609 if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET && in ata_acpi_filter_tf()
610 (tf->nsect == SATA_FPDMA_OFFSET || in ata_acpi_filter_tf()
611 tf->nsect == SATA_FPDMA_IN_ORDER)) in ata_acpi_filter_tf()
615 if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_AA && in ata_acpi_filter_tf()
616 tf->nsect == SATA_FPDMA_AA) in ata_acpi_filter_tf()
624 * ata_acpi_run_tf - send taskfile registers to host controller
626 * @gtf: raw ATA taskfile register set (0x1f1 - 0x1f7)
634 * registers. If the control register has a new value, this
643 * filtered out, -errno on other errors.
650 struct ata_taskfile tf, ptf, rtf; in ata_acpi_run_tf() local
657 if ((gtf->tf[0] == 0) && (gtf->tf[1] == 0) && (gtf->tf[2] == 0) in ata_acpi_run_tf()
658 && (gtf->tf[3] == 0) && (gtf->tf[4] == 0) && (gtf->tf[5] == 0) in ata_acpi_run_tf()
659 && (gtf->tf[6] == 0)) in ata_acpi_run_tf()
662 ata_acpi_gtf_to_tf(dev, gtf, &tf); in ata_acpi_run_tf()
668 if (!ata_acpi_filter_tf(dev, &tf, pptf)) { in ata_acpi_run_tf()
669 rtf = tf; in ata_acpi_run_tf()
693 rc = -EIO; in ata_acpi_run_tf()
701 descr = ata_get_cmd_descript(tf.command); in ata_acpi_run_tf()
705 tf.command, tf.feature, tf.nsect, tf.lbal, in ata_acpi_run_tf()
706 tf.lbam, tf.lbah, tf.device, in ata_acpi_run_tf()
713 * ata_acpi_exec_tfs - get then write drive taskfile settings
724 * -errno on other errors.
756 * ata_acpi_push_id - send Identify data to drive
760 * Must be after Identify (Packet) Device -- uses its data
761 * ATM this function never returns a failure. It is an optional
769 * 0 on success, -ENOENT if _SDD doesn't exist, -errno on failure.
773 struct ata_port *ap = dev->link->ap; in ata_acpi_push_id()
780 __func__, dev->devno, ap->port_no); in ata_acpi_push_id()
787 in_params[0].buffer.length = sizeof(dev->id[0]) * ATA_ID_WORDS; in ata_acpi_push_id()
788 in_params[0].buffer.pointer = (u8 *)dev->id; in ata_acpi_push_id()
792 swap_buf_le16(dev->id, ATA_ID_WORDS); in ata_acpi_push_id()
795 swap_buf_le16(dev->id, ATA_ID_WORDS); in ata_acpi_push_id()
798 return -ENOENT; in ata_acpi_push_id()
802 return -EIO; in ata_acpi_push_id()
809 * ata_acpi_on_suspend - ATA ACPI hook called on suspend
821 * 0 on success, -errno on failure.
830 * ata_acpi_on_resume - ATA ACPI hook called on resume
833 * This function is called when @ap is resumed - right after port
844 if (ACPI_HANDLE(&ap->tdev) && gtm) { in ata_acpi_on_resume()
854 ata_for_each_dev(dev, &ap->link, ALL) { in ata_acpi_on_resume()
859 dev->flags |= ATA_DFLAG_ACPI_PENDING; in ata_acpi_on_resume()
866 ata_for_each_dev(dev, &ap->link, ALL) { in ata_acpi_on_resume()
869 dev->flags |= ATA_DFLAG_ACPI_PENDING; in ata_acpi_on_resume()
884 if (dev->class == ATA_DEV_ATAPI && in ata_acpi_choose_suspend_state()
889 return acpi_pm_device_sleep_state(&dev->tdev, NULL, d_max_in); in ata_acpi_choose_suspend_state()
899 ata_for_each_dev(dev, &ap->link, ENABLED) { in sata_acpi_set_state()
926 port_handle = ACPI_HANDLE(&ap->tdev); in pata_acpi_set_state()
935 ata_for_each_dev(dev, &ap->link, ENABLED) { in pata_acpi_set_state()
949 * ata_acpi_set_state - set the port power state
953 * This function sets a proper ACPI D state for the device on
958 if (ap->flags & ATA_FLAG_ACPI_SATA) in ata_acpi_set_state()
965 * ata_acpi_on_devcfg - ATA ACPI hook called on device donfiguration
976 * -errno on failure.
980 struct ata_port *ap = dev->link->ap; in ata_acpi_on_devcfg()
981 struct ata_eh_context *ehc = &ap->link.eh_context; in ata_acpi_on_devcfg()
982 int acpi_sata = ap->flags & ATA_FLAG_ACPI_SATA; in ata_acpi_on_devcfg()
990 if (!(dev->flags & ATA_DFLAG_ACPI_PENDING) && in ata_acpi_on_devcfg()
991 !(acpi_sata && (ehc->i.flags & ATA_EHI_DID_HARDRESET))) in ata_acpi_on_devcfg()
997 if (rc && rc != -ENOENT) in ata_acpi_on_devcfg()
1006 dev->flags &= ~ATA_DFLAG_ACPI_PENDING; in ata_acpi_on_devcfg()
1022 if (rc == -EINVAL && !nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN)) in ata_acpi_on_devcfg()
1026 if (!(dev->flags & ATA_DFLAG_ACPI_FAILED)) { in ata_acpi_on_devcfg()
1027 dev->flags |= ATA_DFLAG_ACPI_FAILED; in ata_acpi_on_devcfg()
1031 dev->flags |= ATA_DFLAG_ACPI_DISABLED; in ata_acpi_on_devcfg()
1037 if (!nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN)) in ata_acpi_on_devcfg()
1044 * ata_acpi_on_disable - ATA ACPI hook called when a device is disabled