OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [ata/] [libata-acpi.c] - Blame information for rev 79

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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 <scsi/scsi_device.h>
19
#include "libata.h"
20
 
21
#include <acpi/acpi_bus.h>
22
#include <acpi/acnames.h>
23
#include <acpi/acnamesp.h>
24
#include <acpi/acparser.h>
25
#include <acpi/acexcep.h>
26
#include <acpi/acmacros.h>
27
#include <acpi/actypes.h>
28
 
29
enum {
30
        ATA_ACPI_FILTER_SETXFER = 1 << 0,
31
        ATA_ACPI_FILTER_LOCK    = 1 << 1,
32
 
33
        ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER |
34
                                  ATA_ACPI_FILTER_LOCK,
35
};
36
 
37
static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT;
38
module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644);
39
MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock)");
40
 
41
#define NO_PORT_MULT            0xffff
42
#define SATA_ADR(root, pmp)     (((root) << 16) | (pmp))
43
 
44
#define REGS_PER_GTF            7
45
struct ata_acpi_gtf {
46
        u8      tf[REGS_PER_GTF];       /* regs. 0x1f1 - 0x1f7 */
47
} __packed;
48
 
49
/*
50
 *      Helper - belongs in the PCI layer somewhere eventually
51
 */
52
static int is_pci_dev(struct device *dev)
53
{
54
        return (dev->bus == &pci_bus_type);
55
}
56
 
57
static void ata_acpi_clear_gtf(struct ata_device *dev)
58
{
59
        kfree(dev->gtf_cache);
60
        dev->gtf_cache = NULL;
61
}
62
 
63
/**
64
 * ata_acpi_associate_sata_port - associate SATA port with ACPI objects
65
 * @ap: target SATA port
66
 *
67
 * Look up ACPI objects associated with @ap and initialize acpi_handle
68
 * fields of @ap, the port and devices accordingly.
69
 *
70
 * LOCKING:
71
 * EH context.
72
 *
73
 * RETURNS:
74
 * 0 on success, -errno on failure.
75
 */
76
void ata_acpi_associate_sata_port(struct ata_port *ap)
77
{
78
        WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
79
 
80
        if (!ap->nr_pmp_links) {
81
                acpi_integer adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
82
 
83
                ap->link.device->acpi_handle =
84
                        acpi_get_child(ap->host->acpi_handle, adr);
85
        } else {
86
                struct ata_link *link;
87
 
88
                ap->link.device->acpi_handle = NULL;
89
 
90
                ata_port_for_each_link(link, ap) {
91
                        acpi_integer adr = SATA_ADR(ap->port_no, link->pmp);
92
 
93
                        link->device->acpi_handle =
94
                                acpi_get_child(ap->host->acpi_handle, adr);
95
                }
96
        }
97
}
98
 
99
static void ata_acpi_associate_ide_port(struct ata_port *ap)
100
{
101
        int max_devices, i;
102
 
103
        ap->acpi_handle = acpi_get_child(ap->host->acpi_handle, ap->port_no);
104
        if (!ap->acpi_handle)
105
                return;
106
 
107
        max_devices = 1;
108
        if (ap->flags & ATA_FLAG_SLAVE_POSS)
109
                max_devices++;
110
 
111
        for (i = 0; i < max_devices; i++) {
112
                struct ata_device *dev = &ap->link.device[i];
113
 
114
                dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
115
        }
116
 
117
        if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0)
118
                ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
119
}
120
 
121
static void ata_acpi_handle_hotplug(struct ata_port *ap, struct kobject *kobj,
122
                                    u32 event)
123
{
124
        char event_string[12];
125
        char *envp[] = { event_string, NULL };
126
        struct ata_eh_info *ehi = &ap->link.eh_info;
127
 
128
        if (event == 0 || event == 1) {
129
               unsigned long flags;
130
               spin_lock_irqsave(ap->lock, flags);
131
               ata_ehi_clear_desc(ehi);
132
               ata_ehi_push_desc(ehi, "ACPI event");
133
               ata_ehi_hotplugged(ehi);
134
               ata_port_freeze(ap);
135
               spin_unlock_irqrestore(ap->lock, flags);
136
        }
137
 
138
        if (kobj) {
139
                sprintf(event_string, "BAY_EVENT=%d", event);
140
                kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
141
        }
142
}
143
 
