Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecc527d5 authored by Jiang Liu's avatar Jiang Liu Committed by Thomas Gleixner
Browse files

x86, irq, SFI: Use common irqdomain map interface to program IOAPIC pins



Refine SFI to use common irqdomain map interface to program IOAPIC pins,
so we can unify the callsite to progam IOAPIC pins.

Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: sfi-devel@simplefirmware.org
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Len Brown <lenb@kernel.org>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Link: http://lkml.kernel.org/r/1402302011-23642-33-git-send-email-jiang.liu@linux.intel.com


Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 95060639
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -208,27 +208,22 @@ static int pci_write(struct pci_bus *bus, unsigned int devfn, int where,

static int intel_mid_pci_irq_enable(struct pci_dev *dev)
{
	u8 pin;
	struct io_apic_irq_attr irq_attr;
	int polarity;

	pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
	if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER)
		polarity = 0; /* active high */
	else
		polarity = 1; /* active low */

	/*
	 * MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to
	 * IOAPIC RTE entries, so we just enable RTE for the device.
	 */
	if (mp_set_gsi_attr(dev->irq, 1, polarity, dev_to_node(&dev->dev)))
		return -EBUSY;
	if (mp_map_gsi_to_irq(dev->irq, IOAPIC_MAP_ALLOC) < 0)
		return -EBUSY;

	irq_attr.ioapic = mp_find_ioapic(dev->irq);
	irq_attr.ioapic_pin = dev->irq;
	irq_attr.trigger = 1; /* level */
	if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER)
		irq_attr.polarity = 0; /* active high */
	else
		irq_attr.polarity = 1; /* active low */
	io_apic_set_pci_routing(&dev->dev, dev->irq, &irq_attr);

	return 0;
}

+25 −33
Original line number Diff line number Diff line
@@ -432,9 +432,8 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
	struct sfi_table_simple *sb;
	struct sfi_device_table_entry *pentry;
	struct devs_id *dev = NULL;
	int num, i;
	int ioapic;
	struct io_apic_irq_attr irq_attr;
	int num, i, ret;
	int polarity;

	sb = (struct sfi_table_simple *)table;
	num = SFI_GET_NUM_ENTRIES(sb, struct sfi_device_table_entry);
@@ -448,37 +447,30 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
			 * devices, but they have separate RTE entry in IOAPIC
			 * so we have to enable them one by one here
			 */
			ioapic = mp_find_ioapic(irq);
			if (ioapic >= 0) {
				irq_attr.ioapic = ioapic;
				irq_attr.ioapic_pin = irq;
				irq_attr.trigger = 1;
			if (intel_mid_identify_cpu() ==
					INTEL_MID_CPU_CHIP_TANGIER) {
					if (!strncmp(pentry->name,
							"r69001-ts-i2c", 13))
				if (!strncmp(pentry->name, "r69001-ts-i2c", 13))
					/* active low */
						irq_attr.polarity = 1;
					polarity = 1;
				else if (!strncmp(pentry->name,
						"synaptics_3202", 14))
					/* active low */
						irq_attr.polarity = 1;
					polarity = 1;
				else if (irq == 41)
					/* fast_int_1 */
						irq_attr.polarity = 1;
					polarity = 1;
				else
					/* active high */
						irq_attr.polarity = 0;
					polarity = 0;
			} else {
				/* PNW and CLV go with active low */
					irq_attr.polarity = 1;
				}
				WARN_ON(mp_map_gsi_to_irq(irq,
						IOAPIC_MAP_ALLOC) < 0);
				io_apic_set_pci_routing(NULL, irq, &irq_attr);
				polarity = 1;
			}
		} else {
			irq = 0; /* No irq */

			ret = mp_set_gsi_attr(irq, 1, polarity, NUMA_NO_NODE);
			if (ret == 0)
				ret = mp_map_gsi_to_irq(irq, IOAPIC_MAP_ALLOC);
			WARN_ON(ret < 0);
		}

		dev = get_device_id(pentry->type, pentry->name);
+3 −1
Original line number Diff line number Diff line
@@ -71,7 +71,9 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table)
#endif /* CONFIG_X86_LOCAL_APIC */

#ifdef CONFIG_X86_IO_APIC
static struct irq_domain_ops sfi_ioapic_irqdomain_ops;
static struct irq_domain_ops sfi_ioapic_irqdomain_ops = {
	.map = mp_irqdomain_map,
};

static int __init sfi_parse_ioapic(struct sfi_table_header *table)
{