linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 00/11] Refactor MSI to support Non-PCI device
@ 2014-07-26  3:08 Yijing Wang
  2014-07-26  3:08 ` [RFC PATCH 01/11] PCI/MSI: Use pci_dev->msi_cap instead of msi_desc->msi_attrib.pos Yijing Wang
                   ` (12 more replies)
  0 siblings, 13 replies; 41+ messages in thread
From: Yijing Wang @ 2014-07-26  3:08 UTC (permalink / raw)
  To: linux-kernel
  Cc: Xinwei Hu, Wuyun, Bjorn Helgaas, linux-pci, Paul.Mundt,
	James E.J. Bottomley, Marc Zyngier, linux-arm-kernel,
	Russell King, linux-arch, arnab.basu, virtualization, Hanjun Guo,
	Yijing Wang

Hi all,
	The series is a draft of generic MSI driver that supports PCI
and Non-PCI device which have MSI capability. If you're not interested
it, sorry for the noise.

The series is based on Linux-3.16-rc1.

MSI was introduced in PCI Spec 2.2. Currently, kernel MSI 
driver codes are bonding with PCI device. Because MSI has a lot
advantages in design. More and more non-PCI devices want to
use MSI as their default interrupt. The existing MSI device
include HPET. HPET driver provide its own MSI code to initialize
and process MSI interrupts. In the latest GIC v3 spec, legacy device
can deliver MSI by the help of a relay device named consolidator.
Consolidator can translate the legacy interrupts connected to it
to MSI/MSI-X. And new non-PCI device will be designed to 
support MSI in future. So make the MSI driver code be generic will 
help the non-PCI device use MSI more simply.

The new data struct for generic MSI driver.
struct msi_irqs {
	u8 msi_enabled:1; /* Enable flag */
	u8 msix_enabled:1;
	struct list_head msi_list; /* MSI desc list */
	void *data;	/* help to find the MSI device */
	struct msi_ops *ops; /* MSI device specific hook */
};
struct msi_irqs is used to manage MSI related informations. Every device supports
MSI should contain this data struct and allocate it.

struct msi_ops {
	struct msi_desc *(*msi_setup_entry)(struct msi_irqs *msi, struct msi_desc *entry);
	int msix_setup_entries(struct msi_irqs *msi, struct msix_entry *entries);
	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);
};
struct msi_ops provides several hook functions, generic MSI driver will call
the hook functions to access device specific registers. PCI devices will share
the same msi_ops, because they have the same way to access MSI hardware registers.

Generic MSI layer export msi_capability_init() and msix_capability_init() functions
to drivers. msi/x_capability_init() will initialize MSI capability data struct msi_desc
and alloc the irq, then write the msi address/data value to hardware registers.

This series only did compile test, we will test it in x86 and arm platform later.

Any comments are welcome.

Thanks!
Yijing.




Yijing Wang (11):
  PCI/MSI: Use pci_dev->msi_cap instead of msi_desc->msi_attrib.pos
  PCI/MSI: Use new MSI type macro instead of PCI MSI flags
  PCI/MSI: Refactor pci_dev_msi_enabled()
  PCI/MSI: Move MSIX table address mapping out of msix_capability_init
  PCI/MSI: Move populate_msi_sysfs() out of msi_capability_init()
  PCI/MSI: Save MSI irq in PCI MSI layer
  PCI/MSI: Mask MSI-X entry in msix_setup_entries()
  PCI/MSI: Introduce new struct msi_irqs and struct msi_ops
  PCI/MSI: refactor PCI MSI driver
  PCI/MSI: Split the generic MSI code into new file
  x86/MSI: Refactor x86 MSI code

 arch/cris/arch-v32/drivers/pci/bios.c     |    2 +-
 arch/frv/mb93090-mb00/pci-vdk.c           |    2 +-
 arch/ia64/pci/pci.c                       |    4 +-
 arch/mips/pci/msi-octeon.c                |    8 +-
 arch/powerpc/kernel/eeh_driver.c          |    2 +-
 arch/powerpc/kernel/msi.c                 |    2 +-
 arch/powerpc/platforms/pseries/msi.c      |    8 +-
 arch/s390/pci/pci.c                       |    2 +-
 arch/x86/include/asm/io_apic.h            |    2 +-
 arch/x86/include/asm/irq_remapping.h      |    4 +-
 arch/x86/include/asm/pci.h                |    6 +-
 arch/x86/include/asm/x86_init.h           |   10 +-
 arch/x86/kernel/apic/io_apic.c            |   25 +-
 arch/x86/kernel/x86_init.c                |   12 +-
 arch/x86/pci/common.c                     |    5 +-
 arch/x86/pci/xen.c                        |   24 +-
 drivers/Kconfig                           |    1 +
 drivers/Makefile                          |    1 +
 drivers/block/nvme-core.c                 |    4 +-
 drivers/dma/ioat/dma.c                    |    2 +-
 drivers/firewire/ohci.c                   |    2 +-
 drivers/gpu/drm/i915/i915_dma.c           |    4 +-
 drivers/iommu/amd_iommu.c                 |   16 +-
 drivers/iommu/intel_irq_remapping.c       |    9 +-
 drivers/iommu/irq_remapping.c             |   53 ++--
 drivers/iommu/irq_remapping.h             |    6 +-
 drivers/irqchip/irq-armada-370-xp.c       |    2 +-
 drivers/misc/mei/hw-me.c                  |    2 +-
 drivers/misc/mei/hw-txe.c                 |    2 +-
 drivers/misc/mei/pci-me.c                 |    4 +-
 drivers/misc/mei/pci-txe.c                |    4 +-
 drivers/misc/mic/host/mic_debugfs.c       |    4 +-
 drivers/misc/mic/host/mic_intr.c          |    8 +-
 drivers/msi/Kconfig                       |    8 +
 drivers/msi/Makefile                      |    1 +
 drivers/msi/msi.c                         |  539 +++++++++++++++++++++++
 drivers/ntb/ntb_hw.c                      |    2 +-
 drivers/pci/Kconfig                       |    6 +-
 drivers/pci/host/pcie-designware.c        |    2 +-
 drivers/pci/irq.c                         |    4 +-
 drivers/pci/msi.c                         |  660 +++++++----------------------
 drivers/pci/pci.c                         |    6 +-
 drivers/pci/pcie/portdrv_core.c           |    4 +-
 drivers/scsi/esas2r/esas2r_init.c         |    4 +-
 drivers/scsi/esas2r/esas2r_ioctl.c        |    4 +-
 drivers/scsi/hpsa.c                       |    4 +-
 drivers/staging/crystalhd/crystalhd_lnx.c |    2 +-
 drivers/xen/xen-pciback/pciback_ops.c     |   12 +-
 include/linux/msi.h                       |   73 +++-
 include/linux/pci.h                       |   24 +-
 virt/kvm/assigned-dev.c                   |    2 +-
 51 files changed, 929 insertions(+), 670 deletions(-)
 create mode 100644 drivers/msi/Kconfig
 create mode 100644 drivers/msi/Makefile
 create mode 100644 drivers/msi/msi.c


