aboutsummaryrefslogtreecommitdiffstats
path: root/pci
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-01-19 18:13:56 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-19 18:13:56 -0800
commit65918602d80e42ea4b71f6b2fe0c2603b1a9fc07 (patch)
tree00839efa7f511f49b0110b5497fb0abd10210855 /pci
parenta934cef80385908677760f918521d9f4f0f38089 (diff)
downloadpatches-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.patch10
-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;
}