144
static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
145
{
146
        struct ata_device *dev = data;
147
        struct kobject *kobj = NULL;
148
 
149
        if (dev->sdev)
150
                kobj = &dev->sdev->sdev_gendev.kobj;
151
 
152
        ata_acpi_handle_hotplug(dev->link->ap, kobj, event);
153
}
154
 
155
static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data)
156
{
157
        struct ata_port *ap = data;
158
 
159
        ata_acpi_handle_hotplug(ap, &ap->dev->kobj, event);
160
}
161
 
162
/**
163
 * ata_acpi_associate - associate ATA host with ACPI objects
164
 * @host: target ATA host
165
 *
166
 * Look up ACPI objects associated with @host and initialize
167
 * acpi_handle fields of @host, its ports and devices accordingly.
168
 *
169
 * LOCKING:
170
 * EH context.
171
 *
172
 * RETURNS:
173
 * 0 on success, -errno on failure.
174
 */
175
void ata_acpi_associate(struct ata_host *host)
176
{
177
        int i, j;
178
 
179
        if (!is_pci_dev(host->dev) || libata_noacpi)
180
                return;
181
 
182
        host->acpi_handle = DEVICE_ACPI_HANDLE(host->dev);
183
        if (!host->acpi_handle)
184
                return;
185
 
186
        for (i = 0; i < host->n_ports; i++) {
187
                struct ata_port *ap = host->ports[i];
188
 
189
                if (host->ports[0]->flags & ATA_FLAG_ACPI_SATA)
190
                        ata_acpi_associate_sata_port(ap);
191
                else
192
                        ata_acpi_associate_ide_port(ap);
193
 
194
                if (ap->acpi_handle)
195
                        acpi_install_notify_handler (ap->acpi_handle,
196
                                                     ACPI_SYSTEM_NOTIFY,
197
                                                     ata_acpi_ap_notify,
198
                                                     ap);
199
 
200
                for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
201
                        struct ata_device *dev = &ap->link.device[j];
202
 
203
                        if (dev->acpi_handle)
204
                                acpi_install_notify_handler (dev->acpi_handle,
205
                                                             ACPI_SYSTEM_NOTIFY,
206
                                                             ata_acpi_dev_notify,
207
                                                             dev);
208
                }
209
        }
210
}
211
 
212
/**
213
 * ata_acpi_dissociate - dissociate ATA host from ACPI objects
214
 * @host: target ATA host
215
 *
216
 * This function is called during driver detach after the whole host
217
 * is shut down.
218
 *
219
 * LOCKING:
220
 * EH context.
221
 */
222
void ata_acpi_dissociate(struct ata_host *host)
223
{
224
        int i;
225
 
226
        /* Restore initial _GTM values so that driver which attaches
227
         * afterward can use them too.
228
         */
229
        for (i = 0; i < host->n_ports; i++) {
230
                struct ata_port *ap = host->ports[i];
231
                const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
232
 
233
                if (ap->acpi_handle && gtm)
234
                        ata_acpi_stm(ap, gtm);
235
        }
236
}
237
 
238
/**
239
 * ata_acpi_gtm - execute _GTM
240
 * @ap: target ATA port
241
 * @gtm: out parameter for _GTM result
242
 *
243
 * Evaluate _GTM and store the result in @gtm.
244
 *
245
 * LOCKING:
246
 * EH context.
247
 *
248
 * RETURNS:
249
 * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure.
250
 */
