[RFC PATCH 08/11] PCI/MSI: Introduce new struct msi_irqs and struct msi_ops

From: Yijing Wang
Date: Fri Jul 25 2014 - 22:45:39 EST


Currently, MSI driver is bonding with PCI everywhere.
Now introduce a new struct msi_irqs to manage all MSI
related informations in a MSI support device. In addition,
we introduce struct msi_ops to hook all device specific
MSI operations. Then MSI driver can be decoupled with
PCI.

Signed-off-by: Yijing Wang <wangyijing@xxxxxxxxxx>
---
include/linux/msi.h | 30 +++++++++++++++++++++++++++++-
include/linux/pci.h | 7 +------
2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/include/linux/msi.h b/include/linux/msi.h
index 3ad8416..5a672d3 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -10,6 +10,34 @@ struct msi_msg {
u32 data; /* 16 bits of msi message data */
};

+struct msi_ops;
+
+struct msi_irqs {
+ u8 msi_enabled:1;
+ u8 msix_enabled:1;
+ int node;
+ struct list_head msi_list;
+ void *data;
+ struct msi_ops *ops;
+};
+
+struct msix_entry {
+ u32 vector; /* kernel uses to write allocated vector */
+ u16 entry; /* driver uses to specify entry, OS writes */
+};
+
+struct msi_ops {
+ void (*msi_set_enable)(struct msi_irqs *msi, int enable, int type);
+ struct msi_desc *(*msi_setup_entry)(struct msi_irqs *msi);
+ int (*msix_setup_entries)(struct msi_irqs *msi, void __iomem *base,
+ struct msix_entry *entries, int nvec);
+ u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag);
+ u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag);
+ void (*msi_read_message)(struct msi_desc *desc, struct msi_msg *msg);
+ void (*msi_write_message)(struct msi_desc *desc, struct msi_msg *msg);
+ void (*msi_set_intx)(struct msi_irqs *msi, int enable);
+};
+
/* Helper functions */
struct irq_data;
struct msi_desc;
@@ -42,7 +70,7 @@ struct msi_desc {
void __iomem *mask_base;
u8 mask_pos;
};
- struct pci_dev *dev;
+ struct msi_irqs *msi;

/* Last set MSI message */
struct msi_msg msg;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index c6c01ae..c7bca1c 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -32,8 +32,8 @@
#include <uapi/linux/pci.h>

#include <linux/pci_ids.h>
-
#include <linux/msi.h>
+
/*
* The PCI interface treats multi-function devices as independent
* devices. The slot/function address of each device is encoded
@@ -1182,11 +1182,6 @@ enum pci_dma_burst_strategy {
strategy_parameter byte boundaries */
};

-struct msix_entry {
- u32 vector; /* kernel uses to write allocated vector */
- u16 entry; /* driver uses to specify entry, OS writes */
-};
-

#ifdef CONFIG_PCI_MSI
int pci_msi_vec_count(struct pci_dev *dev);
--
1.7.1

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