Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2/include/linux Add pci_enable/disable_d...



details:   https://anonhg.NetBSD.org/src/rev/580ab0dd07f7
branches:  trunk
changeset: 992711:580ab0dd07f7
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Aug 27 07:34:13 2018 +0000

description:
Add pci_enable/disable_device, pci_domain_nr, and some vendor ids.

diffstat:

 sys/external/bsd/drm2/include/linux/pci.h |  69 +++++++++++++++++++++++++++++-
 1 files changed, 65 insertions(+), 4 deletions(-)

diffs (125 lines):

diff -r 3042af1e6131 -r 580ab0dd07f7 sys/external/bsd/drm2/include/linux/pci.h
--- a/sys/external/bsd/drm2/include/linux/pci.h Mon Aug 27 07:34:03 2018 +0000
+++ b/sys/external/bsd/drm2/include/linux/pci.h Mon Aug 27 07:34:13 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pci.h,v 1.28 2018/08/27 07:20:05 riastradh Exp $       */
+/*     $NetBSD: pci.h,v 1.29 2018/08/27 07:34:13 riastradh Exp $       */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -68,8 +68,12 @@
 struct pci_driver;
 
 struct pci_bus {
+       /* NetBSD private members */
+       pci_chipset_tag_t       pb_pc;
+       device_t                pb_dev;
+
+       /* Linux API */
        u_int                   number;
-       pci_chipset_tag_t       pb_pc;
 };
 
 struct pci_device_id {
@@ -82,7 +86,7 @@
        unsigned long   driver_data;
 };
 
-#define        PCI_ANY_ID              ((pcireg_t)-1)
+#define        PCI_ANY_ID              (~0)
 
 #define        PCI_BASE_CLASS_DISPLAY  PCI_CLASS_DISPLAY
 
@@ -93,6 +97,7 @@
 CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601);
 
 /* XXX This is getting silly...  */
+#define        PCI_VENDOR_ID_APPLE     PCI_VENDOR_APPLE
 #define        PCI_VENDOR_ID_ASUSTEK   PCI_VENDOR_ASUSTEK
 #define        PCI_VENDOR_ID_ATI       PCI_VENDOR_ATI
 #define        PCI_VENDOR_ID_DELL      PCI_VENDOR_DELL
@@ -100,6 +105,7 @@
 #define        PCI_VENDOR_ID_HP        PCI_VENDOR_HP
 #define        PCI_VENDOR_ID_INTEL     PCI_VENDOR_INTEL
 #define        PCI_VENDOR_ID_NVIDIA    PCI_VENDOR_NVIDIA
+#define        PCI_VENDOR_ID_SI        PCI_VENDOR_SIS
 #define        PCI_VENDOR_ID_SONY      PCI_VENDOR_SONY
 #define        PCI_VENDOR_ID_VIA       PCI_VENDOR_VIATECH
 
@@ -150,6 +156,7 @@
        struct pci_conf_state   *pd_saved_state;
        struct acpi_devnode     *pd_ad;
        pci_intr_handle_t       *pd_intr_handles;
+       unsigned                pd_enablecnt;
 
        /* Linx API only below */
        struct pci_bus          *bus;
@@ -195,8 +202,9 @@
        pdev->pd_ad = NULL;
 #endif
        pdev->bus = kmem_zalloc(sizeof(struct pci_bus), KM_NOSLEEP);
+       pdev->bus->pb_pc = pa->pa_pc;
+       pdev->bus->pb_dev = device_parent(dev);
        pdev->bus->number = pa->pa_bus;
-       pdev->bus->pb_pc = pa->pa_pc;
        pdev->devfn = PCI_DEVFN(pa->pa_device, pa->pa_function);
        pdev->vendor = PCI_VENDOR(pa->pa_id);
        pdev->device = PCI_PRODUCT(pa->pa_id);
@@ -796,4 +804,57 @@
        return false;
 }
 
+static inline int
+pci_domain_nr(struct pci_bus *bus)
+{
+
+       return device_unit(bus->pb_dev);
+}
+
+/*
+ * We explicitly rename pci_enable/disable_device so that you have to
+ * review each use of them, since NetBSD's PCI API does _not_ respect
+ * our local enablecnt here, but there are different parts of NetBSD
+ * that automatically enable/disable like PMF, so you have to decide
+ * for each one whether to call it or not.
+ */
+
+static inline int
+linux_pci_enable_device(struct pci_dev *pdev)
+{
+       const struct pci_attach_args *pa = &pdev->pd_pa;
+       pcireg_t csr;
+       int s;
+
+       if (pdev->pd_enablecnt++)
+               return 0;
+
+       s = splhigh();
+       csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+       csr |= PCI_COMMAND_IO_ENABLE;
+       csr |= PCI_COMMAND_MEM_ENABLE;
+       pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
+       splx(s);
+
+       return 0;
+}
+
+static inline void
+linux_pci_disable_device(struct pci_dev *pdev)
+{
+       const struct pci_attach_args *pa = &pdev->pd_pa;
+       pcireg_t csr;
+       int s;
+
+       if (--pdev->pd_enablecnt)
+               return;
+
+       s = splhigh();
+       csr = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+       csr &= ~PCI_COMMAND_IO_ENABLE;
+       csr &= ~PCI_COMMAND_MEM_ENABLE;
+       pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, csr);
+       splx(s);
+}
+
 #endif  /* _LINUX_PCI_H_ */



Home | Main Index | Thread Index | Old Index