251
int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)
252
{
253
        struct acpi_buffer output = { .length = ACPI_ALLOCATE_BUFFER };
254
        union acpi_object *out_obj;
255
        acpi_status status;
256
        int rc = 0;
257
 
258
        status = acpi_evaluate_object(ap->acpi_handle, "_GTM", NULL, &output);
259
 
260
        rc = -ENOENT;
261
        if (status == AE_NOT_FOUND)
262
                goto out_free;
263
 
264
        rc = -EINVAL;
265
        if (ACPI_FAILURE(status)) {
266
                ata_port_printk(ap, KERN_ERR,
267
                                "ACPI get timing mode failed (AE 0x%x)\n",
268
                                status);
269
                goto out_free;
270
        }
271
 
272
        out_obj = output.pointer;
273
        if (out_obj->type != ACPI_TYPE_BUFFER) {
274
                ata_port_printk(ap, KERN_WARNING,
275
                                "_GTM returned unexpected object type 0x%x\n",
276
                                out_obj->type);
277
 
278
                goto out_free;
279
        }
280
 
281
        if (out_obj->buffer.length != sizeof(struct ata_acpi_gtm)) {
282
                ata_port_printk(ap, KERN_ERR,
283
                                "_GTM returned invalid length %d\n",
284
                                out_obj->buffer.length);
285
                goto out_free;
286
        }
287
 
288
        memcpy(gtm, out_obj->buffer.pointer, sizeof(struct ata_acpi_gtm));
289
        rc = 0;
290
 out_free:
291
        kfree(output.pointer);
292
        return rc;
293
}
294
 
295
EXPORT_SYMBOL_GPL(ata_acpi_gtm);
296
 
297
/**
298
 * ata_acpi_stm - execute _STM
299
 * @ap: target ATA port
300
 * @stm: timing parameter to _STM
301
 *
302
 * Evaluate _STM with timing parameter @stm.
303
 *
304
 * LOCKING:
305
 * EH context.
306
 *
307
 * RETURNS:
308
 * 0 on success, -ENOENT if _STM doesn't exist, -errno on failure.
309
 */
310
int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm)
311
{
312
        acpi_status status;
313
        struct ata_acpi_gtm             stm_buf = *stm;
314
        struct acpi_object_list         input;
315
        union acpi_object               in_params[3];
316
 
317
        in_params[0].type = ACPI_TYPE_BUFFER;
318
        in_params[0].buffer.length = sizeof(struct ata_acpi_gtm);
319
        in_params[0].buffer.pointer = (u8 *)&stm_buf;
320
        /* Buffers for id may need byteswapping ? */
321
        in_params[1].type = ACPI_TYPE_BUFFER;
322
        in_params[1].buffer.length = 512;
323
        in_params[1].buffer.pointer = (u8 *)ap->link.device[0].id;
324
        in_params[2].type = ACPI_TYPE_BUFFER;
325
        in_params[2].buffer.length = 512;
326
        in_params[2].buffer.pointer = (u8 *)ap->link.device[1].id;
327
 
328
        input.count = 3;
329
        input.pointer = in_params;
330
 
331
        status = acpi_evaluate_object(ap->acpi_handle, "_STM", &input, NULL);
332
 
333
        if (status == AE_NOT_FOUND)
334
                return -ENOENT;
335
        if (ACPI_FAILURE(status)) {
336
                ata_port_printk(ap, KERN_ERR,
337
                        "ACPI set timing mode failed (status=0x%x)\n", status);
338
                return -EINVAL;
339
        }
340
        return 0;
341
}
342
 
343
EXPORT_SYMBOL_GPL(ata_acpi_stm);
344
 
345
/**
346
 * ata_dev_get_GTF - get the drive bootup default taskfile settings
347
 * @dev: target ATA device
348
 * @gtf: output parameter for buffer containing _GTF taskfile arrays
349
 *
350
 * This applies to both PATA and SATA drives.
351
 *
352
 * The _GTF method has no input parameters.
353
 * It returns a variable number of register set values (registers
354
 * hex 1F1..1F7, taskfiles).
355
 * The <variable number> is not known in advance, so have ACPI-CA
356
 * allocate the buffer as needed and return it, then free it later.
357
 *
358
 * LOCKING:
359
 * EH context.
360
 *
361
 * RETURNS:
362
 * Number of taskfiles on success, 0 if _GTF doesn't exist.  -EINVAL
363
 * if _GTF is invalid.
364
 */
