[RFC PATCH 04/11] PCI/MSI: Move MSIX table address mapping out of msix_capability_init

2014-07-25 Thread Yijing Wang
Move MSIX table address mapping work to PCI MSIX layer.
Some Non-PCI MSI device will do their address mapping work before
enable MSIX capability or their MSIX table address is within
device address block. So Move address mapping stuff out of the
generic MSIX core. This is prepartion for generic MSI drvier.

Suggested-by: Yun Wu 
Signed-off-by: Yijing Wang 
---
 drivers/pci/msi.c |   25 +
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index d5c8e56..116383c 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -668,8 +668,8 @@ static void __iomem *msix_map_region(struct pci_dev *dev, 
unsigned nr_entries)
u32 table_offset;
u8 bir;
 
-   pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE,
- _offset);
+   pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE, 
+   _offset);
bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
table_offset &= PCI_MSIX_TABLE_OFFSET;
phys_addr = pci_resource_start(dev, bir) + table_offset;
@@ -734,22 +734,14 @@ static void msix_program_entries(struct pci_dev *dev,
  * single MSI-X irq. A return of zero indicates the successful setup of
  * requested MSI-X entries with allocated irqs or non-zero for otherwise.
  **/
-static int msix_capability_init(struct pci_dev *dev,
+static int msix_capability_init(struct pci_dev *dev, void __iomem *base,
struct msix_entry *entries, int nvec)
 {
int ret;
-   u16 control;
-   void __iomem *base;
 
/* Ensure MSI-X is disabled while it is set up */
msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
 
-   pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, );
-   /* Request & Map MSI-X table region */
-   base = msix_map_region(dev, msix_table_size(control));
-   if (!base)
-   return -ENOMEM;
-
ret = msix_setup_entries(dev, base, entries, nvec);
if (ret)
return ret;
@@ -948,6 +940,8 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry 
*entries, int nvec)
 {
int status, nr_entries;
int i, j;
+   void __iomem *base;
+   u16 control;
 
if (!entries || !dev->msix_cap || dev->current_state != PCI_D0)
return -EINVAL;
@@ -978,7 +972,14 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry 
*entries, int nvec)
dev_info(>dev, "can't enable MSI-X (MSI IRQ already 
assigned)\n");
return -EINVAL;
}
-   status = msix_capability_init(dev, entries, nvec);
+
+   /* Request & Map MSI-X table region */
+   pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, );
+   base = msix_map_region(dev, msix_table_size(control));
+   if (!base)
+   return -ENOMEM;
+
+   status = msix_capability_init(dev, base, entries, nvec);
return status;
 }
 EXPORT_SYMBOL(pci_enable_msix);
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[RFC PATCH 04/11] PCI/MSI: Move MSIX table address mapping out of msix_capability_init

2014-07-25 Thread Yijing Wang
Move MSIX table address mapping work to PCI MSIX layer.
Some Non-PCI MSI device will do their address mapping work before
enable MSIX capability or their MSIX table address is within
device address block. So Move address mapping stuff out of the
generic MSIX core. This is prepartion for generic MSI drvier.

Suggested-by: Yun Wu wuyun...@huawei.com
Signed-off-by: Yijing Wang wangyij...@huawei.com
---
 drivers/pci/msi.c |   25 +
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index d5c8e56..116383c 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -668,8 +668,8 @@ static void __iomem *msix_map_region(struct pci_dev *dev, 
unsigned nr_entries)
u32 table_offset;
u8 bir;
 
-   pci_read_config_dword(dev, dev-msix_cap + PCI_MSIX_TABLE,
- table_offset);
+   pci_read_config_dword(dev, dev-msix_cap + PCI_MSIX_TABLE, 
+   table_offset);
bir = (u8)(table_offset  PCI_MSIX_TABLE_BIR);
table_offset = PCI_MSIX_TABLE_OFFSET;
phys_addr = pci_resource_start(dev, bir) + table_offset;
@@ -734,22 +734,14 @@ static void msix_program_entries(struct pci_dev *dev,
  * single MSI-X irq. A return of zero indicates the successful setup of
  * requested MSI-X entries with allocated irqs or non-zero for otherwise.
  **/
-static int msix_capability_init(struct pci_dev *dev,
+static int msix_capability_init(struct pci_dev *dev, void __iomem *base,
struct msix_entry *entries, int nvec)
 {
int ret;
-   u16 control;
-   void __iomem *base;
 
/* Ensure MSI-X is disabled while it is set up */
msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
 
-   pci_read_config_word(dev, dev-msix_cap + PCI_MSIX_FLAGS, control);
-   /* Request  Map MSI-X table region */
-   base = msix_map_region(dev, msix_table_size(control));
-   if (!base)
-   return -ENOMEM;
-
ret = msix_setup_entries(dev, base, entries, nvec);
if (ret)
return ret;
@@ -948,6 +940,8 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry 
*entries, int nvec)
 {
int status, nr_entries;
int i, j;
+   void __iomem *base;
+   u16 control;
 
if (!entries || !dev-msix_cap || dev-current_state != PCI_D0)
return -EINVAL;
@@ -978,7 +972,14 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry 
*entries, int nvec)
dev_info(dev-dev, can't enable MSI-X (MSI IRQ already 
assigned)\n);
return -EINVAL;
}
-   status = msix_capability_init(dev, entries, nvec);
+
+   /* Request  Map MSI-X table region */
+   pci_read_config_word(dev, dev-msix_cap + PCI_MSIX_FLAGS, control);
+   base = msix_map_region(dev, msix_table_size(control));
+   if (!base)
+   return -ENOMEM;
+
+   status = msix_capability_init(dev, base, entries, nvec);
return status;
 }
 EXPORT_SYMBOL(pci_enable_msix);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/