Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1380811 > unrolled thread
| Started by | Sinan Kaya <okaya@codeaurora.org> |
|---|---|
| First post | 2016-04-17 19:40 +0200 |
| Last post | 2016-04-27 02:20 +0200 |
| Articles | 9 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH V3 1/4] acpi,pci,irq: reduce resource requirements Sinan Kaya <okaya@codeaurora.org> - 2016-04-17 19:40 +0200
[PATCH V3 4/4] acpi,pci,irq: remove SCI penalize function Sinan Kaya <okaya@codeaurora.org> - 2016-04-17 19:40 +0200
[PATCH V3 2/4] acpi,pci,irq: reduce static IRQ array size to 16 Sinan Kaya <okaya@codeaurora.org> - 2016-04-17 19:40 +0200
Re: [PATCH V3 2/4] acpi,pci,irq: reduce static IRQ array size to 16 Bjorn Helgaas <helgaas@kernel.org> - 2016-04-26 20:40 +0200
Re: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements Bjorn Helgaas <helgaas@kernel.org> - 2016-04-26 20:40 +0200
Re: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements Sinan Kaya <okaya@codeaurora.org> - 2016-04-26 21:10 +0200
RE: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements "Nalla, Ravikanth" <ravikanth.nalla@hpe.com> - 2016-04-26 22:40 +0200
Re: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements Bjorn Helgaas <helgaas@kernel.org> - 2016-04-27 02:10 +0200
Re: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements "Rafael J. Wysocki" <rafael@kernel.org> - 2016-04-27 02:20 +0200
| From | Sinan Kaya <okaya@codeaurora.org> |
|---|---|
| Date | 2016-04-17 19:40 +0200 |
| Subject | [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements |
| Message-ID | <roYPU-83E-7@gated-at.bofh.it> |
Code has been redesigned to calculate penalty requirements on the fly. This
significantly simplifies the implementation and removes some of the init
calls from x86 architecture.
Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
---
drivers/acpi/pci_link.c | 97 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 68 insertions(+), 29 deletions(-)
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index ededa90..cc0ba16 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -36,6 +36,7 @@
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/acpi.h>
+#include <linux/irq.h>
#include "internal.h"
@@ -440,7 +441,6 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
#define ACPI_MAX_IRQS 256
#define ACPI_MAX_ISA_IRQ 16
-#define PIRQ_PENALTY_PCI_AVAILABLE (0)
#define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
#define PIRQ_PENALTY_PCI_USING (16*16*16)
#define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16)
@@ -457,9 +457,9 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */
PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */
PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */
- PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
- PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
- PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
+ 0, /* IRQ9 PCI, often acpi */
+ 0, /* IRQ10 PCI */
+ 0, /* IRQ11 PCI */
PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
@@ -467,6 +467,60 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
/* >IRQ15 */
};
+static int acpi_irq_pci_sharing_penalty(int irq)
+{
+ struct acpi_pci_link *link;
+ int penalty = 0;
+
+ list_for_each_entry(link, &acpi_link_list, list) {
+ /*
+ * If a link is active, penalize its IRQ heavily
+ * so we try to choose a different IRQ.
+ */
+ if (link->irq.active && link->irq.active == irq)
+ penalty += PIRQ_PENALTY_PCI_USING;
+ else {
+ int i;
+
+ /*
+ * If a link is inactive, penalize the IRQs it
+ * might use, but not as severely.
+ */
+ for (i = 0; i < link->irq.possible_count; i++)
+ if (link->irq.possible[i] == irq)
+ penalty += PIRQ_PENALTY_PCI_POSSIBLE /
+ link->irq.possible_count;
+ }
+ }
+
+ return penalty;
+}
+
+static int acpi_irq_get_penalty(int irq)
+{
+ int penalty = 0;
+
+ if (irq < ACPI_MAX_ISA_IRQ)
+ penalty += acpi_irq_penalty[irq];
+
+ /*
+ * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict
+ * with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be
+ * use for PCI IRQs.
+ */
+ if (irq == acpi_gbl_FADT.sci_interrupt) {
+ u32 type = irq_get_trigger_type(irq) & IRQ_TYPE_SENSE_MASK;
+
+ if (type != IRQ_TYPE_LEVEL_LOW)
+ penalty += PIRQ_PENALTY_ISA_ALWAYS;
+ else
+ penalty += PIRQ_PENALTY_PCI_USING;
+ }
+
+ penalty += acpi_irq_pci_sharing_penalty(irq);
+ return penalty;
+}
+
int __init acpi_irq_penalty_init(void)
{
struct acpi_pci_link *link;
@@ -547,12 +601,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
* the use of IRQs 9, 10, 11, and >15.
*/
for (i = (link->irq.possible_count - 1); i >= 0; i--) {
- if (acpi_irq_penalty[irq] >
- acpi_irq_penalty[link->irq.possible[i]])
+ if (acpi_irq_get_penalty(irq) >
+ acpi_irq_get_penalty(link->irq.possible[i]))
irq = link->irq.possible[i];
}
}
- if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
+ if (acpi_irq_get_penalty(irq) >= PIRQ_PENALTY_ISA_ALWAYS) {
printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
"Try pci=noacpi or acpi=off\n",
acpi_device_name(link->device),
@@ -568,7 +622,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
acpi_device_bid(link->device));
return -ENODEV;
} else {
- acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
acpi_device_name(link->device),
acpi_device_bid(link->device), link->irq.active);
@@ -800,9 +853,10 @@ static int __init acpi_irq_penalty_update(char *str, int used)
continue;
if (used)
- acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
+ acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
+ PIRQ_PENALTY_ISA_USED;
else
- acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
+ acpi_irq_penalty[irq] = 0;
if (retval != 2) /* no next number */
break;
@@ -819,34 +873,19 @@ static int __init acpi_irq_penalty_update(char *str, int used)
*/
void acpi_penalize_isa_irq(int irq, int active)
{
- if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
- if (active)
- acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
- else
- acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
- }
+ if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
+ acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
+ active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
}
bool acpi_isa_irq_available(int irq)
{
return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
- acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
+ acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
}
-/*
- * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with
- * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for
- * PCI IRQs.
- */
void acpi_penalize_sci_irq(int irq, int trigger, int polarity)
{
- if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
- if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
- polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
- acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_ALWAYS;
- else
- acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
- }
}
/*
--
1.8.2.1
[toc] | [next] | [standalone]
| From | Sinan Kaya <okaya@codeaurora.org> |
|---|---|
| Date | 2016-04-17 19:40 +0200 |
| Subject | [PATCH V3 4/4] acpi,pci,irq: remove SCI penalize function |
| Message-ID | <roYPV-83E-13@gated-at.bofh.it> |
| In reply to | #1380811 |
Removing the SCI penalize function as the penalty is now calculated on the
fly.
Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
---
arch/x86/kernel/acpi/boot.c | 1 -
drivers/acpi/pci_link.c | 4 ----
include/linux/acpi.h | 1 -
3 files changed, 6 deletions(-)
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 8c2f1ef..edf4840 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -445,7 +445,6 @@ static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger,
polarity = acpi_sci_flags & ACPI_MADT_POLARITY_MASK;
mp_override_legacy_irq(bus_irq, polarity, trigger, gsi);
- acpi_penalize_sci_irq(bus_irq, trigger, polarity);
/*
* stash over-ride to indicate we've been here
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index ab39208..8fc7323 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -848,10 +848,6 @@ bool acpi_isa_irq_available(int irq)
acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
}
-void acpi_penalize_sci_irq(int irq, int trigger, int polarity)
-{
-}
-
/*
* Over-ride default table to reserve additional IRQs for use by ISA
* e.g. acpi_irq_isa=5
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 06ed7e5..0f41317 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -311,7 +311,6 @@ struct pci_dev;
int acpi_pci_irq_enable (struct pci_dev *dev);
void acpi_penalize_isa_irq(int irq, int active);
bool acpi_isa_irq_available(int irq);
-void acpi_penalize_sci_irq(int irq, int trigger, int polarity);
void acpi_pci_irq_disable (struct pci_dev *dev);
extern int ec_read(u8 addr, u8 *val);
--
1.8.2.1
[toc] | [prev] | [next] | [standalone]
| From | Sinan Kaya <okaya@codeaurora.org> |
|---|---|
| Date | 2016-04-17 19:40 +0200 |
| Subject | [PATCH V3 2/4] acpi,pci,irq: reduce static IRQ array size to 16 |
| Message-ID | <roYPU-83E-11@gated-at.bofh.it> |
| In reply to | #1380811 |
Now that the supported number of PCI IRQs are no longer capped
with 256, renaming the static array to support ISA IRQs only
and removing the MAX_IRQS constant.
Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
---
drivers/acpi/pci_link.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index cc0ba16..12ea784 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -438,8 +438,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
* enabled system.
*/
-#define ACPI_MAX_IRQS 256
-#define ACPI_MAX_ISA_IRQ 16
+#define ACPI_MAX_ISA_IRQS 16
#define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
#define PIRQ_PENALTY_PCI_USING (16*16*16)
@@ -447,7 +446,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
#define PIRQ_PENALTY_ISA_USED (16*16*16*16*16)
#define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16)
-static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
+static int acpi_isa_irq_penalty[ACPI_MAX_ISA_IRQS] = {
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */
@@ -500,8 +499,8 @@ static int acpi_irq_get_penalty(int irq)
{
int penalty = 0;
- if (irq < ACPI_MAX_ISA_IRQ)
- penalty += acpi_irq_penalty[irq];
+ if (irq < ACPI_MAX_ISA_IRQS)
+ penalty += acpi_isa_irq_penalty[irq];
/*
* Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict
@@ -541,14 +540,15 @@ int __init acpi_irq_penalty_init(void)
link->irq.possible_count;
for (i = 0; i < link->irq.possible_count; i++) {
- if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ)
- acpi_irq_penalty[link->irq.
+ if (link->irq.possible[i] < ACPI_MAX_ISA_IRQS)
+ acpi_isa_irq_penalty[link->irq.
possible[i]] +=
penalty;
}
- } else if (link->irq.active) {
- acpi_irq_penalty[link->irq.active] +=
+ } else if (link->irq.active &&
+ (link->irq.active < ACPI_MAX_ISA_IRQS)) {
+ acpi_isa_irq_penalty[link->irq.active] +=
PIRQ_PENALTY_PCI_POSSIBLE;
}
}
@@ -831,7 +831,7 @@ static void acpi_pci_link_remove(struct acpi_device *device)
}
/*
- * modify acpi_irq_penalty[] from cmdline
+ * modify acpi_isa_irq_penalty[] from cmdline
*/
static int __init acpi_irq_penalty_update(char *str, int used)
{
@@ -840,24 +840,24 @@ static int __init acpi_irq_penalty_update(char *str, int used)
for (i = 0; i < 16; i++) {
int retval;
int irq;
+ int new_penalty;
retval = get_option(&str, &irq);
if (!retval)
break; /* no number found */
- if (irq < 0)
- continue;
-
- if (irq >= ARRAY_SIZE(acpi_irq_penalty))
+ /* see if this is a ISA IRQ */
+ if ((irq < 0) || (irq >= ACPI_MAX_ISA_IRQS))
continue;
if (used)
- acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
- PIRQ_PENALTY_ISA_USED;
+ new_penalty = acpi_irq_get_penalty(irq) +
+ PIRQ_PENALTY_ISA_USED;
else
- acpi_irq_penalty[irq] = 0;
+ new_penalty = 0;
+ acpi_isa_irq_penalty[irq] = new_penalty;
if (retval != 2) /* no next number */
break;
}
@@ -873,14 +873,14 @@ static int __init acpi_irq_penalty_update(char *str, int used)
*/
void acpi_penalize_isa_irq(int irq, int active)
{
- if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
- acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
+ if ((irq >= 0) && (irq < ARRAY_SIZE(acpi_isa_irq_penalty)))
+ acpi_isa_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
}
bool acpi_isa_irq_available(int irq)
{
- return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
+ return irq >= 0 && (irq >= ARRAY_SIZE(acpi_isa_irq_penalty) ||
acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
}
--
1.8.2.1
[toc] | [prev] | [next] | [standalone]
| From | Bjorn Helgaas <helgaas@kernel.org> |
|---|---|
| Date | 2016-04-26 20:40 +0200 |
| Subject | Re: [PATCH V3 2/4] acpi,pci,irq: reduce static IRQ array size to 16 |
| Message-ID | <rsg3X-3Yf-97@gated-at.bofh.it> |
| In reply to | #1380813 |
On Sun, Apr 17, 2016 at 01:36:54PM -0400, Sinan Kaya wrote:
> Now that the supported number of PCI IRQs are no longer capped
> with 256, renaming the static array to support ISA IRQs only
> and removing the MAX_IRQS constant.
>
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
> ---
> drivers/acpi/pci_link.c | 40 ++++++++++++++++++++--------------------
> 1 file changed, 20 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
> index cc0ba16..12ea784 100644
> --- a/drivers/acpi/pci_link.c
> +++ b/drivers/acpi/pci_link.c
> @@ -438,8 +438,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
> * enabled system.
> */
>
> -#define ACPI_MAX_IRQS 256
> -#define ACPI_MAX_ISA_IRQ 16
> +#define ACPI_MAX_ISA_IRQS 16
>
> #define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
> #define PIRQ_PENALTY_PCI_USING (16*16*16)
> @@ -447,7 +446,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
> #define PIRQ_PENALTY_ISA_USED (16*16*16*16*16)
> #define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16)
>
> -static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
> +static int acpi_isa_irq_penalty[ACPI_MAX_ISA_IRQS] = {
> PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */
> PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */
> PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */
> @@ -500,8 +499,8 @@ static int acpi_irq_get_penalty(int irq)
> {
> int penalty = 0;
>
> - if (irq < ACPI_MAX_ISA_IRQ)
> - penalty += acpi_irq_penalty[irq];
> + if (irq < ACPI_MAX_ISA_IRQS)
Nit: sometimes you use "irq < ACPI_MAX_ISA_IRQS", other times you use
"irq < ARRAY_SIZE(acpi_isa_irq_penalty)". Seems like they could be
consistent.
> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
> - acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
> + if ((irq >= 0) && (irq < ARRAY_SIZE(acpi_isa_irq_penalty)))
> + acpi_isa_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
> active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
> }
>
> bool acpi_isa_irq_available(int irq)
> {
> - return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
> + return irq >= 0 && (irq >= ARRAY_SIZE(acpi_isa_irq_penalty) ||
> acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
> }
>
> --
> 1.8.2.1
>
[toc] | [prev] | [next] | [standalone]
| From | Bjorn Helgaas <helgaas@kernel.org> |
|---|---|
| Date | 2016-04-26 20:40 +0200 |
| Message-ID | <rsg3V-3Yf-41@gated-at.bofh.it> |
| In reply to | #1380811 |
On Sun, Apr 17, 2016 at 01:36:53PM -0400, Sinan Kaya wrote:
> Code has been redesigned to calculate penalty requirements on the fly. This
> significantly simplifies the implementation and removes some of the init
> calls from x86 architecture.
>
> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
For all four patches:
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/acpi/pci_link.c | 97 ++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 68 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
> index ededa90..cc0ba16 100644
> --- a/drivers/acpi/pci_link.c
> +++ b/drivers/acpi/pci_link.c
> @@ -36,6 +36,7 @@
> #include <linux/mutex.h>
> #include <linux/slab.h>
> #include <linux/acpi.h>
> +#include <linux/irq.h>
>
> #include "internal.h"
>
> @@ -440,7 +441,6 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
> #define ACPI_MAX_IRQS 256
> #define ACPI_MAX_ISA_IRQ 16
>
> -#define PIRQ_PENALTY_PCI_AVAILABLE (0)
> #define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
> #define PIRQ_PENALTY_PCI_USING (16*16*16)
> #define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16)
> @@ -457,9 +457,9 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */
> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */
> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */
> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
> + 0, /* IRQ9 PCI, often acpi */
> + 0, /* IRQ10 PCI */
> + 0, /* IRQ11 PCI */
> PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
> PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
> PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
> @@ -467,6 +467,60 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
> /* >IRQ15 */
> };
>
> +static int acpi_irq_pci_sharing_penalty(int irq)
> +{
> + struct acpi_pci_link *link;
> + int penalty = 0;
> +
> + list_for_each_entry(link, &acpi_link_list, list) {
> + /*
> + * If a link is active, penalize its IRQ heavily
> + * so we try to choose a different IRQ.
> + */
> + if (link->irq.active && link->irq.active == irq)
> + penalty += PIRQ_PENALTY_PCI_USING;
> + else {
> + int i;
> +
> + /*
> + * If a link is inactive, penalize the IRQs it
> + * might use, but not as severely.
> + */
> + for (i = 0; i < link->irq.possible_count; i++)
> + if (link->irq.possible[i] == irq)
> + penalty += PIRQ_PENALTY_PCI_POSSIBLE /
> + link->irq.possible_count;
> + }
> + }
> +
> + return penalty;
> +}
> +
> +static int acpi_irq_get_penalty(int irq)
> +{
> + int penalty = 0;
> +
> + if (irq < ACPI_MAX_ISA_IRQ)
> + penalty += acpi_irq_penalty[irq];
> +
> + /*
> + * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict
> + * with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be
> + * use for PCI IRQs.
> + */
> + if (irq == acpi_gbl_FADT.sci_interrupt) {
> + u32 type = irq_get_trigger_type(irq) & IRQ_TYPE_SENSE_MASK;
> +
> + if (type != IRQ_TYPE_LEVEL_LOW)
> + penalty += PIRQ_PENALTY_ISA_ALWAYS;
> + else
> + penalty += PIRQ_PENALTY_PCI_USING;
> + }
> +
> + penalty += acpi_irq_pci_sharing_penalty(irq);
> + return penalty;
> +}
> +
> int __init acpi_irq_penalty_init(void)
> {
> struct acpi_pci_link *link;
> @@ -547,12 +601,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
> * the use of IRQs 9, 10, 11, and >15.
> */
> for (i = (link->irq.possible_count - 1); i >= 0; i--) {
> - if (acpi_irq_penalty[irq] >
> - acpi_irq_penalty[link->irq.possible[i]])
> + if (acpi_irq_get_penalty(irq) >
> + acpi_irq_get_penalty(link->irq.possible[i]))
> irq = link->irq.possible[i];
> }
> }
> - if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
> + if (acpi_irq_get_penalty(irq) >= PIRQ_PENALTY_ISA_ALWAYS) {
> printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
> "Try pci=noacpi or acpi=off\n",
> acpi_device_name(link->device),
> @@ -568,7 +622,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
> acpi_device_bid(link->device));
> return -ENODEV;
> } else {
> - acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
> printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
> acpi_device_name(link->device),
> acpi_device_bid(link->device), link->irq.active);
> @@ -800,9 +853,10 @@ static int __init acpi_irq_penalty_update(char *str, int used)
> continue;
>
> if (used)
> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
> + PIRQ_PENALTY_ISA_USED;
> else
> - acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
> + acpi_irq_penalty[irq] = 0;
>
> if (retval != 2) /* no next number */
> break;
> @@ -819,34 +873,19 @@ static int __init acpi_irq_penalty_update(char *str, int used)
> */
> void acpi_penalize_isa_irq(int irq, int active)
> {
> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
> - if (active)
> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
> - else
> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
> - }
> + if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
> + active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
> }
>
> bool acpi_isa_irq_available(int irq)
> {
> return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
> - acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
> + acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
> }
>
> -/*
> - * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with
> - * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for
> - * PCI IRQs.
> - */
> void acpi_penalize_sci_irq(int irq, int trigger, int polarity)
> {
> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
> - if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
> - polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_ALWAYS;
> - else
> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
> - }
> }
>
> /*
> --
> 1.8.2.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
[toc] | [prev] | [next] | [standalone]
| From | Sinan Kaya <okaya@codeaurora.org> |
|---|---|
| Date | 2016-04-26 21:10 +0200 |
| Message-ID | <rsgwW-4xy-23@gated-at.bofh.it> |
| In reply to | #1387851 |
On 4/26/2016 2:36 PM, Bjorn Helgaas wrote:
> On Sun, Apr 17, 2016 at 01:36:53PM -0400, Sinan Kaya wrote:
>> Code has been redesigned to calculate penalty requirements on the fly. This
>> significantly simplifies the implementation and removes some of the init
>> calls from x86 architecture.
>>
>> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
>
> For all four patches:
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Thanks, can the HPE developers in CC test the series in order to avoid another revert?
>
>> ---
>> drivers/acpi/pci_link.c | 97 ++++++++++++++++++++++++++++++++++---------------
>> 1 file changed, 68 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
>> index ededa90..cc0ba16 100644
>> --- a/drivers/acpi/pci_link.c
>> +++ b/drivers/acpi/pci_link.c
>> @@ -36,6 +36,7 @@
>> #include <linux/mutex.h>
>> #include <linux/slab.h>
>> #include <linux/acpi.h>
>> +#include <linux/irq.h>
>>
>> #include "internal.h"
>>
>> @@ -440,7 +441,6 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
>> #define ACPI_MAX_IRQS 256
>> #define ACPI_MAX_ISA_IRQ 16
>>
>> -#define PIRQ_PENALTY_PCI_AVAILABLE (0)
>> #define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
>> #define PIRQ_PENALTY_PCI_USING (16*16*16)
>> #define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16)
>> @@ -457,9 +457,9 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
>> + 0, /* IRQ9 PCI, often acpi */
>> + 0, /* IRQ10 PCI */
>> + 0, /* IRQ11 PCI */
>> PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
>> PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
>> PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
>> @@ -467,6 +467,60 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
>> /* >IRQ15 */
>> };
>>
>> +static int acpi_irq_pci_sharing_penalty(int irq)
>> +{
>> + struct acpi_pci_link *link;
>> + int penalty = 0;
>> +
>> + list_for_each_entry(link, &acpi_link_list, list) {
>> + /*
>> + * If a link is active, penalize its IRQ heavily
>> + * so we try to choose a different IRQ.
>> + */
>> + if (link->irq.active && link->irq.active == irq)
>> + penalty += PIRQ_PENALTY_PCI_USING;
>> + else {
>> + int i;
>> +
>> + /*
>> + * If a link is inactive, penalize the IRQs it
>> + * might use, but not as severely.
>> + */
>> + for (i = 0; i < link->irq.possible_count; i++)
>> + if (link->irq.possible[i] == irq)
>> + penalty += PIRQ_PENALTY_PCI_POSSIBLE /
>> + link->irq.possible_count;
>> + }
>> + }
>> +
>> + return penalty;
>> +}
>> +
>> +static int acpi_irq_get_penalty(int irq)
>> +{
>> + int penalty = 0;
>> +
>> + if (irq < ACPI_MAX_ISA_IRQ)
>> + penalty += acpi_irq_penalty[irq];
>> +
>> + /*
>> + * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict
>> + * with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be
>> + * use for PCI IRQs.
>> + */
>> + if (irq == acpi_gbl_FADT.sci_interrupt) {
>> + u32 type = irq_get_trigger_type(irq) & IRQ_TYPE_SENSE_MASK;
>> +
>> + if (type != IRQ_TYPE_LEVEL_LOW)
>> + penalty += PIRQ_PENALTY_ISA_ALWAYS;
>> + else
>> + penalty += PIRQ_PENALTY_PCI_USING;
>> + }
>> +
>> + penalty += acpi_irq_pci_sharing_penalty(irq);
>> + return penalty;
>> +}
>> +
>> int __init acpi_irq_penalty_init(void)
>> {
>> struct acpi_pci_link *link;
>> @@ -547,12 +601,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
>> * the use of IRQs 9, 10, 11, and >15.
>> */
>> for (i = (link->irq.possible_count - 1); i >= 0; i--) {
>> - if (acpi_irq_penalty[irq] >
>> - acpi_irq_penalty[link->irq.possible[i]])
>> + if (acpi_irq_get_penalty(irq) >
>> + acpi_irq_get_penalty(link->irq.possible[i]))
>> irq = link->irq.possible[i];
>> }
>> }
>> - if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
>> + if (acpi_irq_get_penalty(irq) >= PIRQ_PENALTY_ISA_ALWAYS) {
>> printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
>> "Try pci=noacpi or acpi=off\n",
>> acpi_device_name(link->device),
>> @@ -568,7 +622,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
>> acpi_device_bid(link->device));
>> return -ENODEV;
>> } else {
>> - acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
>> printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
>> acpi_device_name(link->device),
>> acpi_device_bid(link->device), link->irq.active);
>> @@ -800,9 +853,10 @@ static int __init acpi_irq_penalty_update(char *str, int used)
>> continue;
>>
>> if (used)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
>> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
>> + PIRQ_PENALTY_ISA_USED;
>> else
>> - acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
>> + acpi_irq_penalty[irq] = 0;
>>
>> if (retval != 2) /* no next number */
>> break;
>> @@ -819,34 +873,19 @@ static int __init acpi_irq_penalty_update(char *str, int used)
>> */
>> void acpi_penalize_isa_irq(int irq, int active)
>> {
>> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
>> - if (active)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
>> - else
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
>> - }
>> + if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
>> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
>> + active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
>> }
>>
>> bool acpi_isa_irq_available(int irq)
>> {
>> return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
>> - acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
>> + acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
>> }
>>
>> -/*
>> - * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict with
>> - * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be use for
>> - * PCI IRQs.
>> - */
>> void acpi_penalize_sci_irq(int irq, int trigger, int polarity)
>> {
>> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
>> - if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
>> - polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_ALWAYS;
>> - else
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
>> - }
>> }
>>
>> /*
>> --
>> 1.8.2.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Sinan Kaya
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
[toc] | [prev] | [next] | [standalone]
| From | "Nalla, Ravikanth" <ravikanth.nalla@hpe.com> |
|---|---|
| Date | 2016-04-26 22:40 +0200 |
| Message-ID | <rshW4-5I2-53@gated-at.bofh.it> |
| In reply to | #1387918 |
Hi Sinan Kaya,
Will verify and comeback with the results soon.
Thanks,
Ravi
-----Original Message-----
From: Sinan Kaya [mailto:okaya@codeaurora.org]
Sent: Wednesday, April 27, 2016 12:30 AM
To: Bjorn Helgaas <helgaas@kernel.org>
Cc: linux-acpi@vger.kernel.org; timur@codeaurora.org; cov@codeaurora.org; linux-pci@vger.kernel.org; Nalla, Ravikanth <ravikanth.nalla@hpe.com>; lenb@kernel.org; K, Harish (MCOU/UPEL) <harish.k@hpe.com>; Reghunandanan, Ashwin (STSD) <ashwin.reghunandanan@hpe.com>; bhelgaas@google.com; rjw@rjwysocki.net; linux-kernel@vger.kernel.org
Subject: Re: [PATCH V3 1/4] acpi,pci,irq: reduce resource requirements
On 4/26/2016 2:36 PM, Bjorn Helgaas wrote:
> On Sun, Apr 17, 2016 at 01:36:53PM -0400, Sinan Kaya wrote:
>> Code has been redesigned to calculate penalty requirements on the
>> fly. This significantly simplifies the implementation and removes
>> some of the init calls from x86 architecture.
>>
>> Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
>
> For all four patches:
>
> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Thanks, can the HPE developers in CC test the series in order to avoid another revert?
>
>> ---
>> drivers/acpi/pci_link.c | 97
>> ++++++++++++++++++++++++++++++++++---------------
>> 1 file changed, 68 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index
>> ededa90..cc0ba16 100644
>> --- a/drivers/acpi/pci_link.c
>> +++ b/drivers/acpi/pci_link.c
>> @@ -36,6 +36,7 @@
>> #include <linux/mutex.h>
>> #include <linux/slab.h>
>> #include <linux/acpi.h>
>> +#include <linux/irq.h>
>>
>> #include "internal.h"
>>
>> @@ -440,7 +441,6 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
>> #define ACPI_MAX_IRQS 256
>> #define ACPI_MAX_ISA_IRQ 16
>>
>> -#define PIRQ_PENALTY_PCI_AVAILABLE (0)
>> #define PIRQ_PENALTY_PCI_POSSIBLE (16*16)
>> #define PIRQ_PENALTY_PCI_USING (16*16*16)
>> #define PIRQ_PENALTY_ISA_TYPICAL (16*16*16*16)
>> @@ -457,9 +457,9 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ6 */
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ7 parallel, spurious */
>> PIRQ_PENALTY_ISA_TYPICAL, /* IRQ8 rtc, sometimes */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ9 PCI, often acpi */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ10 PCI */
>> - PIRQ_PENALTY_PCI_AVAILABLE, /* IRQ11 PCI */
>> + 0, /* IRQ9 PCI, often acpi */
>> + 0, /* IRQ10 PCI */
>> + 0, /* IRQ11 PCI */
>> PIRQ_PENALTY_ISA_USED, /* IRQ12 mouse */
>> PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
>> PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
>> @@ -467,6 +467,60 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
>> /* >IRQ15 */
>> };
>>
>> +static int acpi_irq_pci_sharing_penalty(int irq) {
>> + struct acpi_pci_link *link;
>> + int penalty = 0;
>> +
>> + list_for_each_entry(link, &acpi_link_list, list) {
>> + /*
>> + * If a link is active, penalize its IRQ heavily
>> + * so we try to choose a different IRQ.
>> + */
>> + if (link->irq.active && link->irq.active == irq)
>> + penalty += PIRQ_PENALTY_PCI_USING;
>> + else {
>> + int i;
>> +
>> + /*
>> + * If a link is inactive, penalize the IRQs it
>> + * might use, but not as severely.
>> + */
>> + for (i = 0; i < link->irq.possible_count; i++)
>> + if (link->irq.possible[i] == irq)
>> + penalty += PIRQ_PENALTY_PCI_POSSIBLE /
>> + link->irq.possible_count;
>> + }
>> + }
>> +
>> + return penalty;
>> +}
>> +
>> +static int acpi_irq_get_penalty(int irq) {
>> + int penalty = 0;
>> +
>> + if (irq < ACPI_MAX_ISA_IRQ)
>> + penalty += acpi_irq_penalty[irq];
>> +
>> + /*
>> + * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict
>> + * with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be
>> + * use for PCI IRQs.
>> + */
>> + if (irq == acpi_gbl_FADT.sci_interrupt) {
>> + u32 type = irq_get_trigger_type(irq) & IRQ_TYPE_SENSE_MASK;
>> +
>> + if (type != IRQ_TYPE_LEVEL_LOW)
>> + penalty += PIRQ_PENALTY_ISA_ALWAYS;
>> + else
>> + penalty += PIRQ_PENALTY_PCI_USING;
>> + }
>> +
>> + penalty += acpi_irq_pci_sharing_penalty(irq);
>> + return penalty;
>> +}
>> +
>> int __init acpi_irq_penalty_init(void) {
>> struct acpi_pci_link *link;
>> @@ -547,12 +601,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
>> * the use of IRQs 9, 10, 11, and >15.
>> */
>> for (i = (link->irq.possible_count - 1); i >= 0; i--) {
>> - if (acpi_irq_penalty[irq] >
>> - acpi_irq_penalty[link->irq.possible[i]])
>> + if (acpi_irq_get_penalty(irq) >
>> + acpi_irq_get_penalty(link->irq.possible[i]))
>> irq = link->irq.possible[i];
>> }
>> }
>> - if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
>> + if (acpi_irq_get_penalty(irq) >= PIRQ_PENALTY_ISA_ALWAYS) {
>> printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
>> "Try pci=noacpi or acpi=off\n",
>> acpi_device_name(link->device), @@ -568,7 +622,6 @@ static
>> int acpi_pci_link_allocate(struct acpi_pci_link *link)
>> acpi_device_bid(link->device));
>> return -ENODEV;
>> } else {
>> - acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
>> printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
>> acpi_device_name(link->device),
>> acpi_device_bid(link->device), link->irq.active); @@ -800,9
>> +853,10 @@ static int __init acpi_irq_penalty_update(char *str, int used)
>> continue;
>>
>> if (used)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
>> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
>> + PIRQ_PENALTY_ISA_USED;
>> else
>> - acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
>> + acpi_irq_penalty[irq] = 0;
>>
>> if (retval != 2) /* no next number */
>> break;
>> @@ -819,34 +873,19 @@ static int __init acpi_irq_penalty_update(char *str, int used)
>> */
>> void acpi_penalize_isa_irq(int irq, int active) {
>> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
>> - if (active)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
>> - else
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
>> - }
>> + if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty))
>> + acpi_irq_penalty[irq] = acpi_irq_get_penalty(irq) +
>> + active ? PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING;
>> }
>>
>> bool acpi_isa_irq_available(int irq) {
>> return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
>> - acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
>> + acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
>> }
>>
>> -/*
>> - * Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes
>> conflict with
>> - * PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be
>> use for
>> - * PCI IRQs.
>> - */
>> void acpi_penalize_sci_irq(int irq, int trigger, int polarity) {
>> - if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
>> - if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
>> - polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_ALWAYS;
>> - else
>> - acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
>> - }
>> }
>>
>> /*
>> --
>> 1.8.2.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pci"
>> in the body of a message to majordomo@vger.kernel.org More majordomo
>> info at http://vger.kernel.org/majordomo-info.html
--
Sinan Kaya
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
[toc] | [prev] | [next] | [standalone]
| From | Bjorn Helgaas <helgaas@kernel.org> |
|---|---|
| Date | 2016-04-27 02:10 +0200 |
| Message-ID | <rsldf-8vJ-1@gated-at.bofh.it> |
| In reply to | #1387851 |
On Tue, Apr 26, 2016 at 01:36:11PM -0500, Bjorn Helgaas wrote: > On Sun, Apr 17, 2016 at 01:36:53PM -0400, Sinan Kaya wrote: > > Code has been redesigned to calculate penalty requirements on the fly. This > > significantly simplifies the implementation and removes some of the init > > calls from x86 architecture. > > > > Signed-off-by: Sinan Kaya <okaya@codeaurora.org> > > For all four patches: > > Acked-by: Bjorn Helgaas <bhelgaas@google.com> Rafael, I should have mentioned that I'm assuming you'll take these because they're in drivers/acpi and you merged the previous ones, e.g., 0971686954f9 ACPI / PCI: Simplify acpi_penalize_isa_irq() 37c5939136d7 ACPI, PCI, irq: remove interrupt number restriction b5bd02695471 ACPI, PCI, irq: remove interrupt count restriction Just let me know if you'd rather have me take them. Bjorn
[toc] | [prev] | [next] | [standalone]
| From | "Rafael J. Wysocki" <rafael@kernel.org> |
|---|---|
| Date | 2016-04-27 02:20 +0200 |
| Message-ID | <rslmY-92-49@gated-at.bofh.it> |
| In reply to | #1388385 |
On Wed, Apr 27, 2016 at 2:06 AM, Bjorn Helgaas <helgaas@kernel.org> wrote: > On Tue, Apr 26, 2016 at 01:36:11PM -0500, Bjorn Helgaas wrote: >> On Sun, Apr 17, 2016 at 01:36:53PM -0400, Sinan Kaya wrote: >> > Code has been redesigned to calculate penalty requirements on the fly. This >> > significantly simplifies the implementation and removes some of the init >> > calls from x86 architecture. >> > >> > Signed-off-by: Sinan Kaya <okaya@codeaurora.org> >> >> For all four patches: >> >> Acked-by: Bjorn Helgaas <bhelgaas@google.com> > > Rafael, I should have mentioned that I'm assuming you'll take these > because they're in drivers/acpi and you merged the previous ones, > e.g., > > 0971686954f9 ACPI / PCI: Simplify acpi_penalize_isa_irq() > 37c5939136d7 ACPI, PCI, irq: remove interrupt number restriction > b5bd02695471 ACPI, PCI, irq: remove interrupt count restriction > > Just let me know if you'd rather have me take them. I can handle them. I'll wait for the testing feedback from the HPE people though in case there are any problems.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web