From: Yinghai Lu <yinghai@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>, Ram Pai <linuxram@us.ibm.com>
Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH v4 22/29] PCI: Add addon_resource support for pci devices
Date: Fri, 12 Apr 2013 15:44:36 -0700 [thread overview]
Message-ID: <1365806683-26717-23-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1365806683-26717-1-git-send-email-yinghai@kernel.org>
Now there is some non normal pci resources other than standard,rom,
sriov, bridges.
Some could be same as standard reg, but using different position.
Some could have own way to read/write to them.
Kernel are using different way to hack those resources like abusing
pci bridge resource spot on non bridge pci device.
Add addon_resources list in pci_dev for those non-standard resources.
With this patch, will treat addon-resource like standard resources with
special ops.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
drivers/pci/probe.c | 38 +++++++++++++++++++++++++++++++++++++-
include/linux/pci.h | 28 +++++++++++++++++++++++++++-
2 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 263a575..9e659c7 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -107,22 +107,53 @@ postcore_initcall(pcibus_class_init);
struct resource *pci_dev_resource_n(struct pci_dev *dev, int n)
{
- if (n >= 0 && n < PCI_NUM_RESOURCES)
+ struct pci_dev_addon_resource *addon_res;
+
+ if (n < 0)
+ return NULL;
+
+ if (n < PCI_NUM_RESOURCES)
return &dev->resource[n];
+ n -= PCI_NUM_RESOURCES;
+ list_for_each_entry(addon_res, &dev->addon_resources, list) {
+ if (n-- == 0)
+ return &addon_res->res;
+ }
+
return NULL;
}
EXPORT_SYMBOL(pci_dev_resource_n);
int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res)
{
+ struct pci_dev_addon_resource *addon_res;
+ int n;
+
if (res >= dev->resource &&
res <= dev->resource + (PCI_NUM_RESOURCES - 1))
return res - dev->resource;
+ n = PCI_NUM_RESOURCES;
+ list_for_each_entry(addon_res, &dev->addon_resources, list) {
+ if (res == &addon_res->res)
+ return n;
+ n++;
+ }
+
return -1;
}
+static void pci_release_dev_addon_resource(struct pci_dev *dev)
+{
+ struct pci_dev_addon_resource *addon_res, *tmp;
+
+ list_for_each_entry_safe(addon_res, tmp, &dev->addon_resources, list) {
+ list_del(&addon_res->list);
+ kfree(addon_res);
+ }
+}
+
static void __init_res_idx_mask(unsigned long *mask, int flag)
{
bitmap_zero(mask, PCI_NUM_RESOURCES);
@@ -167,6 +198,9 @@ int pci_next_resource_idx(int i, int flag)
if (i < PCI_NUM_RESOURCES)
return i;
+ if (flag & PCI_ADDON_RES)
+ return i;
+
return -1;
}
EXPORT_SYMBOL(pci_next_resource_idx);
@@ -1199,6 +1233,7 @@ static void pci_release_dev(struct device *dev)
pci_dev = to_pci_dev(dev);
pci_release_capabilities(pci_dev);
pci_release_of_node(pci_dev);
+ pci_release_dev_addon_resource(pci_dev);
kfree(pci_dev);
}
@@ -1276,6 +1311,7 @@ struct pci_dev *alloc_pci_dev(void)
return NULL;
INIT_LIST_HEAD(&dev->bus_list);
+ INIT_LIST_HEAD(&dev->addon_resources);
return dev;
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 044c474..c337c51 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -323,6 +323,7 @@ struct pci_dev {
*/
unsigned int irq;
struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
+ struct list_head addon_resources; /* addon I/O and memory resource */
bool match_driver; /* Skip attaching driver */
/* These fields are used by common fixups */
@@ -376,6 +377,21 @@ struct pci_dev {
size_t romlen; /* Length of ROM if it's not from the BAR */
};
+struct resource_ops {
+ int (*read)(struct pci_dev *dev, struct resource *res, int addr);
+ int (*write)(struct pci_dev *dev, struct resource *res, int addr);
+};
+
+struct pci_dev_addon_resource {
+ struct list_head list;
+ int reg_addr;
+ int size;
+ struct resource res;
+ struct resource_ops *ops;
+};
+#define to_pci_dev_addon_resource(n) \
+ container_of(n, struct pci_dev_addon_resource, res)
+
struct resource *pci_dev_resource_n(struct pci_dev *dev, int n);
int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res);
@@ -384,8 +400,10 @@ int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res);
#define PCI_IOV_RES (1<<2)
#define PCI_BRIDGE_RES (1<<3)
#define PCI_RES_BLOCK_NUM 4
+/* addon does not need to use bitmap. */
+#define PCI_ADDON_RES (1<<4)
-#define PCI_ALL_RES (PCI_STD_RES | PCI_ROM_RES | PCI_BRIDGE_RES | PCI_IOV_RES)
+#define PCI_ALL_RES (PCI_STD_RES | PCI_ROM_RES | PCI_BRIDGE_RES | PCI_IOV_RES | PCI_ADDON_RES)
#define PCI_ROM_IOV_BRIDGE_RES (PCI_ROM_RES | PCI_BRIDGE_RES | PCI_IOV_RES)
#define PCI_STD_ROM_BRIDGE_RES (PCI_STD_RES | PCI_ROM_RES | PCI_BRIDGE_RES)
#define PCI_STD_IOV_BRIDGE_RES (PCI_STD_RES | PCI_IOV_RES | PCI_BRIDGE_RES)
@@ -393,6 +411,14 @@ int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res);
#define PCI_STD_ROM_RES (PCI_STD_RES | PCI_ROM_RES)
#define PCI_STD_IOV_RES (PCI_STD_RES | PCI_IOV_RES)
#define PCI_STD_ROM_IOV_RES (PCI_STD_RES | PCI_ROM_RES | PCI_IOV_RES)
+/* try to treat add on as std */
+#define PCI_STD_ADDON_RES (PCI_STD_RES | PCI_ADDON_RES)
+#define PCI_STD_ROM_BRIDGE_ADDON_RES (PCI_STD_RES | PCI_ROM_RES | PCI_BRIDGE_RES | PCI_ADDON_RES)
+#define PCI_STD_IOV_BRIDGE_ADDON_RES (PCI_STD_RES | PCI_IOV_RES | PCI_BRIDGE_RES | PCI_ADDON_RES)
+#define PCI_STD_ROM_IOV_ADDON_RES (PCI_STD_RES | PCI_ROM_RES | PCI_IOV_RES | PCI_ADDON_RES)
+#define PCI_STD_ROM_ADDON_RES (PCI_STD_RES | PCI_ROM_RES | PCI_ADDON_RES)
+#define PCI_STD_IOV_ADDON_RES (PCI_STD_RES | PCI_IOV_RES | PCI_ADDON_RES)
+#define PCI_STD_ROM_IOV_ADDON_RES (PCI_STD_RES | PCI_ROM_RES | PCI_IOV_RES | PCI_ADDON_RES)
int pci_next_resource_idx(int i, int flag);
--
1.8.1.4
next prev parent reply other threads:[~2013-04-12 22:45 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-12 22:44 [PATCH v4 00/29] PCI: Add for_each_pci_resource and addon_res support Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 01/29] PCI: Clean up quirk_io_region Yinghai Lu
2013-04-15 18:23 ` Bjorn Helgaas
2013-04-12 22:44 ` [PATCH v4 02/29] PCI: Add pci_dev_resource_n() Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 03/29] PCI: Update pci_resource_start etc to use pci_dev_resource_n() Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 04/29] PCI: Add pci_dev_resource_idx() helper Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 05/29] PCI: Add is_pci_*_resource_idx() helpers Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 06/29] PCI: pci resource iterator Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 07/29] PCI, x86: Use for_each_pci_resource() with pci_allocate_bridge_resources Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 08/29] PCI, x86: Use for_each_pci_resource() with pci_allocate_dev_resources Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 09/29] PCI: Use for_each_pci_resource() with IOV releated functions Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 10/29] PCI, acpiphp: Use for_each_pci_resource() helper Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 11/29] PCI, pciehp: " Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 12/29] PCI: Use for_each_pci_resource() in pci_enable_dev Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 13/29] PCI: Use for_each_pci_resource() in pci_reassigndev Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 14/29] PCI: Use for_each_pci_resource() with pci bar reassign funcs Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 15/29] PCI: Use for_each_pci_resource() in pci_assign_resource Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 16/29] PCI, x86: Use for_each_pci_resource() with noassign_bars Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 17/29] PCI: Use for_each_pci_resource() in pci_dev_driver() Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 18/29] PCI: Use for_each_pci_resource() in pci resource release Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 19/29] PCI: Use for_each_pci_resource() in pci bases reading Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 20/29] PCI, x86: Use for_each_pci_resource() with mrst Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 21/29] PCI, xen: Use for_each_pci_resource() with xen pci Yinghai Lu
2013-04-12 22:44 ` Yinghai Lu [this message]
2013-04-12 22:44 ` [PATCH v4 23/29] PCI: Treat addon res as std resources Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 24/29] PCI: Add helpers to add addon_resource Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 25/29] PCI: Update pci_resource_bar() to support addon_resource Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 26/29] PCI: Assign/update resource to addon_res Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 27/29] PCI: Make piix4 quirk to use addon_res Yinghai Lu
2013-04-25 20:39 ` Bjorn Helgaas
2013-04-26 15:22 ` Bjorn Helgaas
2013-04-26 20:29 ` Rafael J. Wysocki
2013-04-12 22:44 ` [PATCH v4 28/29] PCI: Make quirk_io_region " Yinghai Lu
2013-04-12 22:44 ` [PATCH v4 29/29] PCI: Use addon_fixed_resource with ati fixed resource Yinghai Lu
2013-04-25 19:53 ` [PATCH v4 00/29] PCI: Add for_each_pci_resource and addon_res support Bjorn Helgaas
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=1365806683-26717-23-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=bhelgaas@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linuxram@us.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome