Commit d2531661 authored by Maciej W. Rozycki's avatar Maciej W. Rozycki Committed by Thomas Gleixner
Browse files

x86: Avoid magic number with ELCR register accesses



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: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/alpine.DEB.2.21.2107200237300.9461@angie.orcam.me.uk
parent 0e8c6f56
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);
}

+4 −4
Original line number Diff line number Diff line
@@ -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)
Loading