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