From: AMEET M. PARANJAPE <aparanja@redhat.com> Date: Tue, 31 Mar 2009 11:05:09 -0400 Subject: [ppc] add support for ibm,req#msi-x Message-id: 20090331150256.14954.64480.sendpatchset@squad5-lp1.lab.bos.redhat.com O-Subject: [PATCH RHEL5.4 BZ492580 3/8] Bugzilla: 492580 RH-Acked-by: David Howells <dhowells@redhat.com> RH-Acked-by: David Howells <dhowells@redhat.com> RHBZ#: ====== https://bugzilla.redhat.com/show_bug.cgi?id=492580 Description: =========== Firmware encodes the number of MSI-X requested by a device in a different property than for MSI. Pull the property name out as a parameter and share the logic for both cases. RHEL Version Found: ================ RHEL 5.3 kABI Status: ============ No symbols were harmed. Brew: ===== Built on all platforms. http://brewweb.devel.redhat.com/brew/taskinfo?taskID=1744271 Upstream Status: ================ http://git.kernel.org/?p=linux/kernel/git/benh/powerpc.git;a=commit;h=3a51c0cbea947dc9194e18f11661eaa4dbfc5c13 Test Status: ============ There is a testcase provided in the Bugzilla. A 'cat /proc/interrupts' should show the device drivers has two interrupt entries for each port. Run I/O tests. Then 'lspci -vv' should display the correct pci capabilities for the installed adapter and show the adapter is using MSI-X interrupts opposed to MSO or LSI interrupts. =============================================================== Ameet Paranjape 978-392-3903 ext 23903 IBM on-site partner Proposed Patch: =============== diff --git a/arch/powerpc/kernel/msi-rtas.c b/arch/powerpc/kernel/msi-rtas.c index 11408d4..afdbe6a 100644 --- a/arch/powerpc/kernel/msi-rtas.c +++ b/arch/powerpc/kernel/msi-rtas.c @@ -126,7 +126,7 @@ static void rtas_teardown_msi_irqs(struct pci_dev *pdev) rtas_disable_msi(pdev); } -static int check_req_msi(struct pci_dev *pdev, int nvec) +static int check_req(struct pci_dev *pdev, int nvec, char *prop_name) { struct device_node *dn; struct pci_dn *pdn; @@ -138,24 +138,34 @@ static int check_req_msi(struct pci_dev *pdev, int nvec) dn = pdn->node; - req_msi = get_property(dn, "ibm,req#msi", NULL); + req_msi = get_property(dn, prop_name, NULL); if (!req_msi) { - pr_debug("rtas_msi: No ibm,req#msi on %s\n", dn->full_name); + pr_debug("rtas_msi: No %s on %s\n", prop_name, dn->full_name); return -ENOENT; } if (*req_msi < nvec) { - pr_debug("rtas_msi: ibm,req#msi requests < %d MSIs\n", nvec); + pr_debug("rtas_msi: %s requests < %d MSIs\n", prop_name, nvec); return -ENOSPC; } return 0; } +static int check_req_msi(struct pci_dev *pdev, int nvec) +{ + return check_req(pdev, nvec, "ibm,req#msi"); +} + +static int check_req_msix(struct pci_dev *pdev, int nvec) +{ + return check_req(pdev, nvec, "ibm,req#msi-x"); +} + static int rtas_msi_check_device(struct pci_dev *pdev, int nvec, int type) { if (type == PCI_CAP_ID_MSIX) - pr_debug("rtas_msi: MSI-X untested, trying anyway.\n"); + return check_req_msix(pdev, nvec); return check_req_msi(pdev, nvec); }