Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/riastradh-drm2]: src/sys/external/bsd/drm2 Kludge up Linux PCI device sh...
details: https://anonhg.NetBSD.org/src/rev/6c4fa8301355
branches: riastradh-drm2
changeset: 788355:6c4fa8301355
user: riastradh <riastradh%NetBSD.org@localhost>
date: Wed Jul 24 03:24:03 2013 +0000
description:
Kludge up Linux PCI device shims.
. New drm_pci_attach/drm_pci_detach simplify initialization of
autoconf-derived struct pci_dev.
. New linux_pci_dev_init initializes struct pci_dev so that there's
one place where all its fields are listed. The kludge parameter is,
well, kludgey. Sorry.
. Replace pci_kludgey_find_dev by pci_get_bus_and_slot with the same
interface as Linux's, but some kasserts requiring it to look for the
one bus/device/function tuple that i915drm is interested in.
. Add pci_get_class which does similarly, for intel_detect_pch.
Later pci_get_bus_and_slot and pci_get_class should be fixed once we
can pass a cookie through PCI bus enumeration and pci_find_device.
diffstat:
sys/external/bsd/drm2/dist/include/drm/drmP.h | 5 +
sys/external/bsd/drm2/include/linux/pci.h | 116 +++++++++++++++++++------
sys/external/bsd/drm2/pci/drm_pci.c | 26 +++++-
3 files changed, 117 insertions(+), 30 deletions(-)
diffs (218 lines):
diff -r 3286dab862f7 -r 6c4fa8301355 sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h Wed Jul 24 03:23:46 2013 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h Wed Jul 24 03:24:03 2013 +0000
@@ -1830,6 +1830,11 @@
size_t align);
extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
+#ifdef __NetBSD__
+extern void drm_pci_attach(device_t, const struct pci_attach_args *,
+ struct pci_dev *, struct drm_device *);
+extern int drm_pci_detach(struct drm_device *, int);
+#endif
/* sysfs support (drm_sysfs.c) */
struct drm_sysfs_class;
diff -r 3286dab862f7 -r 6c4fa8301355 sys/external/bsd/drm2/include/linux/pci.h
--- a/sys/external/bsd/drm2/include/linux/pci.h Wed Jul 24 03:23:46 2013 +0000
+++ b/sys/external/bsd/drm2/include/linux/pci.h Wed Jul 24 03:24:03 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pci.h,v 1.1.2.12 2013/07/24 03:20:05 riastradh Exp $ */
+/* $NetBSD: pci.h,v 1.1.2.13 2013/07/24 03:24:03 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -59,10 +59,19 @@
#define PCI_BASE_CLASS_DISPLAY PCI_CLASS_DISPLAY
-#define PCI_CLASS_BRIDGE_ISA PCI_SUBCLASS_BRIDGE_ISA
+#define PCI_CLASS_BRIDGE_ISA \
+ ((PCI_CLASS_BRIDGE << 8) | PCI_SUBCLASS_BRIDGE_ISA)
+CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601);
#define PCI_VENDOR_ID_INTEL PCI_VENDOR_INTEL
+#define PCI_DEVFN(DEV, FN) \
+ (__SHIFTIN((DEV), __BITS(3, 7)) | __SHIFTIN((FN), __BITS(0, 2)))
+#define PCI_SLOT(DEVFN) __SHIFTOUT((DEVFN), __BITS(3, 7))
+#define PCI_FUNC(DEVFN) __SHIFTOUT((DEVFN), __BITS(0, 2))
+
+#define PCI_CAP_ID_AGP PCI_CAP_AGP
+
struct pci_dev {
struct pci_attach_args pd_pa;
bool pd_kludged; /* XXX pci_kludgey_find_dev */
@@ -84,12 +93,26 @@
return pdev->pd_dev;
}
-#define PCI_DEVFN(DEV, FN) \
- (__SHIFTIN((DEV), __BITS(3, 7)) | __SHIFTIN((FN), __BITS(0, 2)))
-#define PCI_SLOT(DEVFN) __SHIFTOUT((DEVFN), __BITS(3, 7))
-#define PCI_FUNC(DEVFN) __SHIFTOUT((DEVFN), __BITS(0, 2))
+static inline void
+linux_pci_dev_init(struct pci_dev *pdev, device_t dev,
+ const struct pci_attach_args *pa, bool kludged)
+{
+ const uint32_t subsystem_id = pci_conf_read(pa->pa_pc, pa->pa_tag,
+ PCI_SUBSYS_ID_REG);
-#define PCI_CAP_ID_AGP PCI_CAP_AGP
+ pdev->pd_pa = *pa;
+ pdev->pd_kludged = kludged;
+ pdev->pd_dev = dev;
+ pdev->bus = NULL; /* XXX struct pci_dev::bus */
+ pdev->devfn = PCI_DEVFN(pa->pa_device, pa->pa_function);
+ pdev->vendor = PCI_VENDOR(pa->pa_id);
+ pdev->device = PCI_PRODUCT(pa->pa_id);
+ pdev->subsystem_vendor = PCI_SUBSYS_VENDOR(subsystem_id);
+ pdev->subsystem_device = PCI_SUBSYS_ID(subsystem_id);
+ pdev->revision = PCI_REVISION(pa->pa_class);
+ pdev->class = __SHIFTOUT(pa->pa_class, 0xffffff00UL); /* ? */
+ pdev->msi_enabled = false;
+}
static inline int
pci_find_capability(struct pci_dev *pdev, int cap)
@@ -230,35 +253,72 @@
}
/*
- * XXX Mega-kludgerific!
- *
- * XXX Doesn't check whether any such device actually exists.
+ * XXX Mega-kludgerific! pci_get_bus_and_slot and pci_get_class are
+ * defined only for their single purposes in i915drm, in
+ * i915_get_bridge_dev and intel_detect_pch. We can't define them more
+ * generally without adapting pci_find_device (and pci_enumerate_bus
+ * internally) to pass a cookie through.
*/
+static inline int /* XXX inline? */
+pci_kludgey_match_bus0_dev0_func0(const struct pci_attach_args *pa)
+{
+
+ if (pa->pa_bus != 0)
+ return 0;
+ if (pa->pa_device != 0)
+ return 0;
+ if (pa->pa_function != 0)
+ return 0;
+
+ return 1;
+}
+
static inline struct pci_dev *
-pci_kludgey_find_dev(struct pci_dev *pdev, int bus, int dev, int func)
+pci_get_bus_and_slot(int bus, int slot)
{
- struct pci_dev *const otherdev = kmem_zalloc(sizeof(*otherdev),
- KM_SLEEP);
+ struct pci_attach_args pa;
+
+ KASSERT(bus == 0);
+ KASSERT(slot == PCI_DEVFN(0, 0));
+
+ if (!pci_find_device(&pa, &pci_kludgey_match_bus0_dev0_func0))
+ return NULL;
-#ifdef DIAGNOSTIC
- {
- int obus, odev, ofunc;
+ struct pci_dev *const pdev = kmem_zalloc(sizeof(*pdev), KM_SLEEP);
+ linux_pci_dev_init(pdev, NULL, &pa, true);
+
+ return pdev;
+}
+
+static inline int /* XXX inline? */
+pci_kludgey_match_isa_bridge(const struct pci_attach_args *pa)
+{
- pci_decompose_tag(pdev->pd_pa.pa_pc, pdev->pd_pa.pa_tag, &obus,
- &odev, &ofunc);
- KASSERT(obus == bus);
- }
-#endif
+ if (PCI_CLASS(pa->pa_class) != PCI_CLASS_BRIDGE)
+ return 0;
+ if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_BRIDGE_ISA)
+ return 0;
+
+ return 1;
+}
- otherdev->bus = NULL; /* XXX struct pci_dev::bus */
- otherdev->device = dev;
- otherdev->pd_pa = pdev->pd_pa;
- otherdev->pd_pa.pa_tag = pci_make_tag(otherdev->pd_pa.pa_pc,
- bus, dev, func);
- otherdev->pd_kludged = true;
+static inline struct pci_dev *
+pci_get_class(uint32_t class_subclass_shifted __unused,
+ struct pci_dev *from __unused)
+{
+ struct pci_attach_args pa;
- return otherdev;
+ KASSERT(class_subclass_shifted == (PCI_CLASS_BRIDGE_ISA << 8));
+ KASSERT(from == NULL);
+
+ if (!pci_find_device(&pa, &pci_kludgey_match_isa_bridge))
+ return NULL;
+
+ struct pci_dev *const pdev = kmem_zalloc(sizeof(*pdev), KM_SLEEP);
+ linux_pci_dev_init(pdev, NULL, &pa, true);
+
+ return pdev;
}
static inline void
diff -r 3286dab862f7 -r 6c4fa8301355 sys/external/bsd/drm2/pci/drm_pci.c
--- a/sys/external/bsd/drm2/pci/drm_pci.c Wed Jul 24 03:23:46 2013 +0000
+++ b/sys/external/bsd/drm2/pci/drm_pci.c Wed Jul 24 03:24:03 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_pci.c,v 1.1.2.1 2013/07/24 02:35:07 riastradh Exp $ */
+/* $NetBSD: drm_pci.c,v 1.1.2.2 2013/07/24 03:24:03 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.1.2.1 2013/07/24 02:35:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.1.2.2 2013/07/24 03:24:03 riastradh Exp $");
#include <sys/types.h>
#include <sys/errno.h>
@@ -73,6 +73,28 @@
return &dev->pdev->pd_pa;
}
+void
+drm_pci_attach(device_t self, const struct pci_attach_args *pa,
+ struct pci_dev *pdev, struct drm_device *dev)
+{
+
+ linux_pci_dev_init(pdev, self, pa, false);
+
+ dev->pdev = pdev;
+ dev->pci_vendor = pdev->vendor;
+ dev->pci_device = pdev->device;
+
+ /* XXX Set the power state to D0? */
+}
+
+int
+drm_pci_detach(struct drm_device *dev __unused, int flags __unused)
+{
+
+ /* XXX Disestablish irqs or anything? */
+ return 0;
+}
+
static int
drm_pci_get_irq(struct drm_device *dev)
{
Home |
Main Index |
Thread Index |
Old Index