All of lore.kernel.org
 help / color / mirror / Atom feed
From: Roland Dreier <roland@topspin.com>
To: greg@kroah.com, tom.l.nguyen@intel.com
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] Add __iomem annotations to drivers/pci/msi.c
Date: Sat, 02 Oct 2004 07:46:14 -0700	[thread overview]
Message-ID: <52is9tw53d.fsf@topspin.com> (raw)

drivers/pci/msi.c uses the mask_base member of struct msi_desc to hold
both an offset within the PCI config header (for MSI mode) and an
ioremap cookie (for MSI-X mode).  This patch splits the field into a
union so that we can put these values into something appropriately
typed, so both gcc and sparse are happy.

Tested with my MSI-X device; unfortunately I don't have an MSI device
that supports masking so I can't test that, but the changes are pretty
small and "obviously correct."

Thanks,
  Roland


Signed-off-by: Roland Dreier <roland@topspin.com>

Index: linux-bk/drivers/pci/msi.c
===================================================================
--- linux-bk.orig/drivers/pci/msi.c	2004-10-01 13:15:47.000000000 -0700
+++ linux-bk/drivers/pci/msi.c	2004-10-01 14:50:35.000000000 -0700
@@ -58,7 +58,7 @@
 	struct msi_desc *entry;
 
 	entry = (struct msi_desc *)msi_desc[vector];
-	if (!entry || !entry->dev || !entry->mask_base)
+	if (!entry || !entry->dev)
 		return;
 	switch (entry->msi_attrib.type) {
 	case PCI_CAP_ID_MSI:
@@ -66,7 +66,9 @@
 		int		pos;
 		u32		mask_bits;
 
-		pos = entry->mask_base;
+		if (!entry->mask_base.msi)
+			return;
+		pos = entry->mask_base.msi;
 		pci_read_config_dword(entry->dev, pos, &mask_bits);
 		mask_bits &= ~(1);
 		mask_bits |= flag;
@@ -77,7 +79,10 @@
 	{
 		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
 			PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET;
-		writel(flag, entry->mask_base + offset);
+
+		if (!entry->mask_base.msix)
+			return;
+		writel(flag, entry->mask_base.msix + offset);
 		break;
 	}
 	default:
@@ -118,12 +123,12 @@
 		int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
 			PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET;
 
-		address.lo_address.value = readl(entry->mask_base + offset);
+		address.lo_address.value = readl(entry->mask_base.msix + offset);
 		address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK;
 		address.lo_address.value |= (cpu_mask_to_apicid(cpu_mask) <<
 			MSI_TARGET_CPU_SHIFT);
 		entry->msi_attrib.current_cpu = cpu_mask_to_apicid(cpu_mask);
-		writel(address.lo_address.value, entry->mask_base + offset);
+		writel(address.lo_address.value, entry->mask_base.msix + offset);
 		break;
 	}
 	default:
@@ -548,7 +553,7 @@
 	dev->irq = vector;
 	entry->dev = dev;
 	if (is_mask_bit_support(control)) {
-		entry->mask_base = msi_mask_bits_reg(pos,
+		entry->mask_base.msi = msi_mask_bits_reg(pos,
 				is_64bit_address(control));
 	}
 	/* Replace with MSI handler */
@@ -606,7 +611,7 @@
 	u32 phys_addr, table_offset;
  	u16 control;
 	u8 bir;
-	void *base;
+	void __iomem *base;
 
    	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
 	/* Request & Map MSI-X table region */
@@ -642,7 +647,7 @@
 		entry->msi_attrib.maskbit = 1;
 		entry->msi_attrib.default_vector = dev->irq;
 		entry->dev = dev;
-		entry->mask_base = (unsigned long)base;
+		entry->mask_base.msix = base;
 		if (!head) {
 			entry->link.head = vector;
 			entry->link.tail = vector;
@@ -806,7 +811,7 @@
 {
 	struct msi_desc *entry;
 	int head, entry_nr, type;
-	unsigned long base = 0L;
+	void __iomem *base;
 	unsigned long flags;
 
 	spin_lock_irqsave(&msi_lock, flags);
@@ -818,7 +823,7 @@
 	type = entry->msi_attrib.type;
 	entry_nr = entry->msi_attrib.entry_nr;
 	head = entry->link.head;
-	base = entry->mask_base;
+	base = entry->mask_base.msix;
 	msi_desc[entry->link.head]->link.tail = entry->link.tail;
 	msi_desc[entry->link.tail]->link.head = entry->link.head;
 	entry->dev = NULL;
@@ -857,7 +862,7 @@
 			phys_addr = pci_resource_start (dev, bir);
 			phys_addr += (u32)(table_offset &
 				~PCI_MSIX_FLAGS_BIRMASK);
-			iounmap((void*)base);
+			iounmap(base);
 			release_mem_region(phys_addr,
 				nr_entries * PCI_MSIX_ENTRY_SIZE);
 		}
@@ -870,7 +875,7 @@
 {
 	int vector = head, tail = 0;
 	int i = 0, j = 0, nr_entries = 0;
-	unsigned long base = 0L;
+	void __iomem *base;
 	unsigned long flags;
 
 	spin_lock_irqsave(&msi_lock, flags);
@@ -894,7 +899,7 @@
 		nr_released_vectors--;
 		entries[i].vector = vector;
 		if (j != (entries + i)->entry) {
-			base = msi_desc[vector]->mask_base;
+			base = msi_desc[vector]->mask_base.msix;
 			msi_desc[vector]->msi_attrib.entry_nr =
 				(entries + i)->entry;
 			writel( readl(base + j * PCI_MSIX_ENTRY_SIZE +
@@ -1099,14 +1104,14 @@
    	if ((pos = pci_find_capability(dev, PCI_CAP_ID_MSIX)) > 0 &&
 		!msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) {
 		int vector, head, tail = 0, warning = 0;
-		unsigned long base = 0L;
+		void __iomem *base = NULL;
 
 		vector = head = dev->irq;
 		while (head != tail) {
 			spin_lock_irqsave(&msi_lock, flags);
 			state = msi_desc[vector]->msi_attrib.state;
 			tail = msi_desc[vector]->link.tail;
-			base = msi_desc[vector]->mask_base;
+			base = msi_desc[vector]->mask_base.msix;
 			spin_unlock_irqrestore(&msi_lock, flags);
 			if (state)
 				warning = 1;
@@ -1129,7 +1134,7 @@
 			phys_addr = pci_resource_start (dev, bir);
 			phys_addr += (u32)(table_offset &
 				~PCI_MSIX_FLAGS_BIRMASK);
-			iounmap((void*)base);
+			iounmap(base);
 			release_mem_region(phys_addr, PCI_MSIX_ENTRY_SIZE *
 				multi_msix_capable(control));
 			printk(KERN_DEBUG "Driver[%d:%d:%d] unloaded wo doing free_irq on all vectors\n",
Index: linux-bk/drivers/pci/msi.h
===================================================================
--- linux-bk.orig/drivers/pci/msi.h	2004-10-01 13:15:47.000000000 -0700
+++ linux-bk/drivers/pci/msi.h	2004-10-01 11:13:23.000000000 -0700
@@ -152,7 +152,10 @@
 		__u16	tail;
 	}link;
 
-	unsigned long mask_base;
+	union {
+		int		msi;
+		void __iomem	*msix;
+	} mask_base;
 	struct pci_dev *dev;
 };
 

                 reply	other threads:[~2004-10-02 14:46 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52is9tw53d.fsf@topspin.com \
    --to=roland@topspin.com \
    --cc=greg@kroah.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tom.l.nguyen@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.