Merge branch 'skip_delete_inode' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / drivers / acpi / pci_link.c
1 /*
2  *  pci_link.c - ACPI PCI Interrupt Link Device Driver ($Revision: 34 $)
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *  Copyright (C) 2002       Dominik Brodowski <devel@brodo.de>
7  *
8  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or (at
13  *  your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful, but
16  *  WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License along
21  *  with this program; if not, write to the Free Software Foundation, Inc.,
22  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23  *
24  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25  *
26  * TBD: 
27  *      1. Support more than one IRQ resource entry per link device (index).
28  *      2. Implement start/stop mechanism and use ACPI Bus Driver facilities
29  *         for IRQ management (e.g. start()->_SRS).
30  */
31
32 #include <linux/sysdev.h>
33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/init.h>
36 #include <linux/types.h>
37 #include <linux/proc_fs.h>
38 #include <linux/spinlock.h>
39 #include <linux/pm.h>
40 #include <linux/pci.h>
41 #include <linux/mutex.h>
42 #include <linux/slab.h>
43
44 #include <acpi/acpi_bus.h>
45 #include <acpi/acpi_drivers.h>
46
47 #define PREFIX "ACPI: "
48
49 #define _COMPONENT                      ACPI_PCI_COMPONENT
50 ACPI_MODULE_NAME("pci_link");
51 #define ACPI_PCI_LINK_CLASS             "pci_irq_routing"
52 #define ACPI_PCI_LINK_DEVICE_NAME       "PCI Interrupt Link"
53 #define ACPI_PCI_LINK_FILE_INFO         "info"
54 #define ACPI_PCI_LINK_FILE_STATUS       "state"
55 #define ACPI_PCI_LINK_MAX_POSSIBLE      16
56
57 static int acpi_pci_link_add(struct acpi_device *device);
58 static int acpi_pci_link_remove(struct acpi_device *device, int type);
59
60 static const struct acpi_device_id link_device_ids[] = {
61         {"PNP0C0F", 0},
62         {"", 0},
63 };
64 MODULE_DEVICE_TABLE(acpi, link_device_ids);
65
66 static struct acpi_driver acpi_pci_link_driver = {
67         .name = "pci_link",
68         .class = ACPI_PCI_LINK_CLASS,
69         .ids = link_device_ids,
70         .ops = {
71                 .add = acpi_pci_link_add,
72                 .remove = acpi_pci_link_remove,
73         },
74 };
75
76 /*
77  * If a link is initialized, we never change its active and initialized
78  * later even the link is disable. Instead, we just repick the active irq
79  */
80 struct acpi_pci_link_irq {
81         u8 active;              /* Current IRQ */
82         u8 triggering;          /* All IRQs */
83         u8 polarity;            /* All IRQs */
84         u8 resource_type;
85         u8 possible_count;
86         u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
87         u8 initialized:1;
88         u8 reserved:7;
89 };
90
91 struct acpi_pci_link {
92         struct list_head                list;
93         struct acpi_device              *device;
94         struct acpi_pci_link_irq        irq;
95         int                             refcnt;
96 };
97
98 static LIST_HEAD(acpi_link_list);
99 static DEFINE_MUTEX(acpi_link_lock);
100
101 /* --------------------------------------------------------------------------
102                             PCI Link Device Management
103    -------------------------------------------------------------------------- */
104
105 /*
106  * set context (link) possible list from resource list
107  */
108 static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
109                                                 void *context)
110 {
111         struct acpi_pci_link *link = context;
112         u32 i;
113
114         switch (resource->type) {
115         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
116         case ACPI_RESOURCE_TYPE_END_TAG:
117                 return AE_OK;
118         case ACPI_RESOURCE_TYPE_IRQ:
119                 {
120                         struct acpi_resource_irq *p = &resource->data.irq;
121                         if (!p || !p->interrupt_count) {
122                                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
123                                                   "Blank _PRS IRQ resource\n"));
124                                 return AE_OK;
125                         }
126                         for (i = 0;
127                              (i < p->interrupt_count
128                               && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
129                                 if (!p->interrupts[i]) {
130                                         printk(KERN_WARNING PREFIX
131                                                "Invalid _PRS IRQ %d\n",
132                                                p->interrupts[i]);
133                                         continue;
134                                 }
135                                 link->irq.possible[i] = p->interrupts[i];
136                                 link->irq.possible_count++;
137                         }
138                         link->irq.triggering = p->triggering;
139                         link->irq.polarity = p->polarity;
140                         link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ;
141                         break;
142                 }
143         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
144                 {
145                         struct acpi_resource_extended_irq *p =
146                             &resource->data.extended_irq;
147                         if (!p || !p->interrupt_count) {
148                                 printk(KERN_WARNING PREFIX
149                                               "Blank _PRS EXT IRQ resource\n");
150                                 return AE_OK;
151                         }
152                         for (i = 0;
153                              (i < p->interrupt_count
154                               && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
155                                 if (!p->interrupts[i]) {
156                                         printk(KERN_WARNING PREFIX
157                                                "Invalid _PRS IRQ %d\n",
158                                                p->interrupts[i]);
159                                         continue;
160                                 }
161                                 link->irq.possible[i] = p->interrupts[i];
162                                 link->irq.possible_count++;
163                         }
164                         link->irq.triggering = p->triggering;
165                         link->irq.polarity = p->polarity;
166                         link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
167                         break;
168                 }
169         default:
170                 printk(KERN_ERR PREFIX "_PRS resource type 0x%x isn't an IRQ\n",
171                        resource->type);
172                 return AE_OK;
173         }
174
175         return AE_CTRL_TERMINATE;
176 }
177
178 static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
179 {
180         acpi_status status;
181
182         status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
183                                      acpi_pci_link_check_possible, link);
184         if (ACPI_FAILURE(status)) {
185                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRS"));
186                 return -ENODEV;
187         }
188
189         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
190                           "Found %d possible IRQs\n",
191                           link->irq.possible_count));
192
193         return 0;
194 }
195
196 static acpi_status acpi_pci_link_check_current(struct acpi_resource *resource,
197                                                void *context)
198 {
199         int *irq = context;
200
201         switch (resource->type) {
202         case ACPI_RESOURCE_TYPE_START_DEPENDENT:
203         case ACPI_RESOURCE_TYPE_END_TAG:
204                 return AE_OK;
205         case ACPI_RESOURCE_TYPE_IRQ:
206                 {
207                         struct acpi_resource_irq *p = &resource->data.irq;
208                         if (!p || !p->interrupt_count) {
209                                 /*
210                                  * IRQ descriptors may have no IRQ# bits set,
211                                  * particularly those those w/ _STA disabled
212                                  */
213                                 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
214                                                   "Blank _CRS IRQ resource\n"));
215                                 return AE_OK;
216                         }
217                         *irq = p->interrupts[0];
218                         break;
219                 }
220         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
221                 {
222                         struct acpi_resource_extended_irq *p =
223                             &resource->data.extended_irq;
224                         if (!p || !p->interrupt_count) {
225                                 /*
226                                  * extended IRQ descriptors must
227                                  * return at least 1 IRQ
228                                  */
229                                 printk(KERN_WARNING PREFIX
230                                               "Blank _CRS EXT IRQ resource\n");
231                                 return AE_OK;
232                         }
233                         *irq = p->interrupts[0];
234                         break;
235                 }
236                 break;
237         default:
238                 printk(KERN_ERR PREFIX "_CRS resource type 0x%x isn't an IRQ\n",
239                        resource->type);
240                 return AE_OK;
241         }
242
243         return AE_CTRL_TERMINATE;
244 }
245
246 /*
247  * Run _CRS and set link->irq.active
248  *
249  * return value:
250  * 0 - success
251  * !0 - failure
252  */
253 static int acpi_pci_link_get_current(struct acpi_pci_link *link)
254 {
255         int result = 0;
256         acpi_status status;
257         int irq = 0;
258
259         link->irq.active = 0;
260
261         /* in practice, status disabled is meaningless, ignore it */
262         if (acpi_strict) {
263                 /* Query _STA, set link->device->status */
264                 result = acpi_bus_get_status(link->device);
265                 if (result) {
266                         printk(KERN_ERR PREFIX "Unable to read status\n");
267                         goto end;
268                 }
269
270                 if (!link->device->status.enabled) {
271                         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link disabled\n"));
272                         return 0;
273                 }
274         }
275
276         /* 
277          * Query and parse _CRS to get the current IRQ assignment. 
278          */
279
280         status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS,
281                                      acpi_pci_link_check_current, &irq);
282         if (ACPI_FAILURE(status)) {
283                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _CRS"));
284                 result = -ENODEV;
285                 goto end;
286         }
287
288         if (acpi_strict && !irq) {
289                 printk(KERN_ERR PREFIX "_CRS returned 0\n");
290                 result = -ENODEV;
291         }
292
293         link->irq.active = irq;
294
295         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
296
297       end:
298         return result;
299 }
300
301 static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
302 {
303         int result;
304         acpi_status status;
305         struct {
306                 struct acpi_resource res;
307                 struct acpi_resource end;
308         } *resource;
309         struct acpi_buffer buffer = { 0, NULL };
310
311         if (!irq)
312                 return -EINVAL;
313
314         resource = kzalloc(sizeof(*resource) + 1, irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
315         if (!resource)
316                 return -ENOMEM;
317
318         buffer.length = sizeof(*resource) + 1;
319         buffer.pointer = resource;
320
321         switch (link->irq.resource_type) {
322         case ACPI_RESOURCE_TYPE_IRQ:
323                 resource->res.type = ACPI_RESOURCE_TYPE_IRQ;
324                 resource->res.length = sizeof(struct acpi_resource);
325                 resource->res.data.irq.triggering = link->irq.triggering;
326                 resource->res.data.irq.polarity =
327                     link->irq.polarity;
328                 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
329                         resource->res.data.irq.sharable =
330                             ACPI_EXCLUSIVE;
331                 else
332                         resource->res.data.irq.sharable = ACPI_SHARED;
333                 resource->res.data.irq.interrupt_count = 1;
334                 resource->res.data.irq.interrupts[0] = irq;
335                 break;
336
337         case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
338                 resource->res.type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
339                 resource->res.length = sizeof(struct acpi_resource);
340                 resource->res.data.extended_irq.producer_consumer =
341                     ACPI_CONSUMER;
342                 resource->res.data.extended_irq.triggering =
343                     link->irq.triggering;
344                 resource->res.data.extended_irq.polarity =
345                     link->irq.polarity;
346                 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
347                         resource->res.data.irq.sharable =
348                             ACPI_EXCLUSIVE;
349                 else
350                         resource->res.data.irq.sharable = ACPI_SHARED;
351                 resource->res.data.extended_irq.interrupt_count = 1;
352                 resource->res.data.extended_irq.interrupts[0] = irq;
353                 /* ignore resource_source, it's optional */
354                 break;
355         default:
356                 printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
357                 result = -EINVAL;
358                 goto end;
359
360         }
361         resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
362
363         /* Attempt to set the resource */
364         status = acpi_set_current_resources(link->device->handle, &buffer);
365
366         /* check for total failure */
367         if (ACPI_FAILURE(status)) {
368                 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _SRS"));
369                 result = -ENODEV;
370                 goto end;
371         }
372
373         /* Query _STA, set device->status */
374         result = acpi_bus_get_status(link->device);
375         if (result) {
376                 printk(KERN_ERR PREFIX "Unable to read status\n");
377                 goto end;
378         }
379         if (!link->device->status.enabled) {
380                 printk(KERN_WARNING PREFIX
381                               "%s [%s] disabled and referenced, BIOS bug\n",
382                               acpi_device_name(link->device),
383                               acpi_device_bid(link->device));
384         }
385
386         /* Query _CRS, set link->irq.active */
387         result = acpi_pci_link_get_current(link);
388         if (result) {
389                 goto end;
390         }
391
392         /*
393          * Is current setting not what we set?
394          * set link->irq.active
395          */
396         if (link->irq.active != irq) {
397                 /*
398                  * policy: when _CRS doesn't return what we just _SRS
399                  * assume _SRS worked and override _CRS value.
400                  */
401                 printk(KERN_WARNING PREFIX
402                               "%s [%s] BIOS reported IRQ %d, using IRQ %d\n",
403                               acpi_device_name(link->device),
404                               acpi_device_bid(link->device), link->irq.active, irq);
405                 link->irq.active = irq;
406         }
407
408         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Set IRQ %d\n", link->irq.active));
409
410       end:
411         kfree(resource);
412         return result;
413 }
414
415 /* --------------------------------------------------------------------------
416                             PCI Link IRQ Management
417    -------------------------------------------------------------------------- */
418
419 /*
420  * "acpi_irq_balance" (default in APIC mode) enables ACPI to use PIC Interrupt
421  * Link Devices to move the PIRQs around to minimize sharing.
422  * 
423  * "acpi_irq_nobalance" (default in PIC mode) tells ACPI not to move any PIC IRQs
424  * that the BIOS has already set to active.  This is necessary because
425  * ACPI has no automatic means of knowing what ISA IRQs are used.  Note that
426  * if the BIOS doesn't set a Link Device active, ACPI needs to program it
427  * even if acpi_irq_nobalance is set.
428  *
429  * A tables of penalties avoids directing PCI interrupts to well known
430  * ISA IRQs. Boot params are available to over-ride the default table:
431  *
432  * List interrupts that are free for PCI use.
433  * acpi_irq_pci=n[,m]
434  *
435  * List interrupts that should not be used for PCI:
436  * acpi_irq_isa=n[,m]
437  *
438  * Note that PCI IRQ routers have a list of possible IRQs,
439  * which may not include the IRQs this table says are available.
440  * 
441  * Since this heuristic can't tell the difference between a link
442  * that no device will attach to, vs. a link which may be shared
443  * by multiple active devices -- it is not optimal.
444  *
445  * If interrupt performance is that important, get an IO-APIC system
446  * with a pin dedicated to each device.  Or for that matter, an MSI
447  * enabled system.
448  */
449
450 #define ACPI_MAX_IRQS           256
451 #define ACPI_MAX_ISA_IRQ        16
452
453 #define PIRQ_PENALTY_PCI_AVAILABLE      (0)
454 #define PIRQ_PENALTY_PCI_POSSIBLE       (16*16)
455 #define PIRQ_PENALTY_PCI_USING          (16*16*16)
456 #define PIRQ_PENALTY_ISA_TYPICAL        (16*16*16*16)
457 #define PIRQ_PENALTY_ISA_USED           (16*16*16*16*16)
458 #define PIRQ_PENALTY_ISA_ALWAYS         (16*16*16*16*16*16)
459
460 static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
461         PIRQ_PENALTY_ISA_ALWAYS,        /* IRQ0 timer */
462         PIRQ_PENALTY_ISA_ALWAYS,        /* IRQ1 keyboard */
463         PIRQ_PENALTY_ISA_ALWAYS,        /* IRQ2 cascade */
464         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ3 serial */
465         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ4 serial */
466         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ5 sometimes SoundBlaster */
467         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ6 */
468         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ7 parallel, spurious */
469         PIRQ_PENALTY_ISA_TYPICAL,       /* IRQ8 rtc, sometimes */
470         PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ9  PCI, often acpi */
471         PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ10 PCI */
472         PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ11 PCI */
473         PIRQ_PENALTY_ISA_USED,          /* IRQ12 mouse */
474         PIRQ_PENALTY_ISA_USED,          /* IRQ13 fpe, sometimes */
475         PIRQ_PENALTY_ISA_USED,          /* IRQ14 ide0 */
476         PIRQ_PENALTY_ISA_USED,          /* IRQ15 ide1 */
477         /* >IRQ15 */
478 };
479
480 int __init acpi_irq_penalty_init(void)
481 {
482         struct acpi_pci_link *link;
483         int i;
484
485         /*
486          * Update penalties to facilitate IRQ balancing.
487          */
488         list_for_each_entry(link, &acpi_link_list, list) {
489
490                 /*
491                  * reflect the possible and active irqs in the penalty table --
492                  * useful for breaking ties.
493                  */
494                 if (link->irq.possible_count) {
495                         int penalty =
496                             PIRQ_PENALTY_PCI_POSSIBLE /
497                             link->irq.possible_count;
498
499                         for (i = 0; i < link->irq.possible_count; i++) {
500                                 if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ)
501                                         acpi_irq_penalty[link->irq.
502                                                          possible[i]] +=
503                                             penalty;
504                         }
505
506                 } else if (link->irq.active) {
507                         acpi_irq_penalty[link->irq.active] +=
508                             PIRQ_PENALTY_PCI_POSSIBLE;
509                 }
510         }
511         /* Add a penalty for the SCI */
512         acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING;
513         return 0;
514 }
515
516 static int acpi_irq_balance = -1;       /* 0: static, 1: balance */
517
518 static int acpi_pci_link_allocate(struct acpi_pci_link *link)
519 {
520         int irq;
521         int i;
522
523         if (link->irq.initialized) {
524                 if (link->refcnt == 0)
525                         /* This means the link is disabled but initialized */
526                         acpi_pci_link_set(link, link->irq.active);
527                 return 0;
528         }
529
530         /*
531          * search for active IRQ in list of possible IRQs.
532          */
533         for (i = 0; i < link->irq.possible_count; ++i) {
534                 if (link->irq.active == link->irq.possible[i])
535                         break;
536         }
537         /*
538          * forget active IRQ that is not in possible list
539          */
540         if (i == link->irq.possible_count) {
541                 if (acpi_strict)
542                         printk(KERN_WARNING PREFIX "_CRS %d not found"
543                                       " in _PRS\n", link->irq.active);
544                 link->irq.active = 0;
545         }
546
547         /*
548          * if active found, use it; else pick entry from end of possible list.
549          */
550         if (link->irq.active)
551                 irq = link->irq.active;
552         else
553                 irq = link->irq.possible[link->irq.possible_count - 1];
554
555         if (acpi_irq_balance || !link->irq.active) {
556                 /*
557                  * Select the best IRQ.  This is done in reverse to promote
558                  * the use of IRQs 9, 10, 11, and >15.
559                  */
560                 for (i = (link->irq.possible_count - 1); i >= 0; i--) {
561                         if (acpi_irq_penalty[irq] >
562                             acpi_irq_penalty[link->irq.possible[i]])
563                                 irq = link->irq.possible[i];
564                 }
565         }
566
567         /* Attempt to enable the link device at this IRQ. */
568         if (acpi_pci_link_set(link, irq)) {
569                 printk(KERN_ERR PREFIX "Unable to set IRQ for %s [%s]. "
570                             "Try pci=noacpi or acpi=off\n",
571                             acpi_device_name(link->device),
572                             acpi_device_bid(link->device));
573                 return -ENODEV;
574         } else {
575                 acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
576                 printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
577                        acpi_device_name(link->device),
578                        acpi_device_bid(link->device), link->irq.active);
579         }
580
581         link->irq.initialized = 1;
582         return 0;
583 }
584
585 /*
586  * acpi_pci_link_allocate_irq
587  * success: return IRQ >= 0
588  * failure: return -1
589  */
590 int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
591                                int *polarity, char **name)
592 {
593         int result;
594         struct acpi_device *device;
595         struct acpi_pci_link *link;
596
597         result = acpi_bus_get_device(handle, &device);
598         if (result) {
599                 printk(KERN_ERR PREFIX "Invalid link device\n");
600                 return -1;
601         }
602
603         link = acpi_driver_data(device);
604         if (!link) {
605                 printk(KERN_ERR PREFIX "Invalid link context\n");
606                 return -1;
607         }
608
609         /* TBD: Support multiple index (IRQ) entries per Link Device */
610         if (index) {
611                 printk(KERN_ERR PREFIX "Invalid index %d\n", index);
612                 return -1;
613         }
614
615         mutex_lock(&acpi_link_lock);
616         if (acpi_pci_link_allocate(link)) {
617                 mutex_unlock(&acpi_link_lock);
618                 return -1;
619         }
620
621         if (!link->irq.active) {
622                 mutex_unlock(&acpi_link_lock);
623                 printk(KERN_ERR PREFIX "Link active IRQ is 0!\n");
624                 return -1;
625         }
626         link->refcnt++;
627         mutex_unlock(&acpi_link_lock);
628
629         if (triggering)
630                 *triggering = link->irq.triggering;
631         if (polarity)
632                 *polarity = link->irq.polarity;
633         if (name)
634                 *name = acpi_device_bid(link->device);
635         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
636                           "Link %s is referenced\n",
637                           acpi_device_bid(link->device)));
638         return (link->irq.active);
639 }
640
641 /*
642  * We don't change link's irq information here.  After it is reenabled, we
643  * continue use the info
644  */
645 int acpi_pci_link_free_irq(acpi_handle handle)
646 {
647         struct acpi_device *device;
648         struct acpi_pci_link *link;
649         acpi_status result;
650
651         result = acpi_bus_get_device(handle, &device);
652         if (result) {
653                 printk(KERN_ERR PREFIX "Invalid link device\n");
654                 return -1;
655         }
656
657         link = acpi_driver_data(device);
658         if (!link) {
659                 printk(KERN_ERR PREFIX "Invalid link context\n");
660                 return -1;
661         }
662
663         mutex_lock(&acpi_link_lock);
664         if (!link->irq.initialized) {
665                 mutex_unlock(&acpi_link_lock);
666                 printk(KERN_ERR PREFIX "Link isn't initialized\n");
667                 return -1;
668         }
669 #ifdef  FUTURE_USE
670         /*
671          * The Link reference count allows us to _DISable an unused link
672          * and suspend time, and set it again  on resume.
673          * However, 2.6.12 still has irq_router.resume
674          * which blindly restores the link state.
675          * So we disable the reference count method
676          * to prevent duplicate acpi_pci_link_set()
677          * which would harm some systems
678          */
679         link->refcnt--;
680 #endif
681         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
682                           "Link %s is dereferenced\n",
683                           acpi_device_bid(link->device)));
684
685         if (link->refcnt == 0)
686                 acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
687
688         mutex_unlock(&acpi_link_lock);
689         return (link->irq.active);
690 }
691
692 /* --------------------------------------------------------------------------
693                                  Driver Interface
694    -------------------------------------------------------------------------- */
695
696 static int acpi_pci_link_add(struct acpi_device *device)
697 {
698         int result;
699         struct acpi_pci_link *link;
700         int i;
701         int found = 0;
702
703         link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
704         if (!link)
705                 return -ENOMEM;
706
707         link->device = device;
708         strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME);
709         strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS);
710         device->driver_data = link;
711
712         mutex_lock(&acpi_link_lock);
713         result = acpi_pci_link_get_possible(link);
714         if (result)
715                 goto end;
716
717         /* query and set link->irq.active */
718         acpi_pci_link_get_current(link);
719
720         printk(KERN_INFO PREFIX "%s [%s] (IRQs", acpi_device_name(device),
721                acpi_device_bid(device));
722         for (i = 0; i < link->irq.possible_count; i++) {
723                 if (link->irq.active == link->irq.possible[i]) {
724                         printk(" *%d", link->irq.possible[i]);
725                         found = 1;
726                 } else
727                         printk(" %d", link->irq.possible[i]);
728         }
729
730         printk(")");
731
732         if (!found)
733                 printk(" *%d", link->irq.active);
734
735         if (!link->device->status.enabled)
736                 printk(", disabled.");
737
738         printk("\n");
739
740         list_add_tail(&link->list, &acpi_link_list);
741
742       end:
743         /* disable all links -- to be activated on use */
744         acpi_evaluate_object(device->handle, "_DIS", NULL, NULL);
745         mutex_unlock(&acpi_link_lock);
746
747         if (result)
748                 kfree(link);
749
750         return result;
751 }
752
753 static int acpi_pci_link_resume(struct acpi_pci_link *link)
754 {
755         if (link->refcnt && link->irq.active && link->irq.initialized)
756                 return (acpi_pci_link_set(link, link->irq.active));
757
758         return 0;
759 }
760
761 static int irqrouter_resume(struct sys_device *dev)
762 {
763         struct acpi_pci_link *link;
764
765         list_for_each_entry(link, &acpi_link_list, list) {
766                 acpi_pci_link_resume(link);
767         }
768         return 0;
769 }
770
771 static int acpi_pci_link_remove(struct acpi_device *device, int type)
772 {
773         struct acpi_pci_link *link;
774
775         link = acpi_driver_data(device);
776
777         mutex_lock(&acpi_link_lock);
778         list_del(&link->list);
779         mutex_unlock(&acpi_link_lock);
780
781         kfree(link);
782         return 0;
783 }
784
785 /*
786  * modify acpi_irq_penalty[] from cmdline
787  */
788 static int __init acpi_irq_penalty_update(char *str, int used)
789 {
790         int i;
791
792         for (i = 0; i < 16; i++) {
793                 int retval;
794                 int irq;
795
796                 retval = get_option(&str, &irq);
797
798                 if (!retval)
799                         break;  /* no number found */
800
801                 if (irq < 0)
802                         continue;
803
804                 if (irq >= ARRAY_SIZE(acpi_irq_penalty))
805                         continue;
806
807                 if (used)
808                         acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
809                 else
810                         acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
811
812                 if (retval != 2)        /* no next number */
813                         break;
814         }
815         return 1;
816 }
817
818 /*
819  * We'd like PNP to call this routine for the
820  * single ISA_USED value for each legacy device.
821  * But instead it calls us with each POSSIBLE setting.
822  * There is no ISA_POSSIBLE weight, so we simply use
823  * the (small) PCI_USING penalty.
824  */
825 void acpi_penalize_isa_irq(int irq, int active)
826 {
827         if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
828                 if (active)
829                         acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
830                 else
831                         acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
832         }
833 }
834
835 /*
836  * Over-ride default table to reserve additional IRQs for use by ISA
837  * e.g. acpi_irq_isa=5
838  * Useful for telling ACPI how not to interfere with your ISA sound card.
839  */
840 static int __init acpi_irq_isa(char *str)
841 {
842         return acpi_irq_penalty_update(str, 1);
843 }
844
845 __setup("acpi_irq_isa=", acpi_irq_isa);
846
847 /*
848  * Over-ride default table to free additional IRQs for use by PCI
849  * e.g. acpi_irq_pci=7,15
850  * Used for acpi_irq_balance to free up IRQs to reduce PCI IRQ sharing.
851  */
852 static int __init acpi_irq_pci(char *str)
853 {
854         return acpi_irq_penalty_update(str, 0);
855 }
856
857 __setup("acpi_irq_pci=", acpi_irq_pci);
858
859 static int __init acpi_irq_nobalance_set(char *str)
860 {
861         acpi_irq_balance = 0;
862         return 1;
863 }
864
865 __setup("acpi_irq_nobalance", acpi_irq_nobalance_set);
866
867 static int __init acpi_irq_balance_set(char *str)
868 {
869         acpi_irq_balance = 1;
870         return 1;
871 }
872
873 __setup("acpi_irq_balance", acpi_irq_balance_set);
874
875 /* FIXME: we will remove this interface after all drivers call pci_disable_device */
876 static struct sysdev_class irqrouter_sysdev_class = {
877         .name = "irqrouter",
878         .resume = irqrouter_resume,
879 };
880
881 static struct sys_device device_irqrouter = {
882         .id = 0,
883         .cls = &irqrouter_sysdev_class,
884 };
885
886 static int __init irqrouter_init_sysfs(void)
887 {
888         int error;
889
890         if (acpi_disabled || acpi_noirq)
891                 return 0;
892
893         error = sysdev_class_register(&irqrouter_sysdev_class);
894         if (!error)
895                 error = sysdev_register(&device_irqrouter);
896
897         return error;
898 }
899
900 device_initcall(irqrouter_init_sysfs);
901
902 static int __init acpi_pci_link_init(void)
903 {
904         if (acpi_noirq)
905                 return 0;
906
907         if (acpi_irq_balance == -1) {
908                 /* no command line switch: enable balancing in IOAPIC mode */
909                 if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
910                         acpi_irq_balance = 1;
911                 else
912                         acpi_irq_balance = 0;
913         }
914
915         if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0)
916                 return -ENODEV;
917
918         return 0;
919 }
920
921 subsys_initcall(acpi_pci_link_init);