365
static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
366
{
367
        struct ata_port *ap = dev->link->ap;
368
        acpi_status status;
369
        struct acpi_buffer output;
370
        union acpi_object *out_obj;
371
        int rc = 0;
372
 
373
        /* if _GTF is cached, use the cached value */
374
        if (dev->gtf_cache) {
375
                out_obj = dev->gtf_cache;
376
                goto done;
377
        }
378
 
379
        /* set up output buffer */
380
        output.length = ACPI_ALLOCATE_BUFFER;
381
        output.pointer = NULL;  /* ACPI-CA sets this; save/free it later */
382
 
383
        if (ata_msg_probe(ap))
384
                ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER: port#: %d\n",
385
                               __FUNCTION__, ap->port_no);
386
 
387
        /* _GTF has no input parameters */
388
        status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output);
389
        out_obj = dev->gtf_cache = output.pointer;
390
 
391
        if (ACPI_FAILURE(status)) {
392
                if (status != AE_NOT_FOUND) {
393
                        ata_dev_printk(dev, KERN_WARNING,
394
                                       "_GTF evaluation failed (AE 0x%x)\n",
395
                                       status);
396
                        rc = -EINVAL;
397
                }
398
                goto out_free;
399
        }
400
 
401
        if (!output.length || !output.pointer) {
402
                if (ata_msg_probe(ap))
403
                        ata_dev_printk(dev, KERN_DEBUG, "%s: Run _GTF: "
404
                                "length or ptr is NULL (0x%llx, 0x%p)\n",
405
                                __FUNCTION__,
406
                                (unsigned long long)output.length,
407
                                output.pointer);
408
                rc = -EINVAL;
409
                goto out_free;
410
        }
411
 
412
        if (out_obj->type != ACPI_TYPE_BUFFER) {
413
                ata_dev_printk(dev, KERN_WARNING,
414
                               "_GTF unexpected object type 0x%x\n",
415
                               out_obj->type);
416
                rc = -EINVAL;
417
                goto out_free;
418
        }
419
 
420
        if (out_obj->buffer.length % REGS_PER_GTF) {
421
                ata_dev_printk(dev, KERN_WARNING,
422
                               "unexpected _GTF length (%d)\n",
423
                               out_obj->buffer.length);
424
                rc = -EINVAL;
425
                goto out_free;
426
        }
427
 
428
 done:
429
        rc = out_obj->buffer.length / REGS_PER_GTF;
430
        if (gtf) {
431
                *gtf = (void *)out_obj->buffer.pointer;
432
                if (ata_msg_probe(ap))
433
                        ata_dev_printk(dev, KERN_DEBUG,
434
                                       "%s: returning gtf=%p, gtf_count=%d\n",
435
                                       __FUNCTION__, *gtf, rc);
436
        }
437
        return rc;
438
 
439
 out_free:
440
        ata_acpi_clear_gtf(dev);
441
        return rc;
442
}
443
 
444
/**
445
 * ata_acpi_cbl_80wire          -       Check for 80 wire cable
446
 * @ap: Port to check
447
 *
448
 * Return 1 if the ACPI mode data for this port indicates the BIOS selected
449
 * an 80wire mode.
450
 */
451
 
452
int ata_acpi_cbl_80wire(struct ata_port *ap)
453
{
454
        const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
455
        int valid = 0;
456
 
457
        if (!gtm)
458
                return 0;
459
 
460
        /* Split timing, DMA enabled */
461
        if ((gtm->flags & 0x11) == 0x11 && gtm->drive[0].dma < 55)
462
                valid |= 1;
463
        if ((gtm->flags & 0x14) == 0x14 && gtm->drive[1].dma < 55)
464
                valid |= 2;
465
        /* Shared timing, DMA enabled */
466
        if ((gtm->flags & 0x11) == 0x01 && gtm->drive[0].dma < 55)
467
                valid |= 1;
468
        if ((gtm->flags & 0x14) == 0x04 && gtm->drive[0].dma < 55)
469
                valid |= 2;
470
 
471
        /* Drive check */
472
        if ((valid & 1) && ata_dev_enabled(&ap->link.device[0]))
473
                return 1;
474
        if ((valid & 2) && ata_dev_enabled(&ap->link.device[1]))
475
                return 1;
476
        return 0;
477
}
478
 
