Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jul 2021 15:01:06 GMT
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 366d68f28379 - main - LinuxKPI: add module_pci_driver() and pci_alloc_irq_vectors()
Message-ID:  <202107271501.16RF16oE031742@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=366d68f283793df22392f9fb992c5029dfc293bb

commit 366d68f283793df22392f9fb992c5029dfc293bb
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2021-07-01 13:33:01 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2021-07-27 14:57:23 +0000

    LinuxKPI: add module_pci_driver() and pci_alloc_irq_vectors()
    
    Add the two new functions needed by rtw88 to register the driver and
    handle the module bits as well as a version of pci_alloc_irq_vectors()
    for what is needed.
    
    Reviewed by:    hselasky
    MFC after:      10 days
    Differential Revision: https://reviews.freebsd.org/D30981
---
 sys/compat/linuxkpi/common/include/linux/pci.h | 59 ++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h
index 4784799d82b5..a80e6965915d 100644
--- a/sys/compat/linuxkpi/common/include/linux/pci.h
+++ b/sys/compat/linuxkpi/common/include/linux/pci.h
@@ -186,6 +186,10 @@ typedef int pci_power_t;
 
 #define	PCI_EXT_CAP_ID_ERR		PCIZ_AER
 
+#define	PCI_IRQ_LEGACY			0x01
+#define	PCI_IRQ_MSI			0x02
+#define	PCI_IRQ_MSIX			0x04
+
 struct pci_dev;
 
 struct pci_driver {
@@ -221,6 +225,25 @@ extern spinlock_t pci_lock;
 
 #define	__devexit_p(x)	x
 
+#define module_pci_driver(_driver)					\
+									\
+static inline int							\
+_pci_init(void)								\
+{									\
+									\
+	return (linux_pci_register_driver(&_driver));			\
+}									\
+									\
+static inline void							\
+_pci_exit(void)								\
+{									\
+									\
+	linux_pci_unregister_driver(&_driver);				\
+}									\
+									\
+module_init(_pci_init);							\
+module_exit(_pci_exit)
+
 /*
  * If we find drivers accessing this from multiple KPIs we may have to
  * refcount objects of this structure.
@@ -817,6 +840,42 @@ pci_enable_msi(struct pci_dev *pdev)
 	return (0);
 }
 
+static inline int
+pci_alloc_irq_vectors(struct pci_dev *pdev, int minv, int maxv,
+    unsigned int flags)
+{
+	int error;
+
+	if (flags & PCI_IRQ_MSIX) {
+		struct msix_entry *entries;
+		int i;
+
+		entries = kcalloc(maxv, sizeof(*entries), GFP_KERNEL);
+		if (entries == NULL) {
+			error = -ENOMEM;
+			goto out;
+		}
+		for (i = 0; i < maxv; ++i)
+			entries[i].entry = i;
+		error = pci_enable_msix(pdev, entries, maxv);
+out:
+		kfree(entries);
+		if (error == 0 && pdev->msix_enabled)
+			return (pdev->dev.irq_end - pdev->dev.irq_start);
+	}
+	if (flags & PCI_IRQ_MSI) {
+		error = pci_enable_msi(pdev);
+		if (error == 0 && pdev->msi_enabled)
+			return (pdev->dev.irq_end - pdev->dev.irq_start);
+	}
+	if (flags & PCI_IRQ_LEGACY) {
+		if (pdev->irq)
+			return (1);
+	}
+
+	return (-EINVAL);
+}
+
 static inline int
 pci_channel_offline(struct pci_dev *pdev)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202107271501.16RF16oE031742>