linux/drivers/ata/libata-acpi.c
<<
>>
Prefs
   1/*
   2 * libata-acpi.c
   3 * Provides ACPI support for PATA/SATA.
   4 *
   5 * Copyright (C) 2006 Intel Corp.
   6 * Copyright (C) 2006 Randy Dunlap
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/ata.h>
  11#include <linux/delay.h>
  12#include <linux/device.h>
  13#include <linux/errno.h>
  14#include <linux/kernel.h>
  15#include <linux/acpi.h>
  16#include <linux/libata.h>
  17#include <linux/pci.h>
  18#include <linux/slab.h>
  19#include <linux/pm_runtime.h>
  20#include <scsi/scsi_device.h>
  21#include "libata.h"
  22
  23#include <acpi/acpi_bus.h>
  24
  25unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT;
  26module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644);
  27MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-activate)");
  28
  29#define NO_PORT_MULT            0xffff
  30#define SATA_ADR(root, pmp)     (((root) << 16) | (pmp))
  31
  32#define REGS_PER_GTF            7
  33struct ata_acpi_gtf {
  34        u8      tf[REGS_PER_GTF];       /* regs. 0x1f1 - 0x1f7 */
  35} __packed;
  36
  37/*
  38 *      Helper - belongs in the PCI layer somewhere eventually
  39 */
  40static int is_pci_dev(struct device *dev)
  41{
  42        return (dev->bus == &pci_bus_type);
  43}
  44
  45static void ata_acpi_clear_gtf(struct ata_device *dev)
  46{
  47        kfree(dev->gtf_cache);
  48        dev->gtf_cache = NULL;
  49}
  50
  51/**
  52 * ata_ap_acpi_handle - provide the acpi_handle for an ata_port
  53 * @ap: the acpi_handle returned will correspond to this port
  54 *
  55 * Returns the acpi_handle for the ACPI namespace object corresponding to
  56 * the ata_port passed into the function, or NULL if no such object exists
  57 */
  58acpi_handle ata_ap_acpi_handle(struct ata_port *ap)
  59{
  60        if (ap->flags & ATA_FLAG_ACPI_SATA)
  61                return NULL;
  62
  63        return ap->scsi_host ?
  64                DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev) : NULL;
  65}
  66EXPORT_SYMBOL(ata_ap_acpi_handle);
  67
  68/**
  69 * ata_dev_acpi_handle - provide the acpi_handle for an ata_device
  70 * @dev: the acpi_device returned will correspond to this port
  71 *
  72 * Returns the acpi_handle for the ACPI namespace object corresponding to
  73 * the ata_device passed into the function, or NULL if no such object exists
  74 */
  75acpi_handle ata_dev_acpi_handle(struct ata_device *dev)
  76{
  77        acpi_integer adr;
  78        struct ata_port *ap = dev->link->ap;
  79
  80        if (libata_noacpi || dev->flags & ATA_DFLAG_ACPI_DISABLED)
  81                return NULL;
  82
  83        if (ap->flags & ATA_FLAG_ACPI_SATA) {
  84                if (!sata_pmp_attached(ap))
  85                        adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
  86                else
  87                        adr = SATA_ADR(ap->port_no, dev->link->pmp);
  88                return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), adr);
  89        } else
  90                return acpi_get_child(ata_ap_acpi_handle(ap), dev->devno);
  91}
  92EXPORT_SYMBOL(ata_dev_acpi_handle);
  93
  94/* @ap and @dev are the same as ata_acpi_handle_hotplug() */
  95static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
  96{
  97        if (dev)
  98                dev->flags |= ATA_DFLAG_DETACH;
  99        else {
 100                struct ata_link *tlink;
 101                struct ata_device *tdev;
 102
 103                ata_for_each_link(tlink, ap, EDGE)
 104                        ata_for_each_dev(tdev, tlink, ALL)
 105                                tdev->flags |= ATA_DFLAG_DETACH;
 106        }
 107
 108        ata_port_schedule_eh(ap);
 109}
 110
 111/**
 112 * ata_acpi_handle_hotplug - ACPI event handler backend
 113 * @ap: ATA port ACPI event occurred
 114 * @dev: ATA device ACPI event occurred (can be NULL)
 115 * @event: ACPI event which occurred
 116 *
 117 * All ACPI bay / device realted events end up in this function.  If
 118 * the event is port-wide @dev is NULL.  If the event is specific to a
 119 * device, @dev points to it.
 120 *
 121 * Hotplug (as opposed to unplug) notification is always handled as
 122 * port-wide while unplug only kills the target device on device-wide
 123 * event.
 124 *
 125 * LOCKING:
 126 * ACPI notify handler context.  May sleep.
 127 */
 128static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
 129                                    u32 event)
 130{
 131        struct ata_eh_info *ehi = &ap->link.eh_info;
 132        int wait = 0;
 133        unsigned long flags;
 134
 135        spin_lock_irqsave(ap->lock, flags);
 136        /*
 137         * When dock driver calls into the routine, it will always use
 138         * ACPI_NOTIFY_BUS_CHECK/ACPI_NOTIFY_DEVICE_CHECK for add and
 139         * ACPI_NOTIFY_EJECT_REQUEST for remove
 140         */
 141        switch (event) {
 142        case ACPI_NOTIFY_BUS_CHECK:
 143        case ACPI_NOTIFY_DEVICE_CHECK:
 144                ata_ehi_push_desc(ehi, "ACPI event");
 145
 146                ata_ehi_hotplugged(ehi);
 147                ata_port_freeze(ap);
 148                break;
 149        case ACPI_NOTIFY_EJECT_REQUEST:
 150                ata_ehi_push_desc(ehi, "ACPI event");
 151
 152                ata_acpi_detach_device(ap, dev);
 153                wait = 1;
 154                break;
 155        }
 156
 157        spin_unlock_irqrestore(ap->lock, flags);
 158
 159        if (wait) {
 160                ata_port_wait_eh(ap);
 161                flush_work(&ap->hotplug_task.work);
 162        }
 163}
 164
 165static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
 166{
 167        struct ata_device *dev = data;
 168
 169        ata_acpi_handle_hotplug(dev->link->ap, dev, event);
 170}
 171
 172static void ata_acpi_ap_notify_dock(acpi_handle handle, u32 event, void *data)
 173{
 174        struct ata_port *ap = data;
 175
 176        ata_acpi_handle_hotplug(ap, NULL, event);
 177}
 178
 179static void ata_acpi_uevent(struct ata_port *ap, struct ata_device *dev,
 180        u32 event)
 181{
 182        struct kobject *kobj = NULL;
 183        char event_string[20];
 184        char *envp[] = { event_string, NULL };
 185
 186        if (dev) {
 187                if (dev->sdev)
 188                        kobj = &dev->sdev->sdev_gendev.kobj;
 189        } else
 190                kobj = &ap->dev->kobj;
 191
 192        if (kobj) {
 193                snprintf(event_string, 20, "BAY_EVENT=%d", event);
 194                kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
 195        }
 196}
 197
 198static void ata_acpi_ap_uevent(acpi_handle handle, u32 event, void *data)
 199{
 200        ata_acpi_uevent(data, NULL, event);
 201}
 202
 203static void ata_acpi_dev_uevent(acpi_handle handle, u32 event, void *data)
 204{
 205        struct ata_device *dev = data;
 206        ata_acpi_uevent(dev->link->ap, dev, event);
 207}
 208
 209static const struct acpi_dock_ops ata_acpi_dev_dock_ops = {
 210        .handler = ata_acpi_dev_notify_dock,
 211        .uevent = ata_acpi_dev_uevent,
 212};
 213
 214static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
 215        .handler = ata_acpi_ap_notify_dock,
 216        .uevent = ata_acpi_ap_uevent,
 217};
 218
 219void ata_acpi_hotplug_init(struct ata_host *host)
 220{
 221        int i;
 222
 223        for (i = 0; i < host->n_ports; i++) {
 224                struct ata_port *ap = host->ports[i];
 225                acpi_handle handle;
 226                struct ata_device *dev;
 227
 228                if (!ap)
 229                        continue;
 230
 231                handle = ata_ap_acpi_handle(ap);
 232                if (handle) {
 233                        /* we might be on a docking station */
 234                        register_hotplug_dock_device(handle,
 235                                                     &ata_acpi_ap_dock_ops, ap,
 236                                                     NULL, NULL);
 237                }
 238
 239                ata_for_each_dev(dev, &ap->link, ALL) {
 240                        handle = ata_dev_acpi_handle(dev);
 241                        if (!handle)
 242                                continue;
 243
 244                        /* we might be on a docking station */
 245                        register_hotplug_dock_device(handle,
 246                                                     &ata_acpi_dev_dock_ops,
 247                                                     dev, NULL, NULL);
 248                }
 249        }
 250}
 251
 252/**
 253 * ata_acpi_dissociate - dissociate ATA host from ACPI objects
 254 * @host: target ATA host
 255 *
 256 * This function is called during driver detach after the whole host
 257 * is shut down.
 258 *
 259 * LOCKING:
 260 * EH context.
 261 */
 262void ata_acpi_dissociate(struct ata_host *host)
 263{
 264        int i;
 265
 266        /* Restore initial _GTM values so that driver which attaches
 267         * afterward can use them too.
 268         */
 269        for (i = 0; i < host->n_ports; i++) {
 270                struct ata_port *ap = host->ports[i];
 271                const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
 272
 273                if (ata_ap_acpi_handle(ap) && gtm)
 274                        ata_acpi_stm(ap, gtm);
 275        }
 276}
 277
 278static int __ata_acpi_gtm(struct ata_port *ap, acpi_handle handle,
 279                          struct ata_acpi_gtm *gtm)
 280{
 281        struct acpi_buffer output = { .length = ACPI_ALLOCATE_BUFFER };
 282        union acpi_object *out_obj;
 283        acpi_status status;
 284        int rc = 0;
 285
 286        status = acpi_evaluate_object(handle, "_GTM", NULL, &output);
 287
 288        rc = -ENOENT;
 289        if (status == AE_NOT_FOUND)
 290                goto out_free;
 291
 292        rc = -EINVAL;
 293        if (ACPI_FAILURE(status)) {
 294                ata_port_err(ap, "ACPI get timing mode failed (AE 0x%x)\n",
 295                             status);
 296                goto out_free;
 297        }
 298
 299        out_obj = output.pointer;
 300        if (out_obj->type != ACPI_TYPE_BUFFER) {
 301                ata_port_warn(ap, "_GTM returned unexpected object type 0x%x\n",
 302                              out_obj->type);
 303
 304                goto out_free;
 305        }
 306
 307        if (out_obj->buffer.length != sizeof(struct ata_acpi_gtm)) {
 308                ata_port_err(ap, "_GTM returned invalid length %d\n",
 309                             out_obj->buffer.length);
 310                goto out_free;
 311        }
 312
 313        memcpy(gtm, out_obj->buffer.pointer, sizeof(struct ata_acpi_gtm));
 314        rc = 0;
 315 out_free:
 316        kfree(output.pointer);
 317        return rc;
 318}
 319
 320/**
 321 * ata_acpi_gtm - execute _GTM
 322 * @ap: target ATA port
 323 * @gtm: out parameter for _GTM result
 324 *
 325 * Evaluate _GTM and store the result in @gtm.
 326 *
 327 * LOCKING:
 328 * EH context.
 329 *
 330 * RETURNS:
 331 * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure.
 332 */
 333int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)
 334{
 335        if (ata_ap_acpi_handle(ap))
 336                return __ata_acpi_gtm(ap, ata_ap_acpi_handle(ap), gtm);
 337        else
 338                return -EINVAL;
 339}
 340
 341EXPORT_SYMBOL_GPL(ata_acpi_gtm);
 342
 343/**
 344 * ata_acpi_stm - execute _STM
 345 * @ap: target ATA port
 346 * @stm: timing parameter to _STM
 347 *
 348 * Evaluate _STM with timing parameter @stm.
 349 *
 350 * LOCKING:
 351 * EH context.
 352 *
 353 * RETURNS:
 354 * 0 on success, -ENOENT if _STM doesn't exist, -errno on failure.
 355 */
 356int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm)
 357{
 358        acpi_status status;
 359        struct ata_acpi_gtm             stm_buf = *stm;
 360        struct acpi_object_list         input;
 361        union acpi_object               in_params[3];
 362
 363        in_params[0].type = ACPI_TYPE_BUFFER;
 364        in_params[0].buffer.length = sizeof(struct ata_acpi_gtm);
 365        in_params[0].buffer.pointer = (u8 *)&stm_buf;
 366        /* Buffers for id may need byteswapping ? */
 367        in_params[1].type = ACPI_TYPE_BUFFER;
 368        in_params[1].buffer.length = 512;
 369        in_params[1].buffer.pointer = (u8 *)ap->link.device[0].id;
 370        in_params[2].type = ACPI_TYPE_BUFFER;
 371        in_params[2].buffer.length = 512;
 372        in_params[2].buffer.pointer = (u8 *)ap->link.device[1].id;
 373
 374        input.count = 3;
 375        input.pointer = in_params;
 376
 377        status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_STM", &input,
 378                                      NULL);
 379
 380        if (status == AE_NOT_FOUND)
 381                return -ENOENT;
 382        if (ACPI_FAILURE(status)) {
 383                ata_port_err(ap, "ACPI set timing mode failed (status=0x%x)\n",
 384                             status);
 385                return -EINVAL;
 386        }
 387        return 0;
 388}
 389
 390EXPORT_SYMBOL_GPL(ata_acpi_stm);
 391
 392/**
 393 * ata_dev_get_GTF - get the drive bootup default taskfile settings
 394 * @dev: target ATA device
 395 * @gtf: output parameter for buffer containing _GTF taskfile arrays
 396 *
 397 * This applies to both PATA and SATA drives.
 398 *
 399 * The _GTF method has no input parameters.
 400 * It returns a variable number of register set values (registers
 401 * hex 1F1..1F7, taskfiles).
 402 * The <variable number> is not known in advance, so have ACPI-CA
 403 * allocate the buffer as needed and return it, then free it later.
 404 *
 405 * LOCKING:
 406 * EH context.
 407 *
 408 * RETURNS:
 409 * Number of taskfiles on success, 0 if _GTF doesn't exist.  -EINVAL
 410 * if _GTF is invalid.
 411 */
 412static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
 413{
 414        struct ata_port *ap = dev->link->ap;
 415        acpi_status status;
 416        struct acpi_buffer output;
 417        union acpi_object *out_obj;
 418        int rc = 0;
 419
 420        /* if _GTF is cached, use the cached value */
 421        if (dev->gtf_cache) {
 422                out_obj = dev->gtf_cache;
 423                goto done;
 424        }
 425
 426        /* set up output buffer */
 427        output.length = ACPI_ALLOCATE_BUFFER;
 428        output.pointer = NULL;  /* ACPI-CA sets this; save/free it later */
 429
 430        if (ata_msg_probe(ap))
 431                ata_dev_dbg(dev, "%s: ENTER: port#: %d\n",
 432                            __func__, ap->port_no);
 433
 434        /* _GTF has no input parameters */
 435        status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_GTF", NULL,
 436                                      &output);
 437        out_obj = dev->gtf_cache = output.pointer;
 438
 439        if (ACPI_FAILURE(status)) {
 440                if (status != AE_NOT_FOUND) {
 441                        ata_dev_warn(dev, "_GTF evaluation failed (AE 0x%x)\n",
 442                                     status);
 443                        rc = -EINVAL;
 444                }
 445                goto out_free;
 446        }
 447
 448        if (!output.length || !output.pointer) {
 449                if (ata_msg_probe(ap))
 450                        ata_dev_dbg(dev, "%s: Run _GTF: length or ptr is NULL (0x%llx, 0x%p)\n",
 451                                    __func__,
 452                                    (unsigned long long)output.length,
 453                                    output.pointer);
 454                rc = -EINVAL;
 455                goto out_free;
 456        }
 457
 458        if (out_obj->type != ACPI_TYPE_BUFFER) {
 459                ata_dev_warn(dev, "_GTF unexpected object type 0x%x\n",
 460                             out_obj->type);
 461                rc = -EINVAL;
 462                goto out_free;
 463        }
 464
 465        if (out_obj->buffer.length % REGS_PER_GTF) {
 466                ata_dev_warn(dev, "unexpected _GTF length (%d)\n",
 467                             out_obj->buffer.length);
 468                rc = -EINVAL;
 469                goto out_free;
 470        }
 471
 472 done:
 473        rc = out_obj->buffer.length / REGS_PER_GTF;
 474        if (gtf) {
 475                *gtf = (void *)out_obj->buffer.pointer;
 476                if (ata_msg_probe(ap))
 477                        ata_dev_dbg(dev, "%s: returning gtf=%p, gtf_count=%d\n",
 478                                    __func__, *gtf, rc);
 479        }
 480        return rc;
 481
 482 out_free:
 483        ata_acpi_clear_gtf(dev);
 484        return rc;
 485}
 486
 487/**
 488 * ata_acpi_gtm_xfermode - determine xfermode from GTM parameter
 489 * @dev: target device
 490 * @gtm: GTM parameter to use
 491 *
 492 * Determine xfermask for @dev from @gtm.
 493 *
 494 * LOCKING:
 495 * None.
 496 *
 497 * RETURNS:
 498 * Determined xfermask.
 499 */
 500unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
 501                                    const struct ata_acpi_gtm *gtm)
 502{
 503        unsigned long xfer_mask = 0;
 504        unsigned int type;
 505        int unit;
 506        u8 mode;
 507
 508        /* we always use the 0 slot for crap hardware */
 509        unit = dev->devno;
 510        if (!(gtm->flags & 0x10))
 511                unit = 0;
 512
 513        /* PIO */
 514        mode = ata_timing_cycle2mode(ATA_SHIFT_PIO, gtm->drive[unit].pio);
 515        xfer_mask |= ata_xfer_mode2mask(mode);
 516
 517        /* See if we have MWDMA or UDMA data. We don't bother with
 518         * MWDMA if UDMA is available as this means the BIOS set UDMA
 519         * and our error changedown if it works is UDMA to PIO anyway.
 520         */
 521        if (!(gtm->flags & (1 << (2 * unit))))
 522                type = ATA_SHIFT_MWDMA;
 523        else
 524                type = ATA_SHIFT_UDMA;
 525
 526        mode = ata_timing_cycle2mode(type, gtm->drive[unit].dma);
 527        xfer_mask |= ata_xfer_mode2mask(mode);
 528
 529        return xfer_mask;
 530}
 531EXPORT_SYMBOL_GPL(ata_acpi_gtm_xfermask);
 532
 533/**
 534 * ata_acpi_cbl_80wire          -       Check for 80 wire cable
 535 * @ap: Port to check
 536 * @gtm: GTM data to use
 537 *
 538 * Return 1 if the @gtm indicates the BIOS selected an 80wire mode.
 539 */
 540int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm)
 541{
 542        struct ata_device *dev;
 543
 544        ata_for_each_dev(dev, &ap->link, ENABLED) {
 545                unsigned long xfer_mask, udma_mask;
 546
 547                xfer_mask = ata_acpi_gtm_xfermask(dev, gtm);
 548                ata_unpack_xfermask(xfer_mask, NULL, NULL, &udma_mask);
 549
 550                if (udma_mask & ~ATA_UDMA_MASK_40C)
 551                        return 1;
 552        }
 553
 554        return 0;
 555}
 556EXPORT_SYMBOL_GPL(ata_acpi_cbl_80wire);
 557
 558static void ata_acpi_gtf_to_tf(struct ata_device *dev,
 559                               const struct ata_acpi_gtf *gtf,
 560                               struct ata_taskfile *tf)
 561{
 562        ata_tf_init(dev, tf);
 563
 564        tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 565        tf->protocol = ATA_PROT_NODATA;
 566        tf->feature = gtf->tf[0];       /* 0x1f1 */
 567        tf->nsect   = gtf->tf[1];       /* 0x1f2 */
 568        tf->lbal    = gtf->tf[2];       /* 0x1f3 */
 569        tf->lbam    = gtf->tf[3];       /* 0x1f4 */
 570        tf->lbah    = gtf->tf[4];       /* 0x1f5 */
 571        tf->device  = gtf->tf[5];       /* 0x1f6 */
 572        tf->command = gtf->tf[6];       /* 0x1f7 */
 573}
 574
 575static int ata_acpi_filter_tf(struct ata_device *dev,
 576                              const struct ata_taskfile *tf,
 577                              const struct ata_taskfile *ptf)
 578{
 579        if (dev->gtf_filter & ATA_ACPI_FILTER_SETXFER) {
 580                /* libata doesn't use ACPI to configure transfer mode.
 581                 * It will only confuse device configuration.  Skip.
 582                 */
 583                if (tf->command == ATA_CMD_SET_FEATURES &&
 584                    tf->feature == SETFEATURES_XFER)
 585                        return 1;
 586        }
 587
 588        if (dev->gtf_filter & ATA_ACPI_FILTER_LOCK) {
 589                /* BIOS writers, sorry but we don't wanna lock
 590                 * features unless the user explicitly said so.
 591                 */
 592
 593                /* DEVICE CONFIGURATION FREEZE LOCK */
 594                if (tf->command == ATA_CMD_CONF_OVERLAY &&
 595                    tf->feature == ATA_DCO_FREEZE_LOCK)
 596                        return 1;
 597
 598                /* SECURITY FREEZE LOCK */
 599                if (tf->command == ATA_CMD_SEC_FREEZE_LOCK)
 600                        return 1;
 601
 602                /* SET MAX LOCK and SET MAX FREEZE LOCK */
 603                if ((!ptf || ptf->command != ATA_CMD_READ_NATIVE_MAX) &&
 604                    tf->command == ATA_CMD_SET_MAX &&
 605                    (tf->feature == ATA_SET_MAX_LOCK ||
 606                     tf->feature == ATA_SET_MAX_FREEZE_LOCK))
 607                        return 1;
 608        }
 609
 610        if (tf->command == ATA_CMD_SET_FEATURES &&
 611            tf->feature == SETFEATURES_SATA_ENABLE) {
 612                /* inhibit enabling DIPM */
 613                if (dev->gtf_filter & ATA_ACPI_FILTER_DIPM &&
 614                    tf->nsect == SATA_DIPM)
 615                        return 1;
 616
 617                /* inhibit FPDMA non-zero offset */
 618                if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET &&
 619                    (tf->nsect == SATA_FPDMA_OFFSET ||
 620                     tf->nsect == SATA_FPDMA_IN_ORDER))
 621                        return 1;
 622
 623                /* inhibit FPDMA auto activation */
 624                if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_AA &&
 625                    tf->nsect == SATA_FPDMA_AA)
 626                        return 1;
 627        }
 628
 629        return 0;
 630}
 631
 632/**
 633 * ata_acpi_run_tf - send taskfile registers to host controller
 634 * @dev: target ATA device
 635 * @gtf: raw ATA taskfile register set (0x1f1 - 0x1f7)
 636 *
 637 * Outputs ATA taskfile to standard ATA host controller.
 638 * Writes the control, feature, nsect, lbal, lbam, and lbah registers.
 639 * Optionally (ATA_TFLAG_LBA48) writes hob_feature, hob_nsect,
 640 * hob_lbal, hob_lbam, and hob_lbah.
 641 *
 642 * This function waits for idle (!BUSY and !DRQ) after writing
 643 * registers.  If the control register has a new value, this
 644 * function also waits for idle after writing control and before
 645 * writing the remaining registers.
 646 *
 647 * LOCKING:
 648 * EH context.
 649 *
 650 * RETURNS:
 651 * 1 if command is executed successfully.  0 if ignored, rejected or
 652 * filtered out, -errno on other errors.
 653 */
 654static int ata_acpi_run_tf(struct ata_device *dev,
 655                           const struct ata_acpi_gtf *gtf,
 656                           const struct ata_acpi_gtf *prev_gtf)
 657{
 658        struct ata_taskfile *pptf = NULL;
 659        struct ata_taskfile tf, ptf, rtf;
 660        unsigned int err_mask;
 661        const char *level;
 662        const char *descr;
 663        char msg[60];
 664        int rc;
 665
 666        if ((gtf->tf[0] == 0) && (gtf->tf[1] == 0) && (gtf->tf[2] == 0)
 667            && (gtf->tf[3] == 0) && (gtf->tf[4] == 0) && (gtf->tf[5] == 0)
 668            && (gtf->tf[6] == 0))
 669                return 0;
 670
 671        ata_acpi_gtf_to_tf(dev, gtf, &tf);
 672        if (prev_gtf) {
 673                ata_acpi_gtf_to_tf(dev, prev_gtf, &ptf);
 674                pptf = &ptf;
 675        }
 676
 677        if (!ata_acpi_filter_tf(dev, &tf, pptf)) {
 678                rtf = tf;
 679                err_mask = ata_exec_internal(dev, &rtf, NULL,
 680                                             DMA_NONE, NULL, 0, 0);
 681
 682                switch (err_mask) {
 683                case 0:
 684                        level = KERN_DEBUG;
 685                        snprintf(msg, sizeof(msg), "succeeded");
 686                        rc = 1;
 687                        break;
 688
 689                case AC_ERR_DEV:
 690                        level = KERN_INFO;
 691                        snprintf(msg, sizeof(msg),
 692                                 "rejected by device (Stat=0x%02x Err=0x%02x)",
 693                                 rtf.command, rtf.feature);
 694                        rc = 0;
 695                        break;
 696
 697                default:
 698                        level = KERN_ERR;
 699                        snprintf(msg, sizeof(msg),
 700                                 "failed (Emask=0x%x Stat=0x%02x Err=0x%02x)",
 701                                 err_mask, rtf.command, rtf.feature);
 702                        rc = -EIO;
 703                        break;
 704                }
 705        } else {
 706                level = KERN_INFO;
 707                snprintf(msg, sizeof(msg), "filtered out");
 708                rc = 0;
 709        }
 710        descr = ata_get_cmd_descript(tf.command);
 711
 712        ata_dev_printk(dev, level,
 713                       "ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x (%s) %s\n",
 714                       tf.command, tf.feature, tf.nsect, tf.lbal,
 715                       tf.lbam, tf.lbah, tf.device,
 716                       (descr ? descr : "unknown"), msg);
 717
 718        return rc;
 719}
 720
 721/**
 722 * ata_acpi_exec_tfs - get then write drive taskfile settings
 723 * @dev: target ATA device
 724 * @nr_executed: out parameter for the number of executed commands
 725 *
 726 * Evaluate _GTF and execute returned taskfiles.
 727 *
 728 * LOCKING:
 729 * EH context.
 730 *
 731 * RETURNS:
 732 * Number of executed taskfiles on success, 0 if _GTF doesn't exist.
 733 * -errno on other errors.
 734 */
 735static int ata_acpi_exec_tfs(struct ata_device *dev, int *nr_executed)
 736{
 737        struct ata_acpi_gtf *gtf = NULL, *pgtf = NULL;
 738        int gtf_count, i, rc;
 739
 740        /* get taskfiles */
 741        rc = ata_dev_get_GTF(dev, &gtf);
 742        if (rc < 0)
 743                return rc;
 744        gtf_count = rc;
 745
 746        /* execute them */
 747        for (i = 0; i < gtf_count; i++, gtf++) {
 748                rc = ata_acpi_run_tf(dev, gtf, pgtf);
 749                if (rc < 0)
 750                        break;
 751                if (rc) {
 752                        (*nr_executed)++;
 753                        pgtf = gtf;
 754                }
 755        }
 756
 757        ata_acpi_clear_gtf(dev);
 758
 759        if (rc < 0)
 760                return rc;
 761        return 0;
 762}
 763
 764/**
 765 * ata_acpi_push_id - send Identify data to drive
 766 * @dev: target ATA device
 767 *
 768 * _SDD ACPI object: for SATA mode only
 769 * Must be after Identify (Packet) Device -- uses its data
 770 * ATM this function never returns a failure.  It is an optional
 771 * method and if it fails for whatever reason, we should still
 772 * just keep going.
 773 *
 774 * LOCKING:
 775 * EH context.
 776 *
 777 * RETURNS:
 778 * 0 on success, -ENOENT if _SDD doesn't exist, -errno on failure.
 779 */
 780static int ata_acpi_push_id(struct ata_device *dev)
 781{
 782        struct ata_port *ap = dev->link->ap;
 783        acpi_status status;
 784        struct acpi_object_list input;
 785        union acpi_object in_params[1];
 786
 787        if (ata_msg_probe(ap))
 788                ata_dev_dbg(dev, "%s: ix = %d, port#: %d\n",
 789                            __func__, dev->devno, ap->port_no);
 790
 791        /* Give the drive Identify data to the drive via the _SDD method */
 792        /* _SDD: set up input parameters */
 793        input.count = 1;
 794        input.pointer = in_params;
 795        in_params[0].type = ACPI_TYPE_BUFFER;
 796        in_params[0].buffer.length = sizeof(dev->id[0]) * ATA_ID_WORDS;
 797        in_params[0].buffer.pointer = (u8 *)dev->id;
 798        /* Output buffer: _SDD has no output */
 799
 800        /* It's OK for _SDD to be missing too. */
 801        swap_buf_le16(dev->id, ATA_ID_WORDS);
 802        status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_SDD", &input,
 803                                      NULL);
 804        swap_buf_le16(dev->id, ATA_ID_WORDS);
 805
 806        if (status == AE_NOT_FOUND)
 807                return -ENOENT;
 808
 809        if (ACPI_FAILURE(status)) {
 810                ata_dev_warn(dev, "ACPI _SDD failed (AE 0x%x)\n", status);
 811                return -EIO;
 812        }
 813
 814        return 0;
 815}
 816
 817/**
 818 * ata_acpi_on_suspend - ATA ACPI hook called on suspend
 819 * @ap: target ATA port
 820 *
 821 * This function is called when @ap is about to be suspended.  All
 822 * devices are already put to sleep but the port_suspend() callback
 823 * hasn't been executed yet.  Error return from this function aborts
 824 * suspend.
 825 *
 826 * LOCKING:
 827 * EH context.
 828 *
 829 * RETURNS:
 830 * 0 on success, -errno on failure.
 831 */
 832int ata_acpi_on_suspend(struct ata_port *ap)
 833{
 834        /* nada */
 835        return 0;
 836}
 837
 838/**
 839 * ata_acpi_on_resume - ATA ACPI hook called on resume
 840 * @ap: target ATA port
 841 *
 842 * This function is called when @ap is resumed - right after port
 843 * itself is resumed but before any EH action is taken.
 844 *
 845 * LOCKING:
 846 * EH context.
 847 */
 848void ata_acpi_on_resume(struct ata_port *ap)
 849{
 850        const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
 851        struct ata_device *dev;
 852
 853        if (ata_ap_acpi_handle(ap) && gtm) {
 854                /* _GTM valid */
 855
 856                /* restore timing parameters */
 857                ata_acpi_stm(ap, gtm);
 858
 859                /* _GTF should immediately follow _STM so that it can
 860                 * use values set by _STM.  Cache _GTF result and
 861                 * schedule _GTF.
 862                 */
 863                ata_for_each_dev(dev, &ap->link, ALL) {
 864                        ata_acpi_clear_gtf(dev);
 865                        if (ata_dev_enabled(dev) &&
 866                            ata_dev_get_GTF(dev, NULL) >= 0)
 867                                dev->flags |= ATA_DFLAG_ACPI_PENDING;
 868                }
 869        } else {
 870                /* SATA _GTF needs to be evaulated after _SDD and
 871                 * there's no reason to evaluate IDE _GTF early
 872                 * without _STM.  Clear cache and schedule _GTF.
 873                 */
 874                ata_for_each_dev(dev, &ap->link, ALL) {
 875                        ata_acpi_clear_gtf(dev);
 876                        if (ata_dev_enabled(dev))
 877                                dev->flags |= ATA_DFLAG_ACPI_PENDING;
 878                }
 879        }
 880}
 881
 882static int ata_acpi_choose_suspend_state(struct ata_device *dev, bool runtime)
 883{
 884        int d_max_in = ACPI_STATE_D3_COLD;
 885        if (!runtime)
 886                goto out;
 887
 888        /*
 889         * For ATAPI, runtime D3 cold is only allowed
 890         * for ZPODD in zero power ready state
 891         */
 892        if (dev->class == ATA_DEV_ATAPI &&
 893            !(zpodd_dev_enabled(dev) && zpodd_zpready(dev)))
 894                d_max_in = ACPI_STATE_D3_HOT;
 895
 896out:
 897        return acpi_pm_device_sleep_state(&dev->sdev->sdev_gendev,
 898                                          NULL, d_max_in);
 899}
 900
 901static void sata_acpi_set_state(struct ata_port *ap, pm_message_t state)
 902{
 903        bool runtime = PMSG_IS_AUTO(state);
 904        struct ata_device *dev;
 905        acpi_handle handle;
 906        int acpi_state;
 907
 908        ata_for_each_dev(dev, &ap->link, ENABLED) {
 909                handle = ata_dev_acpi_handle(dev);
 910                if (!handle)
 911                        continue;
 912
 913                if (!(state.event & PM_EVENT_RESUME)) {
 914                        acpi_state = ata_acpi_choose_suspend_state(dev, runtime);
 915                        if (acpi_state == ACPI_STATE_D0)
 916                                continue;
 917                        if (runtime && zpodd_dev_enabled(dev) &&
 918                            acpi_state == ACPI_STATE_D3_COLD)
 919                                zpodd_enable_run_wake(dev);
 920                        acpi_bus_set_power(handle, acpi_state);
 921                } else {
 922                        if (runtime && zpodd_dev_enabled(dev))
 923                                zpodd_disable_run_wake(dev);
 924                        acpi_bus_set_power(handle, ACPI_STATE_D0);
 925                }
 926        }
 927}
 928
 929/* ACPI spec requires _PS0 when IDE power on and _PS3 when power off */
 930static void pata_acpi_set_state(struct ata_port *ap, pm_message_t state)
 931{
 932        struct ata_device *dev;
 933        acpi_handle port_handle;
 934
 935        port_handle = ata_ap_acpi_handle(ap);
 936        if (!port_handle)
 937                return;
 938
 939        /* channel first and then drives for power on and vica versa
 940           for power off */
 941        if (state.event & PM_EVENT_RESUME)
 942                acpi_bus_set_power(port_handle, ACPI_STATE_D0);
 943
 944        ata_for_each_dev(dev, &ap->link, ENABLED) {
 945                acpi_handle dev_handle = ata_dev_acpi_handle(dev);
 946                if (!dev_handle)
 947                        continue;
 948
 949                acpi_bus_set_power(dev_handle, state.event & PM_EVENT_RESUME ?
 950                                                ACPI_STATE_D0 : ACPI_STATE_D3);
 951        }
 952
 953        if (!(state.event & PM_EVENT_RESUME))
 954                acpi_bus_set_power(port_handle, ACPI_STATE_D3);
 955}
 956
 957/**
 958 * ata_acpi_set_state - set the port power state
 959 * @ap: target ATA port
 960 * @state: state, on/off
 961 *
 962 * This function sets a proper ACPI D state for the device on
 963 * system and runtime PM operations.
 964 */
 965void ata_acpi_set_state(struct ata_port *ap, pm_message_t state)
 966{
 967        if (ap->flags & ATA_FLAG_ACPI_SATA)
 968                sata_acpi_set_state(ap, state);
 969        else
 970                pata_acpi_set_state(ap, state);
 971}
 972
 973/**
 974 * ata_acpi_on_devcfg - ATA ACPI hook called on device donfiguration
 975 * @dev: target ATA device
 976 *
 977 * This function is called when @dev is about to be configured.
 978 * IDENTIFY data might have been modified after this hook is run.
 979 *
 980 * LOCKING:
 981 * EH context.
 982 *
 983 * RETURNS:
 984 * Positive number if IDENTIFY data needs to be refreshed, 0 if not,
 985 * -errno on failure.
 986 */
 987int ata_acpi_on_devcfg(struct ata_device *dev)
 988{
 989        struct ata_port *ap = dev->link->ap;
 990        struct ata_eh_context *ehc = &ap->link.eh_context;
 991        int acpi_sata = ap->flags & ATA_FLAG_ACPI_SATA;
 992        int nr_executed = 0;
 993        int rc;
 994
 995        if (!ata_dev_acpi_handle(dev))
 996                return 0;
 997
 998        /* do we need to do _GTF? */
 999        if (!(dev->flags & ATA_DFLAG_ACPI_PENDING) &&
1000            !(acpi_sata && (ehc->i.flags & ATA_EHI_DID_HARDRESET)))
1001                return 0;
1002
1003        /* do _SDD if SATA */
1004        if (acpi_sata) {
1005                rc = ata_acpi_push_id(dev);
1006                if (rc && rc != -ENOENT)
1007                        goto acpi_err;
1008        }
1009
1010        /* do _GTF */
1011        rc = ata_acpi_exec_tfs(dev, &nr_executed);
1012        if (rc)
1013                goto acpi_err;
1014
1015        dev->flags &= ~ATA_DFLAG_ACPI_PENDING;
1016
1017        /* refresh IDENTIFY page if any _GTF command has been executed */
1018        if (nr_executed) {
1019                rc = ata_dev_reread_id(dev, 0);
1020                if (rc < 0) {
1021                        ata_dev_err(dev,
1022                                    "failed to IDENTIFY after ACPI commands\n");
1023                        return rc;
1024                }
1025        }
1026
1027        return 0;
1028
1029 acpi_err:
1030        /* ignore evaluation failure if we can continue safely */
1031        if (rc == -EINVAL && !nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN))
1032                return 0;
1033
1034        /* fail and let EH retry once more for unknown IO errors */
1035        if (!(dev->flags & ATA_DFLAG_ACPI_FAILED)) {
1036                dev->flags |= ATA_DFLAG_ACPI_FAILED;
1037                return rc;
1038        }
1039
1040        dev->flags |= ATA_DFLAG_ACPI_DISABLED;
1041        ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
1042
1043        /* We can safely continue if no _GTF command has been executed
1044         * and port is not frozen.
1045         */
1046        if (!nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN))
1047                return 0;
1048
1049        return rc;
1050}
1051
1052/**
1053 * ata_acpi_on_disable - ATA ACPI hook called when a device is disabled
1054 * @dev: target ATA device
1055 *
1056 * This function is called when @dev is about to be disabled.
1057 *
1058 * LOCKING:
1059 * EH context.
1060 */
1061void ata_acpi_on_disable(struct ata_device *dev)
1062{
1063        ata_acpi_clear_gtf(dev);
1064}
1065
1066static int compat_pci_ata(struct ata_port *ap)
1067{
1068        struct device *dev = ap->tdev.parent;
1069        struct pci_dev *pdev;
1070
1071        if (!is_pci_dev(dev))
1072                return 0;
1073
1074        pdev = to_pci_dev(dev);
1075
1076        if ((pdev->class >> 8) != PCI_CLASS_STORAGE_SATA &&
1077            (pdev->class >> 8) != PCI_CLASS_STORAGE_IDE)
1078                return 0;
1079
1080        return 1;
1081}
1082
1083static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle)
1084{
1085        if (libata_noacpi || ap->flags & ATA_FLAG_ACPI_SATA)
1086                return -ENODEV;
1087
1088        *handle = acpi_get_child(DEVICE_ACPI_HANDLE(ap->tdev.parent),
1089                        ap->port_no);
1090
1091        if (!*handle)
1092                return -ENODEV;
1093
1094        if (__ata_acpi_gtm(ap, *handle, &ap->__acpi_init_gtm) == 0)
1095                ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
1096
1097        return 0;
1098}
1099
1100static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
1101                                acpi_handle *handle)
1102{
1103        struct ata_device *ata_dev;
1104
1105        if (ap->flags & ATA_FLAG_ACPI_SATA) {
1106                if (!sata_pmp_attached(ap))
1107                        ata_dev = &ap->link.device[sdev->id];
1108                else
1109                        ata_dev = &ap->pmp_link[sdev->channel].device[sdev->id];
1110        }
1111        else {
1112                ata_dev = &ap->link.device[sdev->id];
1113        }
1114
1115        *handle = ata_dev_acpi_handle(ata_dev);
1116
1117        if (!*handle)
1118                return -ENODEV;
1119
1120        return 0;
1121}
1122
1123static int is_ata_port(const struct device *dev)
1124{
1125        return dev->type == &ata_port_type;
1126}
1127
1128static struct ata_port *dev_to_ata_port(struct device *dev)
1129{
1130        while (!is_ata_port(dev)) {
1131                if (!dev->parent)
1132                        return NULL;
1133                dev = dev->parent;
1134        }
1135        return to_ata_port(dev);
1136}
1137
1138static int ata_acpi_find_device(struct device *dev, acpi_handle *handle)
1139{
1140        struct ata_port *ap = dev_to_ata_port(dev);
1141
1142        if (!ap)
1143                return -ENODEV;
1144
1145        if (!compat_pci_ata(ap))
1146                return -ENODEV;
1147
1148        if (scsi_is_host_device(dev))
1149                return ata_acpi_bind_host(ap, handle);
1150        else if (scsi_is_sdev_device(dev)) {
1151                struct scsi_device *sdev = to_scsi_device(dev);
1152
1153                return ata_acpi_bind_device(ap, sdev, handle);
1154        } else
1155                return -ENODEV;
1156}
1157
1158static struct acpi_bus_type ata_acpi_bus = {
1159        .name = "ATA",
1160        .find_device = ata_acpi_find_device,
1161};
1162
1163int ata_acpi_register(void)
1164{
1165        return scsi_register_acpi_bus_type(&ata_acpi_bus);
1166}
1167
1168void ata_acpi_unregister(void)
1169{
1170        scsi_unregister_acpi_bus_type(&ata_acpi_bus);
1171}
1172
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.