diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-19 18:13:56 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-19 18:13:56 -0800 |
commit | 65918602d80e42ea4b71f6b2fe0c2603b1a9fc07 (patch) | |
tree | 00839efa7f511f49b0110b5497fb0abd10210855 /pci | |
parent | a934cef80385908677760f918521d9f4f0f38089 (diff) | |
download | patches-65918602d80e42ea4b71f6b2fe0c2603b1a9fc07.tar.gz |
pci msi updated patches
Diffstat (limited to 'pci')
-rw-r--r-- | pci/altix-msi-support.patch (renamed from pci/pci-altix-msi-support.patch) | 100 | ||||
-rw-r--r-- | pci/msi-vector-targeting-abstractions.patch (renamed from pci/pci-msi-vector-targeting-abstractions.patch) | 146 | ||||
-rw-r--r-- | pci/pci-clean-up-msi.c-a-bit.patch | 10 | ||||
-rw-r--r-- | pci/per-platform-ia64_-first-last-_device_vector-definitions.patch (renamed from pci/pci-per-platform-ia64_-first-last-_device_vector-definitions.patch) | 22 |
4 files changed, 137 insertions, 141 deletions
diff --git a/pci/pci-altix-msi-support.patch b/pci/altix-msi-support.patch index 9431c170e6c0d..51848e6327313 100644 --- a/pci/pci-altix-msi-support.patch +++ b/pci/altix-msi-support.patch @@ -1,9 +1,9 @@ -From owner-linux-pci@atrey.karlin.mff.cuni.cz Wed Jan 11 15:43:59 2006 -Date: Wed, 11 Jan 2006 16:16:48 -0600 (CST) +From owner-linux-pci@atrey.karlin.mff.cuni.cz Thu Jan 19 11:47:09 2006 +Date: Thu, 19 Jan 2006 13:47:02 -0600 (CST) From: Mark Maule <maule@sgi.com> Cc: Tony Luck <tony.luck@intel.com>, gregkh@suse.de, Mark Maule <maule@sgi.com> -Message-Id: <20060111221648.28765.41741.34942@attica.americas.sgi.com> -Subject: PCI: altix: msi support +Message-Id: <20060119194702.12213.16524.93275@lnx-maule.americas.sgi.com> +Subject: [PATCH 3/3] altix: msi support MSI callouts for altix. Involves a fair amount of code reorg in sn irq.c code as well as adding some extensions to the altix PCI provider abstaction. @@ -258,14 +258,14 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +struct list_head **sn_irq_lh; static spinlock_t sn_irq_info_lock = SPIN_LOCK_UNLOCKED; /* non-IRQ lock */ --static inline uint64_t sn_intr_alloc(nasid_t local_nasid, int local_widget, +-static inline u64 sn_intr_alloc(nasid_t local_nasid, int local_widget, - u64 sn_irq_info, -+uint64_t sn_intr_alloc(nasid_t local_nasid, int local_widget, ++u64 sn_intr_alloc(nasid_t local_nasid, int local_widget, + struct sn_irq_info *sn_irq_info, int req_irq, nasid_t req_nasid, int req_slice) { -@@ -39,12 +39,13 @@ static inline uint64_t sn_intr_alloc(nas +@@ -39,12 +39,13 @@ static inline u64 sn_intr_alloc(nasid_t SAL_CALL_NOLOCK(ret_stuff, (u64) SN_SAL_IOIF_INTERRUPT, (u64) SAL_INTR_ALLOC, (u64) local_nasid, @@ -307,7 +307,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - list_for_each_entry_safe(sn_irq_info, sn_irq_info_safe, - sn_irq_lh[irq], list) { -- uint64_t bridge; +- u64 bridge; - int local_widget, status; - nasid_t local_nasid; - struct sn_irq_info *new_irq_info; @@ -318,7 +318,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - break; - memcpy(new_irq_info, sn_irq_info, sizeof(struct sn_irq_info)); - -- bridge = (uint64_t) new_irq_info->irq_bridge; +- bridge = (u64) new_irq_info->irq_bridge; - if (!bridge) { - kfree(new_irq_info); - break; /* irq is not a device interrupt */ @@ -326,7 +326,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + memcpy(new_irq_info, sn_irq_info, sizeof(struct sn_irq_info)); - local_nasid = NASID_GET(bridge); -+ bridge = (uint64_t) new_irq_info->irq_bridge; ++ bridge = (u64) new_irq_info->irq_bridge; + if (!bridge) { + kfree(new_irq_info); + return NULL; /* irq is not a device interrupt */ @@ -482,8 +482,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> static dma_addr_t pcibr_dmamap_ate32(struct pcidev_info *info, -- uint64_t paddr, size_t req_size, uint64_t flags) -+ uint64_t paddr, size_t req_size, uint64_t flags, int dma_flags) +- u64 paddr, size_t req_size, u64 flags) ++ u64 paddr, size_t req_size, u64 flags, int dma_flags) { struct pcidev_info *pcidev_info = info->pdi_host_pcidev_info; @@ -526,13 +526,13 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> } static dma_addr_t - pcibr_dmatrans_direct64(struct pcidev_info * info, uint64_t paddr, -- uint64_t dma_attributes) -+ uint64_t dma_attributes, int dma_flags) + pcibr_dmatrans_direct64(struct pcidev_info * info, u64 paddr, +- u64 dma_attributes) ++ u64 dma_attributes, int dma_flags) { struct pcibus_info *pcibus_info = (struct pcibus_info *) ((info->pdi_host_pcidev_info)->pdi_pcibus_info); - uint64_t pci_addr; + u64 pci_addr; /* Translate to Crosstalk View of Physical Address */ - pci_addr = (IS_PIC_SOFT(pcibus_info) ? PHYS_TO_DMA(paddr) : @@ -549,7 +549,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> /* Handle Bus mode */ if (IS_PCIX(pcibus_info)) @@ -130,7 +147,9 @@ pcibr_dmatrans_direct64(struct pcidev_in - ((uint64_t) pcibus_info-> + ((u64) pcibus_info-> pbi_hub_xid << PIC_PCI64_ATTR_TARG_SHFT); } else - pci_addr |= TIOCP_PCI64_CMDTYPE_MEM; @@ -563,8 +563,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> static dma_addr_t pcibr_dmatrans_direct32(struct pcidev_info * info, -- uint64_t paddr, size_t req_size, uint64_t flags) -+ uint64_t paddr, size_t req_size, uint64_t flags, int dma_flags) +- u64 paddr, size_t req_size, u64 flags) ++ u64 paddr, size_t req_size, u64 flags, int dma_flags) { struct pcidev_info *pcidev_info = info->pdi_host_pcidev_info; @@ -585,7 +585,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> xio_base = pcibus_info->pbi_dir_xbase; offset = xio_addr - xio_base; -@@ -333,7 +358,7 @@ void sn_dma_flush(uint64_t addr) +@@ -333,7 +358,7 @@ void sn_dma_flush(u64 addr) */ dma_addr_t @@ -645,11 +645,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> @@ -515,11 +515,17 @@ tioca_dma_unmap(struct pci_dev *pdev, dm * use the GART mapped mode. */ - static uint64_t --tioca_dma_map(struct pci_dev *pdev, uint64_t paddr, size_t byte_count) -+tioca_dma_map(struct pci_dev *pdev, uint64_t paddr, size_t byte_count, int dma_flags) + static u64 +-tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count) ++tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) { - uint64_t mapaddr; + u64 mapaddr; /* + * Not supported for now ... @@ -681,11 +681,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + * 61 - msi bit ... specified through dma_flags * 60:54 - reserved, MBZ */ - static uint64_t + static u64 -tioce_dma_d64(unsigned long ct_addr) +tioce_dma_d64(unsigned long ct_addr, int dma_flags) { - uint64_t bus_addr; + u64 bus_addr; bus_addr = ct_addr | (1UL << 63); + if (dma_flags & SN_DMA_MSI) @@ -695,10 +695,10 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> } @@ -143,7 +146,7 @@ pcidev_to_tioce(struct pci_dev *pdev, st */ - static uint64_t + static u64 tioce_alloc_map(struct tioce_kernel *ce_kern, int type, int port, -- uint64_t ct_addr, int len) -+ uint64_t ct_addr, int len, int dma_flags) +- u64 ct_addr, int len) ++ u64 ct_addr, int len, int dma_flags) { int i; int j; @@ -707,9 +707,9 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> int nates; int pagesize; + int msi_capable, msi_wanted; - uint64_t *ate_shadow; - uint64_t *ate_reg; - uint64_t addr; + u64 *ate_shadow; + u64 *ate_reg; + u64 addr; @@ -173,6 +177,7 @@ tioce_alloc_map(struct tioce_kernel *ce_ ate_reg = ce_mmr->ce_ure_ate3240; pagesize = ce_kern->ce_ate3240_pagesize; @@ -745,7 +745,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> return 0; @@ -226,7 +237,7 @@ tioce_alloc_map(struct tioce_kernel *ce_ for (j = 0; j < nates; j++) { - uint64_t ate; + u64 ate; - ate = ATE_MAKE(addr, pagesize); + ate = ATE_MAKE(addr, pagesize, msi_wanted); @@ -755,14 +755,14 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> @@ -253,7 +264,7 @@ tioce_alloc_map(struct tioce_kernel *ce_ * Map @paddr into 32-bit bus space of the CE associated with @pcidev_info. */ - static uint64_t --tioce_dma_d32(struct pci_dev *pdev, uint64_t ct_addr) -+tioce_dma_d32(struct pci_dev *pdev, uint64_t ct_addr, int dma_flags) + static u64 +-tioce_dma_d32(struct pci_dev *pdev, u64 ct_addr) ++tioce_dma_d32(struct pci_dev *pdev, u64 ct_addr, int dma_flags) { int dma_ok; int port; -@@ -263,6 +274,9 @@ tioce_dma_d32(struct pci_dev *pdev, uint - uint64_t ct_lower; +@@ -263,6 +274,9 @@ tioce_dma_d32(struct pci_dev *pdev, u64 + u64 ct_lower; dma_addr_t bus_addr; + if (dma_flags & SN_DMA_MSI) @@ -773,13 +773,13 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> @@ -387,7 +401,7 @@ tioce_dma_unmap(struct pci_dev *pdev, dm */ - static uint64_t - tioce_do_dma_map(struct pci_dev *pdev, uint64_t paddr, size_t byte_count, + static u64 + tioce_do_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, - int barrier) + int barrier, int dma_flags) { unsigned long flags; - uint64_t ct_addr; + u64 ct_addr; @@ -403,15 +417,18 @@ tioce_do_dma_map(struct pci_dev *pdev, u if (dma_mask < 0x7fffffffUL) return 0; @@ -857,21 +857,21 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> @@ -502,9 +523,9 @@ dma_map_done: * in the address. */ - static uint64_t --tioce_dma(struct pci_dev *pdev, uint64_t paddr, size_t byte_count) -+tioce_dma(struct pci_dev *pdev, uint64_t paddr, size_t byte_count, int dma_flags) + static u64 +-tioce_dma(struct pci_dev *pdev, u64 paddr, size_t byte_count) ++tioce_dma(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) { - return tioce_do_dma_map(pdev, paddr, byte_count, 0); + return tioce_do_dma_map(pdev, paddr, byte_count, 0, dma_flags); } /** -@@ -516,9 +537,9 @@ tioce_dma(struct pci_dev *pdev, uint64_t +@@ -516,9 +537,9 @@ tioce_dma(struct pci_dev *pdev, u64 padd * Simply call tioce_do_dma_map() to create a map with the barrier bit set * in the address. - */ static uint64_t --tioce_dma_consistent(struct pci_dev *pdev, uint64_t paddr, size_t byte_count) -+tioce_dma_consistent(struct pci_dev *pdev, uint64_t paddr, size_t byte_count, int dma_flags) + */ static u64 +-tioce_dma_consistent(struct pci_dev *pdev, u64 paddr, size_t byte_count) ++tioce_dma_consistent(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) { - return tioce_do_dma_map(pdev, paddr, byte_count, 1); + return tioce_do_dma_map(pdev, paddr, byte_count, 1, dma_flags); @@ -901,14 +901,14 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> int irq_irq; /* the IRQ number */ int irq_int_bit; /* Bridge interrupt pin */ + /* <0 means MSI */ - uint64_t irq_xtalkaddr; /* xtalkaddr IRQ is sent to */ + u64 irq_xtalkaddr; /* xtalkaddr IRQ is sent to */ int irq_bridge_type;/* pciio asic type (pciio.h) */ void *irq_bridge; /* bridge generating irq */ @@ -53,6 +55,12 @@ struct sn_irq_info { }; extern void sn_send_IPI_phys(int, long, int, int); -+extern uint64_t sn_intr_alloc(nasid_t, int, ++extern u64 sn_intr_alloc(nasid_t, int, + struct sn_irq_info *, + int, nasid_t, int); +extern void sn_intr_free(nasid_t, int, struct sn_irq_info *); diff --git a/pci/pci-msi-vector-targeting-abstractions.patch b/pci/msi-vector-targeting-abstractions.patch index 6cee51d9b23c9..1b7cc16048e88 100644 --- a/pci/pci-msi-vector-targeting-abstractions.patch +++ b/pci/msi-vector-targeting-abstractions.patch @@ -1,9 +1,9 @@ -From owner-linux-pci@atrey.karlin.mff.cuni.cz Wed Jan 11 15:42:53 2006 -Date: Wed, 11 Jan 2006 16:16:38 -0600 (CST) +From owner-linux-pci@atrey.karlin.mff.cuni.cz Thu Jan 19 11:46:59 2006 +Date: Thu, 19 Jan 2006 13:46:52 -0600 (CST) From: Mark Maule <maule@sgi.com> Cc: Tony Luck <tony.luck@intel.com>, gregkh@suse.de, Mark Maule <maule@sgi.com> -Message-Id: <20060111221638.28765.93442.80780@attica.americas.sgi.com> -Subject: PCI: msi vector targeting abstractions +Message-Id: <20060119194652.12213.96503.19247@lnx-maule.americas.sgi.com> +Subject: [PATCH 1/3] msi vector targeting abstractions Abstract portions of the MSI core for platforms that do not use standard APIC interrupt controllers. This is implemented through a new arch-specific @@ -17,16 +17,16 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> arch/ia64/sn/pci/Makefile | 3 arch/ia64/sn/pci/msi.c | 18 +++++ drivers/pci/Makefile | 2 - drivers/pci/msi-apic.c | 100 ++++++++++++++++++++++++++++ + drivers/pci/msi-apic.c | 92 +++++++++++++++++++++++++ drivers/pci/msi.c | 146 ++++++++++++++++++++++------------------- - drivers/pci/msi.h | 63 ----------------- + drivers/pci/msi.h | 120 ++++++++++++++++----------------- + drivers/pci/pci.h | 3 include/asm-i386/msi.h | 8 ++ - include/asm-ia64/machvec.h | 7 + - include/asm-ia64/machvec_sn2.h | 2 + include/asm-ia64/machvec.h | 12 +++ + include/asm-ia64/machvec_sn2.h | 6 + include/asm-ia64/msi.h | 11 +++ include/asm-x86_64/msi.h | 8 ++ - include/linux/pci.h | 62 +++++++++++++++++ - 12 files changed, 301 insertions(+), 129 deletions(-) + 12 files changed, 300 insertions(+), 129 deletions(-) --- gregkh-2.6.orig/drivers/pci/msi.c +++ gregkh-2.6/drivers/pci/msi.c @@ -39,14 +39,13 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> static DEFINE_SPINLOCK(msi_lock); static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; static kmem_cache_t* msi_cachep; -@@ -40,6 +38,15 @@ int vector_irq[NR_VECTORS] = { [0 ... NR +@@ -40,6 +38,14 @@ int vector_irq[NR_VECTORS] = { [0 ... NR u8 irq_vector[NR_IRQ_VECTORS] = { FIRST_DEVICE_VECTOR , 0 }; #endif +static struct msi_ops *msi_ops; + -+int -+msi_register(struct msi_ops *ops) ++int msi_register(struct msi_ops *ops) +{ + msi_ops = ops; + return 0; @@ -55,7 +54,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) { memset(p, 0, NR_IRQS * sizeof(struct msi_desc)); -@@ -92,7 +99,7 @@ static void msi_set_mask_bit(unsigned in +@@ -92,7 +98,7 @@ static void msi_set_mask_bit(unsigned in static void set_msi_affinity(unsigned int vector, cpumask_t cpu_mask) { struct msi_desc *entry; @@ -64,7 +63,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> unsigned int irq = vector; unsigned int dest_cpu = first_cpu(cpu_mask); -@@ -108,28 +115,36 @@ static void set_msi_affinity(unsigned in +@@ -108,28 +114,36 @@ static void set_msi_affinity(unsigned in if (!(pos = pci_find_capability(entry->dev, PCI_CAP_ID_MSI))) return; @@ -115,7 +114,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> set_native_irq_info(irq, cpu_mask); break; } -@@ -251,30 +266,6 @@ static struct hw_interrupt_type msi_irq_ +@@ -251,30 +265,6 @@ static struct hw_interrupt_type msi_irq_ .set_affinity = set_msi_affinity }; @@ -146,7 +145,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> static int msi_free_vector(struct pci_dev* dev, int vector, int reassign); static int assign_msi_vector(void) { -@@ -369,6 +360,20 @@ static int msi_init(void) +@@ -369,6 +359,20 @@ static int msi_init(void) return status; } @@ -167,7 +166,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> if ((status = msi_cache_init()) < 0) { pci_msi_enable = 0; printk(KERN_WARNING "PCI: MSI cache init failed\n"); -@@ -512,9 +517,11 @@ void pci_scan_msi_device(struct pci_dev +@@ -512,9 +516,11 @@ void pci_scan_msi_device(struct pci_dev **/ static int msi_capability_init(struct pci_dev *dev) { @@ -181,7 +180,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> int pos, vector; u16 control; -@@ -541,23 +548,26 @@ static int msi_capability_init(struct pc +@@ -541,23 +547,27 @@ static int msi_capability_init(struct pc entry->mask_base = (void __iomem *)(long)msi_mask_bits_reg(pos, is_64bit_address(control)); } @@ -191,6 +190,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + &address_lo, + &data); + if (status < 0) { ++ dev->irq = entry->msi_attrib.default_vector; + kmem_cache_free(msi_cachep, entry); + return status; + } @@ -301,7 +301,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +static inline int msi_arch_init(void) +{ -+ msi_register_apic(&msi_apic_ops); ++ msi_register(&msi_apic_ops); + return 0; +} + @@ -340,12 +340,17 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> } extern struct ia64_machine_vector ia64_mv; -@@ -386,5 +390,8 @@ extern ia64_mv_dma_supported swiotlb_dm +@@ -386,5 +390,13 @@ extern ia64_mv_dma_supported swiotlb_dm #ifndef platform_readq_relaxed # define platform_readq_relaxed __ia64_readq_relaxed #endif +#ifndef platform_msi_init ++#ifdef CONFIG_PCI_MSI ++#include <asm/msi.h> /* pull in ia64_msi_init() */ +# define platform_msi_init ia64_msi_init ++#else ++# define platform_msi_init NULL ++#endif /* CONFIG_PCI_MSI */ +#endif #endif /* _ASM_IA64_MACHVEC_H */ @@ -359,11 +364,15 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> /* * This stuff has dual use! -@@ -120,6 +121,7 @@ extern ia64_mv_dma_supported sn_dma_sup +@@ -120,6 +121,11 @@ extern ia64_mv_dma_supported sn_dma_sup #define platform_dma_sync_sg_for_device sn_dma_sync_sg_for_device #define platform_dma_mapping_error sn_dma_mapping_error #define platform_dma_supported sn_dma_supported ++#ifdef CONFIG_PCI_MSI +#define platform_msi_init sn_msi_init ++#else ++#define platform_msi_init NULL ++#endif #include <asm/sn/io.h> @@ -382,7 +391,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + return 0; +} + -+#define msi_arch_init platform_msi_init ++#define msi_arch_init platform_msi_init /* in asm/machvec.h */ + #endif /* ASM_MSI_H */ --- gregkh-2.6.orig/arch/ia64/sn/pci/Makefile @@ -432,20 +441,24 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> # ACPI Related PCI FW Functions --- /dev/null +++ gregkh-2.6/drivers/pci/msi-apic.c -@@ -0,0 +1,100 @@ +@@ -0,0 +1,92 @@ +/* + * MSI hooks for standard x86 apic ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 2005 Silicon Graphics, Inc. All Rights Reserved. + */ + +#include <linux/pci.h> +#include <linux/irq.h> + ++#include "pci.h" +#include "msi.h" + -+/* -+ * Shifts for APIC-based data -+ */ -+ ++/* Shifts for APIC-based data */ +#define MSI_DATA_VECTOR_SHIFT 0 +#define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT) + @@ -461,10 +474,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +#define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT) +#define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT) + -+/* -+ * Shift/mask fields for APIC-based bus address -+ */ -+ ++/* Shift/mask fields for APIC-based bus address */ +#define MSI_ADDR_HEADER 0xfee00000 + +#define MSI_ADDR_DESTID_MASK 0xfff0000f @@ -479,11 +489,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +#define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT) + + -+static void -+msi_target_apic(unsigned int vector, -+ unsigned int dest_cpu, -+ u32 *address_hi, /* in/out */ -+ u32 *address_lo) /* in/out */ ++static void msi_target_apic(unsigned int vector, unsigned int dest_cpu, ++ u32 *address_hi, u32 *address_lo) +{ + u32 addr = *address_lo; + @@ -493,12 +500,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + *address_lo = addr; +} + -+static int -+msi_setup_apic(struct pci_dev *pdev, /* unused in generic */ -+ unsigned int vector, -+ u32 *address_hi, -+ u32 *address_lo, -+ u32 *data) ++static int msi_setup_apic(struct pci_dev *pdev, unsigned int vector, ++ u32 *address_hi, u32 *address_lo, u32 *data) +{ + unsigned long dest_phys_id; + @@ -518,20 +521,18 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + return 0; +} + -+static void -+msi_teardown_apic(unsigned int vector) ++static void msi_teardown_apic(unsigned int vector) +{ -+ return; /* no-op */ ++ return; +} + +/* + * Generic ops used on most IA archs/platforms. Set with msi_register() + */ -+ +struct msi_ops msi_apic_ops = { -+ .setup = msi_setup_apic, -+ .teardown = msi_teardown_apic, -+ .target = msi_target_apic, ++ .setup = msi_setup_apic, ++ .teardown = msi_teardown_apic, ++ .target = msi_target_apic, +}; --- gregkh-2.6.orig/drivers/pci/msi.h +++ gregkh-2.6/drivers/pci/msi.h @@ -612,10 +613,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> }msi_attrib; struct { ---- gregkh-2.6.orig/include/linux/pci.h -+++ gregkh-2.6/include/linux/pci.h -@@ -546,6 +546,66 @@ struct msix_entry { - u16 entry; /* driver uses to specify entry, OS writes */ +@@ -144,4 +83,61 @@ struct msi_desc { + struct pci_dev *dev; }; +/* @@ -643,8 +642,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + * those resources with the passed in vector. + * + * Returns 0 if the MSI address/data was successfully setup. -+ **/ -+ ++ */ + int (*setup) (struct pci_dev *pdev, unsigned int vector, + u32 *addr_hi, u32 *addr_lo, u32 *data); + @@ -655,8 +653,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + * Description: The teardown op is used to release any resources + * that were allocated in the setup routine associated with the passed + * in vector. -+ **/ -+ ++ */ + void (*teardown) (unsigned int vector); + + /** @@ -672,28 +669,25 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + * target code is responsible for freeing any resources (if any) + * associated with the old address, and generating a new PCI bus + * addr_hi/addr_lo that will redirect the vector at the indicated cpu. -+ **/ -+ ++ */ + void (*target) (unsigned int vector, unsigned int cpu, + u32 *addr_hi, u32 *addr_lo); +}; + - #ifndef CONFIG_PCI_MSI - static inline void pci_scan_msi_device(struct pci_dev *dev) {} - static inline int pci_enable_msi(struct pci_dev *dev) {return -1;} -@@ -554,6 +614,7 @@ static inline int pci_enable_msix(struct - struct msix_entry *entries, int nvec) {return -1;} - static inline void pci_disable_msix(struct pci_dev *dev) {} - static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) {} -+static inline int msi_register(struct msi_ops *ops) {return -1;} + #endif /* MSI_H */ +--- gregkh-2.6.orig/drivers/pci/pci.h ++++ gregkh-2.6/drivers/pci/pci.h +@@ -48,10 +48,13 @@ extern int pci_msi_quirk; + #define pci_msi_quirk 0 + #endif + ++struct msi_ops; + #ifdef CONFIG_PCI_MSI + void disable_msi_mode(struct pci_dev *dev, int pos, int type); ++int msi_register(struct msi_ops *ops); #else - extern void pci_scan_msi_device(struct pci_dev *dev); - extern int pci_enable_msi(struct pci_dev *dev); -@@ -562,6 +623,7 @@ extern int pci_enable_msix(struct pci_de - struct msix_entry *entries, int nvec); - extern void pci_disable_msix(struct pci_dev *dev); - extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); -+extern int msi_register(struct msi_ops *ops); + static inline void disable_msi_mode(struct pci_dev *dev, int pos, int type) { } ++static inline int msi_register(struct msi_ops *ops) { return 0; } #endif - extern void pci_block_user_cfg_access(struct pci_dev *dev); + extern int pcie_mch_quirk; diff --git a/pci/pci-clean-up-msi.c-a-bit.patch b/pci/pci-clean-up-msi.c-a-bit.patch index 3d45babcb5b1f..9b4e0256cf9d6 100644 --- a/pci/pci-clean-up-msi.c-a-bit.patch +++ b/pci/pci-clean-up-msi.c-a-bit.patch @@ -27,7 +27,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- gregkh-2.6.orig/drivers/pci/msi.c +++ gregkh-2.6/drivers/pci/msi.c -@@ -110,9 +110,9 @@ static void set_msi_affinity(unsigned in +@@ -109,9 +109,9 @@ static void set_msi_affinity(unsigned in switch (entry->msi_attrib.type) { case PCI_CAP_ID_MSI: { @@ -39,7 +39,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> return; pci_read_config_dword(entry->dev, msi_upper_address_reg(pos), -@@ -338,9 +338,9 @@ static int assign_msi_vector(void) +@@ -337,9 +337,9 @@ static int assign_msi_vector(void) static int get_new_vector(void) { @@ -51,7 +51,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> set_intr_gate(vector, interrupt[vector]); return vector; -@@ -360,7 +360,8 @@ static int msi_init(void) +@@ -359,7 +359,8 @@ static int msi_init(void) return status; } @@ -61,7 +61,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> pci_msi_enable = 0; printk(KERN_WARNING "PCI: MSI arch init failed. MSI disabled.\n"); -@@ -374,7 +375,8 @@ static int msi_init(void) +@@ -373,7 +374,8 @@ static int msi_init(void) return status; } @@ -71,7 +71,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> pci_msi_enable = 0; printk(KERN_WARNING "PCI: MSI cache init failed\n"); return status; -@@ -533,10 +535,12 @@ static int msi_capability_init(struct pc +@@ -532,10 +534,12 @@ static int msi_capability_init(struct pc pos = pci_find_capability(dev, PCI_CAP_ID_MSI); pci_read_config_word(dev, msi_control_reg(pos), &control); /* MSI Entry Initialization */ diff --git a/pci/pci-per-platform-ia64_-first-last-_device_vector-definitions.patch b/pci/per-platform-ia64_-first-last-_device_vector-definitions.patch index 7f0f544fe43ee..594ed7e3436b9 100644 --- a/pci/pci-per-platform-ia64_-first-last-_device_vector-definitions.patch +++ b/pci/per-platform-ia64_-first-last-_device_vector-definitions.patch @@ -1,9 +1,9 @@ -From owner-linux-pci@atrey.karlin.mff.cuni.cz Wed Jan 11 15:43:21 2006 -Date: Wed, 11 Jan 2006 16:16:43 -0600 (CST) +From owner-linux-pci@atrey.karlin.mff.cuni.cz Thu Jan 19 11:46:59 2006 +Date: Thu, 19 Jan 2006 13:46:57 -0600 (CST) From: Mark Maule <maule@sgi.com> Cc: Tony Luck <tony.luck@intel.com>, gregkh@suse.de, Mark Maule <maule@sgi.com> -Message-Id: <20060111221643.28765.38687.79085@attica.americas.sgi.com> -Subject: PCI: per-platform IA64_{FIRST,LAST}_DEVICE_VECTOR definitions +Message-Id: <20060119194657.12213.25378.83969@lnx-maule.americas.sgi.com> +Subject: [PATCH 2/3] per-platform IA64_{FIRST,LAST}_DEVICE_VECTOR definitions Abstract IA64_FIRST_DEVICE_VECTOR/IA64_LAST_DEVICE_VECTOR since SN platforms use a subset of the IA64 range. Implement this by making the above macros @@ -16,11 +16,11 @@ Signed-off-by: Mark Maule <maule@sgi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- - arch/ia64/kernel/irq_ia64.c | 17 ++++++++++++++++- + arch/ia64/kernel/irq_ia64.c | 19 ++++++++++++++++++- arch/ia64/sn/kernel/irq.c | 7 +++++++ drivers/pci/msi.c | 7 ++++++- include/asm-ia64/hw_irq.h | 15 +++++++++++++-- - 4 files changed, 42 insertions(+), 4 deletions(-) + 4 files changed, 44 insertions(+), 4 deletions(-) --- gregkh-2.6.orig/arch/ia64/kernel/irq_ia64.c +++ gregkh-2.6/arch/ia64/kernel/irq_ia64.c @@ -44,19 +44,21 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> int assign_irq_vector (int irq) -@@ -89,6 +93,17 @@ free_irq_vector (int vector) +@@ -89,6 +93,19 @@ free_irq_vector (int vector) printk(KERN_WARNING "%s: double free!\n", __FUNCTION__); } +int +reserve_irq_vector (int vector) +{ ++ int pos; ++ + if (vector < IA64_FIRST_DEVICE_VECTOR || + vector > IA64_LAST_DEVICE_VECTOR) + return -EINVAL; + -+ return test_and_set_bit(IA64_FIRST_DEVICE_VECTOR + vector, -+ ia64_vector_mask); ++ pos = vector - IA64_FIRST_DEVICE_VECTOR; ++ return test_and_set_bit(pos, ia64_vector_mask); +} + #ifdef CONFIG_SMP @@ -137,7 +139,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> #endif static struct msi_ops *msi_ops; -@@ -379,6 +379,11 @@ static int msi_init(void) +@@ -378,6 +378,11 @@ static int msi_init(void) printk(KERN_WARNING "PCI: MSI cache init failed\n"); return status; } |