x86: Avoid magic number with ELCR register accesses
authorMaciej W. Rozycki <macro@orcam.me.uk>
Tue, 20 Jul 2021 03:28:09 +0000 (05:28 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 10 Aug 2021 21:31:43 +0000 (23:31 +0200)
Define PIC_ELCR1 and PIC_ELCR2 macros for accesses to the ELCR registers
implemented by many chipsets in their embedded 8259A PIC cores, avoiding
magic numbers that are difficult to handle, and complementing the macros
we already have for registers originally defined with discrete 8259A PIC
implementations.  No functional change.

Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/alpine.DEB.2.21.2107200237300.9461@angie.orcam.me.uk
arch/x86/include/asm/i8259.h
arch/x86/kernel/acpi/boot.c
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/apic/vector.c
arch/x86/kernel/i8259.c
arch/x86/kernel/mpparse.c
arch/x86/pci/irq.c

index 89789e8c80f66a97db08ffad891ed26e5025219e..637fa1df351246ac16895151e333119281d17890 100644 (file)
@@ -19,6 +19,8 @@ extern unsigned int cached_irq_mask;
 #define PIC_MASTER_OCW3                PIC_MASTER_ISR
 #define PIC_SLAVE_CMD          0xa0
 #define PIC_SLAVE_IMR          0xa1
+#define PIC_ELCR1              0x4d0
+#define PIC_ELCR2              0x4d1
 
 /* i8259A PIC related value */
 #define PIC_CASCADE_IR         2
index e55e0c1fad8c823479c21ed3606403b3b301541b..7f59f831c47c4d92cf31a46e363be22d379c41e0 100644 (file)
@@ -570,7 +570,7 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
        unsigned int old, new;
 
        /* Real old ELCR mask */
-       old = inb(0x4d0) | (inb(0x4d1) << 8);
+       old = inb(PIC_ELCR1) | (inb(PIC_ELCR2) << 8);
 
        /*
         * If we use ACPI to set PCI IRQs, then we should clear ELCR
@@ -596,8 +596,8 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
                return;
 
        pr_warn("setting ELCR to %04x (from %04x)\n", new, old);
-       outb(new, 0x4d0);
-       outb(new >> 8, 0x4d1);
+       outb(new, PIC_ELCR1);
+       outb(new >> 8, PIC_ELCR2);
 }
 
 int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp)
index d5c691a3208b69d7aba5b2321074d6175dab2dd4..7846499c54eccaa0f6c1022ec64a168814cf1758 100644 (file)
@@ -764,7 +764,7 @@ static bool irq_active_low(int idx)
 static bool EISA_ELCR(unsigned int irq)
 {
        if (irq < nr_legacy_irqs()) {
-               unsigned int port = 0x4d0 + (irq >> 3);
+               unsigned int port = PIC_ELCR1 + (irq >> 3);
                return (inb(port) >> (irq & 7)) & 1;
        }
        apic_printk(APIC_VERBOSE, KERN_INFO
index fb67ed5e7e6a8a616a46c098b814966a14f612d1..c132daabe6152282b042ece88fd6a586c1f45085 100644 (file)
@@ -1299,7 +1299,7 @@ static void __init print_PIC(void)
 
        pr_debug("... PIC  ISR: %04x\n", v);
 
-       v = inb(0x4d1) << 8 | inb(0x4d0);
+       v = inb(PIC_ELCR2) << 8 | inb(PIC_ELCR1);
        pr_debug("... PIC ELCR: %04x\n", v);
 }
 
index 282b4ee1339f87ce315c6c766a84689b2af394c6..15aefa3f3e18e5a87c9b1658b950f3b6145da989 100644 (file)
@@ -235,15 +235,15 @@ static char irq_trigger[2];
  */
 static void restore_ELCR(char *trigger)
 {
-       outb(trigger[0], 0x4d0);
-       outb(trigger[1], 0x4d1);
+       outb(trigger[0], PIC_ELCR1);
+       outb(trigger[1], PIC_ELCR2);
 }
 
 static void save_ELCR(char *trigger)
 {
        /* IRQ 0,1,2,8,13 are marked as reserved */
-       trigger[0] = inb(0x4d0) & 0xF8;
-       trigger[1] = inb(0x4d1) & 0xDE;
+       trigger[0] = inb(PIC_ELCR1) & 0xF8;
+       trigger[1] = inb(PIC_ELCR2) & 0xDE;
 }
 
 static void i8259A_resume(void)
index 8f06449aab275fe95eb8f33be960b70448ae0076..fed721f90116f9a30422b492ab366fca73d2e230 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/smp.h>
 #include <linux/pci.h>
 
+#include <asm/i8259.h>
 #include <asm/io_apic.h>
 #include <asm/acpi.h>
 #include <asm/irqdomain.h>
@@ -251,7 +252,7 @@ static int __init ELCR_trigger(unsigned int irq)
 {
        unsigned int port;
 
-       port = 0x4d0 + (irq >> 3);
+       port = PIC_ELCR1 + (irq >> 3);
        return (inb(port) >> (irq & 7)) & 1;
 }
 
index b937c96f9f85f4654587acdac8e2ca77579dfa08..97b63e35e1528b116a8d5dc7a4e78598088d6357 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/irq.h>
 #include <linux/acpi.h>
 
+#include <asm/i8259.h>
 #include <asm/pc-conf-reg.h>
 #include <asm/pci_x86.h>
 
@@ -158,7 +159,7 @@ static void __init pirq_peer_trick(void)
 void elcr_set_level_irq(unsigned int irq)
 {
        unsigned char mask = 1 << (irq & 7);
-       unsigned int port = 0x4d0 + (irq >> 3);
+       unsigned int port = PIC_ELCR1 + (irq >> 3);
        unsigned char val;
        static u16 elcr_irq_mask;