479
EXPORT_SYMBOL_GPL(ata_acpi_cbl_80wire);
480
 
481
static void ata_acpi_gtf_to_tf(struct ata_device *dev,
482
                               const struct ata_acpi_gtf *gtf,
483
                               struct ata_taskfile *tf)
484
{
485
        ata_tf_init(dev, tf);
486
 
487
        tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
488
        tf->protocol = ATA_PROT_NODATA;
489
        tf->feature = gtf->tf[0];        /* 0x1f1 */
490
        tf->nsect   = gtf->tf[1];       /* 0x1f2 */
491
        tf->lbal    = gtf->tf[2];       /* 0x1f3 */
492
        tf->lbam    = gtf->tf[3];       /* 0x1f4 */
493
        tf->lbah    = gtf->tf[4];       /* 0x1f5 */
494
        tf->device  = gtf->tf[5];       /* 0x1f6 */
495
        tf->command = gtf->tf[6];       /* 0x1f7 */
496
}
497
 
498
static int ata_acpi_filter_tf(const struct ata_taskfile *tf,
499
                              const struct ata_taskfile *ptf)
500
{
501
        if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_SETXFER) {
502
                /* libata doesn't use ACPI to configure transfer mode.
503
                 * It will only confuse device configuration.  Skip.
504
                 */
505
                if (tf->command == ATA_CMD_SET_FEATURES &&
506
                    tf->feature == SETFEATURES_XFER)
507
                        return 1;
508
        }
509
 
510
        if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_LOCK) {
511
                /* BIOS writers, sorry but we don't wanna lock
512
                 * features unless the user explicitly said so.
513
                 */
514
 
515
                /* DEVICE CONFIGURATION FREEZE LOCK */
516
                if (tf->command == ATA_CMD_CONF_OVERLAY &&
517
                    tf->feature == ATA_DCO_FREEZE_LOCK)
518
                        return 1;
519
 
520
                /* SECURITY FREEZE LOCK */
521
                if (tf->command == ATA_CMD_SEC_FREEZE_LOCK)
522
                        return 1;
523
 
524
                /* SET MAX LOCK and SET MAX FREEZE LOCK */
525
                if ((!ptf || ptf->command != ATA_CMD_READ_NATIVE_MAX) &&
526
                    tf->command == ATA_CMD_SET_MAX &&
527
                    (tf->feature == ATA_SET_MAX_LOCK ||
528
                     tf->feature == ATA_SET_MAX_FREEZE_LOCK))
529
                        return 1;
530
        }
531
 
532
        return 0;
533
}
534
 
535
/**
536
 * ata_acpi_run_tf - send taskfile registers to host controller
537
 * @dev: target ATA device
538
 * @gtf: raw ATA taskfile register set (0x1f1 - 0x1f7)
539
 *
540
 * Outputs ATA taskfile to standard ATA host controller using MMIO
541
 * or PIO as indicated by the ATA_FLAG_MMIO flag.
542
 * Writes the control, feature, nsect, lbal, lbam, and lbah registers.
543
 * Optionally (ATA_TFLAG_LBA48) writes hob_feature, hob_nsect,
544
 * hob_lbal, hob_lbam, and hob_lbah.
545
 *
546
 * This function waits for idle (!BUSY and !DRQ) after writing
547
 * registers.  If the control register has a new value, this
548
 * function also waits for idle after writing control and before
549
 * writing the remaining registers.
550
 *
551
 * LOCKING:
552
 * EH context.
553
 *
554
 * RETURNS:
555
 * 1 if command is executed successfully.  0 if ignored, rejected or
556
 * filtered out, -errno on other errors.
557
 */
