[PATCH] basic drm driver for Trident CyberBlade

From: Jesse Barnes
Date: Sun Mar 05 2006 - 23:52:28 EST


I'm trying to get the CyberBlade EXA driver into a bit better shape, and
that means some sort of decent host<->fb DMA support. The device
itself is apparently capable of that, but EXA has trouble since it only
has the user virtual address of the transfers it wants to make, so I
thought a DRM driver might be in order. It's also necessary for decent
VBLANK support, which will hopefully be pretty straightforward. Note
that at this point, the DRM driver won't do you any good since I
haven't checked the EXA stuff that uses it into X.Org CVS yet (and
afaik there's no DRI driver for this device either).

Any thoughts on how the host<->fb DMA stuff should work? Basically EXA
UploadToScreen wants to hand the card a virtual address range and have
it loaded up to the card's VRAM; DownloadFromScreen wants to do the
same in reverse. Should I just add a device specific DRM_IOCTL to
accomplish this (using get_user_pages() etc.) or is there some existing
code I could leverage?

Thanks,
Jesse

Signed-off-by: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>
diff --git a/drivers/char/drm/Makefile b/drivers/char/drm/Makefile
index 9d180c4..a212175 100644
--- a/drivers/char/drm/Makefile
+++ b/drivers/char/drm/Makefile
@@ -8,6 +8,7 @@ drm-objs := drm_auth.o drm_bufs.o drm
drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
drm_sysfs.o

+blade-objs := blade_drv.o
tdfx-objs := tdfx_drv.o
r128-objs := r128_drv.o r128_cce.o r128_state.o r128_irq.o
mga-objs := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o
@@ -30,6 +31,7 @@ endif

obj-$(CONFIG_DRM) += drm.o
obj-$(CONFIG_DRM_TDFX) += tdfx.o
+obj-$(CONFIG_DRM_BLADE) += blade.o
obj-$(CONFIG_DRM_R128) += r128.o
obj-$(CONFIG_DRM_RADEON)+= radeon.o
obj-$(CONFIG_DRM_MGA) += mga.o
--- /dev/null 2006-03-02 18:11:38.777108750 -0800
+++ drivers/char/drm/blade_drv.c 2006-03-05 20:24:53.000000000 -0800
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2006 Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ * Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx>
+ */
+
+#include <linux/config.h>
+#include "drm_pciids.h"
+#include "drmP.h"
+
+#define DRIVER_AUTHOR "Jesse Barnes"
+
+#define DRIVER_NAME "blade_drm"
+#define DRIVER_DESC "Trident CyberBlade"
+#define DRIVER_DATE "20060303"
+
+#define DRIVER_MAJOR 1
+#define DRIVER_MINOR 0
+#define DRIVER_PATCHLEVEL 0
+
+static struct pci_device_id blade_pciids[] = {
+ blade_PCI_IDS
+};
+
+static struct drm_driver blade_driver = {
+ .driver_features = (DRIVER_USE_AGP | DRIVER_USE_MTRR |
+ DRIVER_PCI_DMA | DRIVER_SG | DRIVER_HAVE_DMA |
+ DRIVER_HAVE_IRQ | DRIVER_FB_DMA), /* IRQ_VBL? */
+ .reclaim_buffers = drm_core_reclaim_buffers,
+ .get_map_ofs = drm_core_get_map_ofs,
+ .get_reg_ofs = drm_core_get_reg_ofs,
+ .fops = {
+ .owner = THIS_MODULE,
+ .open = drm_open,
+ .release = drm_release,
+ .ioctl = drm_ioctl,
+ .mmap = drm_mmap,
+ .poll = drm_poll,
+ .fasync = drm_fasync,
+ },
+ .pci_driver = {
+ .name = DRIVER_NAME,
+ .id_table = blade_pciids,
+ },
+
+ .name = DRIVER_NAME,
+ .desc = DRIVER_DESC,
+ .date = DRIVER_DATE,
+ .major = DRIVER_MAJOR,
+ .minor = DRIVER_MINOR,
+ .patchlevel = DRIVER_PATCHLEVEL,
+};
+
+static int vblank_wait(struct drm_device * dev, unsigned int *sequence)
+{
+ /* Use next vblank interrupt or pending register */
+}
+
+static irqreturn_t irq_handler(DRM_IRQ_ARGS)
+{
+}
+
+static void irq_preinstall(struct drm_device * dev)
+{
+}
+
+static void irq_postinstall(struct drm_device * dev)
+{
+}
+
+static void irq_uninstall(struct drm_device * dev)
+{
+}
+
+static int __init blade_init(void)
+{
+ /*
+ * TODO:
+ * ioremap device resources
+ * Setup IRQ for vblank
+ * Lots of other stuff (e.g. host<->fb dma stuff)
+ */
+ return drm_init(&blade_driver);
+}
+
+static void __exit blade_exit(void)
+{
+ drm_exit(&blade_driver);
+}
+
+module_init(blade_init);
+module_exit(blade_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/char/drm/Kconfig b/drivers/char/drm/Kconfig
index 56ace9d..10c42b7 100644
--- a/drivers/char/drm/Kconfig
+++ b/drivers/char/drm/Kconfig
@@ -16,6 +16,13 @@ config DRM
details. You should also select and configure AGP
(/dev/agpgart) support.

+config DRM_BLADE
+ tristate "Trident CyberBlade/i1"
+ depends on DRM && PCI
+ help
+ Choose this option if you have a Trident CyberBlade/i1 device. If M
+ is selected, the module will be called blade.
+
config DRM_TDFX
tristate "3dfx Banshee/Voodoo3+"
depends on DRM && PCI