^ permalink raw reply	[flat|nested] 41+ messages in thread

end of thread, other threads:[~2014-09-03  7:15 UTC | newest]

Thread overview: 41+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-26  3:08 [RFC PATCH 00/11] Refactor MSI to support Non-PCI device Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 01/11] PCI/MSI: Use pci_dev->msi_cap instead of msi_desc->msi_attrib.pos Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 02/11] PCI/MSI: Use new MSI type macro instead of PCI MSI flags Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 03/11] PCI/MSI: Refactor pci_dev_msi_enabled() Yijing Wang
2014-08-05 22:35   ` Stuart Yoder
2014-08-06  1:23     ` Yijing Wang
2014-08-20  5:57   ` Bharat.Bhushan
2014-08-20  6:30     ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 04/11] PCI/MSI: Move MSIX table address mapping out of msix_capability_init Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 05/11] PCI/MSI: Move populate_msi_sysfs() out of msi_capability_init() Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 06/11] PCI/MSI: Save MSI irq in PCI MSI layer Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 07/11] PCI/MSI: Mask MSI-X entry in msix_setup_entries() Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 08/11] PCI/MSI: Introduce new struct msi_irqs and struct msi_ops Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 09/11] PCI/MSI: refactor PCI MSI driver Yijing Wang
2014-08-20  6:06   ` Bharat.Bhushan
2014-08-20  6:34     ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 10/11] PCI/MSI: Split the generic MSI code into new file Yijing Wang
2014-08-20  6:18   ` Bharat.Bhushan
2014-08-20  6:43     ` Yijing Wang
2014-07-26  3:08 ` [RFC PATCH 11/11] x86/MSI: Refactor x86 MSI code Yijing Wang
2014-08-20  6:20   ` Bharat.Bhushan
2014-08-20  7:01     ` Yijing Wang
2014-07-29 14:08 ` [RFC PATCH 00/11] Refactor MSI to support Non-PCI device Arnd Bergmann
2014-07-30  2:45   ` Yijing Wang
2014-07-30  6:47     ` Jiang Liu
2014-07-30  7:20       ` Yijing Wang
2014-08-01 13:16         ` Arnd Bergmann
2014-08-04  3:32           ` Yijing Wang
2014-08-04 14:45             ` Arnd Bergmann
2014-08-05  2:20               ` Yijing Wang
2014-08-01 13:52     ` Arnd Bergmann
2014-08-04  6:43       ` Yijing Wang
2014-08-04 14:59         ` Arnd Bergmann
2014-08-05  2:12           ` Yijing Wang
2014-08-01 10:27 ` arnab.basu
2014-08-04  3:03   ` Yijing Wang
2014-08-20  5:44     ` Bharat.Bhushan
2014-08-20  6:28       ` Yijing Wang
2014-08-20  7:41         ` Bharat.Bhushan
2014-08-20  7:55           ` Yijing Wang
2014-09-03  7:15           ` Yijing Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).