558
static int ata_acpi_run_tf(struct ata_device *dev,
559
                           const struct ata_acpi_gtf *gtf,
560
                           const struct ata_acpi_gtf *prev_gtf)
561
{
562
        struct ata_taskfile *pptf = NULL;
563
        struct ata_taskfile tf, ptf, rtf;
564
        unsigned int err_mask;
565
        const char *level;
566
        char msg[60];
567
        int rc;
568
 
569
        if ((gtf->tf[0] == 0) && (gtf->tf[1] == 0) && (gtf->tf[2] == 0)
570
            && (gtf->tf[3] == 0) && (gtf->tf[4] == 0) && (gtf->tf[5] == 0)
571
            && (gtf->tf[6] == 0))
572
                return 0;
573
 
574
        ata_acpi_gtf_to_tf(dev, gtf, &tf);
575
        if (prev_gtf) {
576
                ata_acpi_gtf_to_tf(dev, prev_gtf, &ptf);
577
                pptf = &ptf;
578
        }
579
 
580
        if (!ata_acpi_filter_tf(&tf, pptf)) {
581
                rtf = tf;
582
                err_mask = ata_exec_internal(dev, &rtf, NULL,
583
                                             DMA_NONE, NULL, 0, 0);
584
 
585
                switch (err_mask) {
586
                case 0:
587
                        level = KERN_DEBUG;
588
                        snprintf(msg, sizeof(msg), "succeeded");
589
                        rc = 1;
590
                        break;
591
 
592
                case AC_ERR_DEV:
593
                        level = KERN_INFO;
594
                        snprintf(msg, sizeof(msg),
595
                                 "rejected by device (Stat=0x%02x Err=0x%02x)",
596
                                 rtf.command, rtf.feature);
597
                        rc = 0;
598
                        break;
599
 
600
                default:
601
                        level = KERN_ERR;
602
                        snprintf(msg, sizeof(msg),
603
                                 "failed (Emask=0x%x Stat=0x%02x Err=0x%02x)",
604
                                 err_mask, rtf.command, rtf.feature);
605
                        rc = -EIO;
606
                        break;
607
                }
608
        } else {
609
                level = KERN_INFO;
610
                snprintf(msg, sizeof(msg), "filtered out");
611
                rc = 0;
612
        }
613
 
614
        ata_dev_printk(dev, level,
615
                       "ACPI cmd %02x/%02x:%02x:%02x:%02x:%02x:%02x %s\n",
616
                       tf.command, tf.feature, tf.nsect, tf.lbal,
617
                       tf.lbam, tf.lbah, tf.device, msg);
618
 
619
        return rc;
620
}
621
 
622
/**
623
 * ata_acpi_exec_tfs - get then write drive taskfile settings
624
 * @dev: target ATA device
625
 * @nr_executed: out paramter for the number of executed commands
626
 *
627
 * Evaluate _GTF and excute returned taskfiles.
628
 *
629
 * LOCKING:
630
 * EH context.
631
 *
632
 * RETURNS:
633
 * Number of executed taskfiles on success, 0 if _GTF doesn't exist.
634
 * -errno on other errors.
635
 */
636
static int ata_acpi_exec_tfs(struct ata_device *dev, int *nr_executed)
637
{
638
        struct ata_acpi_gtf *gtf = NULL, *pgtf = NULL;
639
        int gtf_count, i, rc;
640
 
641
        /* get taskfiles */
642
        rc = ata_dev_get_GTF(dev, &gtf);
643
        if (rc < 0)
644
                return rc;
645
        gtf_count = rc;
646
 
647
        /* execute them */
648
        for (i = 0; i < gtf_count; i++, gtf++) {
649
                rc = ata_acpi_run_tf(dev, gtf, pgtf);
650
                if (rc < 0)
651
                        break;
652
                if (rc) {
653
                        (*nr_executed)++;
654
                        pgtf = gtf;
655
                }
656
        }
657
 
658
        ata_acpi_clear_gtf(dev);
659
 
660
        if (rc < 0)
661
                return rc;
662
        return 0;
663
}
664
 
665
/**
666
 * ata_acpi_push_id - send Identify data to drive
667
 * @dev: target ATA device
668
 *
669
 * _SDD ACPI object: for SATA mode only
670
 * Must be after Identify (Packet) Device -- uses its data
671
 * ATM this function never returns a failure.  It is an optional
672
 * method and if it fails for whatever reason, we should still
673
 * just keep going.
674
 *
675
 * LOCKING:
676
 * EH context.
677
 *
678
 * RETURNS:
679
 * 0 on success, -errno on failure.
680
 */
681
static int ata_acpi_push_id(struct ata_device *dev)
682
{
683
        struct ata_port *ap = dev->link->ap;
684
        int err;
685
        acpi_status status;
686
        struct acpi_object_list input;
687
        union acpi_object in_params[1];
688
 
689
        if (ata_msg_probe(ap))
690
                ata_dev_printk(dev, KERN_DEBUG, "%s: ix = %d, port#: %d\n",
691
                               __FUNCTION__, dev->devno, ap->port_no);
692
 
693
        /* Give the drive Identify data to the drive via the _SDD method */
694
        /* _SDD: set up input parameters */
695
        input.count = 1;
696
        input.pointer = in_params;
697
        in_params[0].type = ACPI_TYPE_BUFFER;
698
        in_params[0].buffer.length = sizeof(dev->id[0]) * ATA_ID_WORDS;
699
        in_params[0].buffer.pointer = (u8 *)dev->id;
700
        /* Output buffer: _SDD has no output */
701
 
702
        /* It's OK for _SDD to be missing too. */
703
        swap_buf_le16(dev->id, ATA_ID_WORDS);
704
        status = acpi_evaluate_object(dev->acpi_handle, "_SDD", &input, NULL);
705
        swap_buf_le16(dev->id, ATA_ID_WORDS);
706
 
707
        err = ACPI_FAILURE(status) ? -EIO : 0;
708
        if (err < 0)
709
                ata_dev_printk(dev, KERN_WARNING,
710
                               "ACPI _SDD failed (AE 0x%x)\n", status);
711
 
712
        return err;
713
}
714
 
715
/**
716
 * ata_acpi_on_suspend - ATA ACPI hook called on suspend
717
 * @ap: target ATA port
718
 *
719
 * This function is called when @ap is about to be suspended.  All
720
 * devices are already put to sleep but the port_suspend() callback
721
 * hasn't been executed yet.  Error return from this function aborts
722
 * suspend.
723
 *
724
 * LOCKING:
725
 * EH context.
726
 *
727
 * RETURNS:
728
 * 0 on success, -errno on failure.
729
 */
730
int ata_acpi_on_suspend(struct ata_port *ap)
731
{
732
        /* nada */
733
        return 0;
734
}
735
 
736
/**
737
 * ata_acpi_on_resume - ATA ACPI hook called on resume
738
 * @ap: target ATA port
739
 *
740
 * This function is called when @ap is resumed - right after port
741
 * itself is resumed but before any EH action is taken.
742
 *
743
 * LOCKING:
744
 * EH context.
745
 */
746
void ata_acpi_on_resume(struct ata_port *ap)
747
{
748
        const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
749
        struct ata_device *dev;
750
 
751
        if (ap->acpi_handle && gtm) {
752
                /* _GTM valid */
753
 
754
                /* restore timing parameters */
755
                ata_acpi_stm(ap, gtm);
756
 
757
                /* _GTF should immediately follow _STM so that it can
758
                 * use values set by _STM.  Cache _GTF result and
759
                 * schedule _GTF.
760
                 */
761
                ata_link_for_each_dev(dev, &ap->link) {
762
                        ata_acpi_clear_gtf(dev);
763
                        if (ata_dev_get_GTF(dev, NULL) >= 0)
764
                                dev->flags |= ATA_DFLAG_ACPI_PENDING;
765
                }
766
        } else {
767
                /* SATA _GTF needs to be evaulated after _SDD and
768
                 * there's no reason to evaluate IDE _GTF early
769
                 * without _STM.  Clear cache and schedule _GTF.
770
                 */
771
                ata_link_for_each_dev(dev, &ap->link) {
772
                        ata_acpi_clear_gtf(dev);
773
                        dev->flags |= ATA_DFLAG_ACPI_PENDING;
774
                }
775
        }
776
}
777
 
778
/**
779
 * ata_acpi_on_devcfg - ATA ACPI hook called on device donfiguration
780
 * @dev: target ATA device
781
 *
782
 * This function is called when @dev is about to be configured.
783
 * IDENTIFY data might have been modified after this hook is run.
784
 *
785
 * LOCKING:
786
 * EH context.
787
 *
788
 * RETURNS:
789
 * Positive number if IDENTIFY data needs to be refreshed, 0 if not,
790
 * -errno on failure.
791
 */
792
int ata_acpi_on_devcfg(struct ata_device *dev)
793
{
794
        struct ata_port *ap = dev->link->ap;
795
        struct ata_eh_context *ehc = &ap->link.eh_context;
796
        int acpi_sata = ap->flags & ATA_FLAG_ACPI_SATA;
797
        int nr_executed = 0;
798
        int rc;
799
 
800
        if (!dev->acpi_handle)
801
                return 0;
802
 
803
        /* do we need to do _GTF? */
804
        if (!(dev->flags & ATA_DFLAG_ACPI_PENDING) &&
805
            !(acpi_sata && (ehc->i.flags & ATA_EHI_DID_HARDRESET)))
806
                return 0;
807
 
808
        /* do _SDD if SATA */
809
        if (acpi_sata) {
810
                rc = ata_acpi_push_id(dev);
811
                if (rc)
812
                        goto acpi_err;
813
        }
814
 
815
        /* do _GTF */
816
        rc = ata_acpi_exec_tfs(dev, &nr_executed);
817
        if (rc)
818
                goto acpi_err;
819
 
820
        dev->flags &= ~ATA_DFLAG_ACPI_PENDING;
821
 
822
        /* refresh IDENTIFY page if any _GTF command has been executed */
823
        if (nr_executed) {
824
                rc = ata_dev_reread_id(dev, 0);
825
                if (rc < 0) {
826
                        ata_dev_printk(dev, KERN_ERR, "failed to IDENTIFY "
827
                                       "after ACPI commands\n");
828
                        return rc;
829
                }
830
        }
831
 
832
        return 0;
833
 
834
 acpi_err:
835
        /* ignore evaluation failure if we can continue safely */
836
        if (rc == -EINVAL && !nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN))
837
                return 0;
838
 
839
        /* fail and let EH retry once more for unknown IO errors */
840
        if (!(dev->flags & ATA_DFLAG_ACPI_FAILED)) {
841
                dev->flags |= ATA_DFLAG_ACPI_FAILED;
842
                return rc;
843
        }
844
 
845
        ata_dev_printk(dev, KERN_WARNING,
846
                       "ACPI: failed the second time, disabled\n");
847
        dev->acpi_handle = NULL;
848
 
849
        /* We can safely continue if no _GTF command has been executed
850
         * and port is not frozen.
851
         */
852
        if (!nr_executed && !(ap->pflags & ATA_PFLAG_FROZEN))
853
                return 0;
854
 
855
        return rc;
856
}
857
 
858
/**
859
 * ata_acpi_on_disable - ATA ACPI hook called when a device is disabled
860
 * @dev: target ATA device
861
 *
862
 * This function is called when @dev is about to be disabled.
863
 *
864
 * LOCKING:
865
 * EH context.
866
 */
867
void ata_acpi_on_disable(struct ata_device *dev)
868
{
869
        ata_acpi_clear_gtf(dev);
870
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.