aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2010-06-06 05:21:47 -0400
committerMatt Turner <mattst88@gmail.com>2010-08-13 19:41:57 -0400
commit200c2c410f4ef592173e645ad448739ccaedc32b (patch)
tree7e2ec62aecba6ffc9e9dd12386b9ddf2f16651fd
parent92cabe97c27c0e49136a3de9f9260545887d9d19 (diff)
downloadglint-200c2c410f4ef592173e645ad448739ccaedc32b.tar.gz
drm/glint: map register BAR.
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r--drivers/gpu/drm/glint/Makefile2
-rw-r--r--drivers/gpu/drm/glint/glint.h18
-rw-r--r--drivers/gpu/drm/glint/glint_device.c42
-rw-r--r--drivers/gpu/drm/glint/glint_display.c13
-rw-r--r--drivers/gpu/drm/glint/glint_drv.h15
-rw-r--r--drivers/gpu/drm/glint/glint_kms.c34
6 files changed, 122 insertions, 2 deletions
diff --git a/drivers/gpu/drm/glint/Makefile b/drivers/gpu/drm/glint/Makefile
index b178df64fb1ade..867349dbe76dee 100644
--- a/drivers/gpu/drm/glint/Makefile
+++ b/drivers/gpu/drm/glint/Makefile
@@ -3,6 +3,6 @@
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
ccflags-y := -Iinclude/drm
-glint-y := glint_drv.o glint_irq.o glint_kms.o
+glint-y := glint_display.o glint_device.o glint_drv.o glint_irq.o glint_kms.o
obj-$(CONFIG_DRM_GLINT) += glint.o
diff --git a/drivers/gpu/drm/glint/glint.h b/drivers/gpu/drm/glint/glint.h
new file mode 100644
index 00000000000000..9c0a5967b3b1c6
--- /dev/null
+++ b/drivers/gpu/drm/glint/glint.h
@@ -0,0 +1,18 @@
+#ifndef __GLINT_H__
+#define __GLINT_H__
+
+#include "glint_family.h"
+
+struct glint_device {
+ struct device *dev;
+ struct drm_device *ddev;
+ struct pci_dev *pdev;
+ enum glint_family family;
+ unsigned long flags;
+
+ resource_size_t rmmio_base;
+ resource_size_t rmmio_size;
+ void *rmmio;
+};
+
+#endif /* __GLINT_H__ */
diff --git a/drivers/gpu/drm/glint/glint_device.c b/drivers/gpu/drm/glint/glint_device.c
new file mode 100644
index 00000000000000..51163f9808742f
--- /dev/null
+++ b/drivers/gpu/drm/glint/glint_device.c
@@ -0,0 +1,42 @@
+#include "drmP.h"
+#include "drm.h"
+
+#include "glint.h"
+#include "glint_drv.h"
+
+int glint_device_init(struct glint_device *gdev,
+ struct drm_device *ddev,
+ struct pci_dev *pdev,
+ uint32_t flags)
+{
+ gdev->dev = &pdev->dev;
+ gdev->ddev = ddev;
+ gdev->pdev = pdev;
+ gdev->flags = flags;
+
+ /* Registers mapping */
+ /* TODO: block userspace mapping of io register */
+ gdev->rmmio_base = pci_resource_start(gdev->ddev->pdev, 0);
+ gdev->rmmio_size = PM3_REGS_SIZE;
+ /* The first 64 KiB provides little-endian access, the second
+ * provides big-endian access. */
+#if defined(__BIG_ENDIAN)
+ gdev->rmmio_base += PM3_REGS_SIZE;
+ GLINT_INFO("Adjusting register base for big-endian.\n");
+#endif
+
+ gdev->rmmio = ioremap(gdev->rmmio_base, gdev->rmmio_size);
+ if (gdev->rmmio == NULL) {
+ return -ENOMEM;
+ }
+ GLINT_INFO("register mmio base: 0x%08X\n", (uint32_t)gdev->rmmio_base);
+ GLINT_INFO("register mmio size: %u\n", (unsigned)gdev->rmmio_size);
+
+ return 0;
+}
+
+void glint_device_fini(struct glint_device *gdev)
+{
+ iounmap(gdev->rmmio);
+ gdev->rmmio = NULL;
+}
diff --git a/drivers/gpu/drm/glint/glint_display.c b/drivers/gpu/drm/glint/glint_display.c
new file mode 100644
index 00000000000000..174e269c2c2c00
--- /dev/null
+++ b/drivers/gpu/drm/glint/glint_display.c
@@ -0,0 +1,13 @@
+#include "drmP.h"
+#include "drm.h"
+
+#include "glint.h"
+
+int glint_modeset_init(struct glint_device *gdev)
+{
+ return 0;
+}
+
+void glint_modeset_fini(struct glint_device *gdev)
+{
+}
diff --git a/drivers/gpu/drm/glint/glint_drv.h b/drivers/gpu/drm/glint/glint_drv.h
index 8894ef8c7996a0..58fedbcd8c3ed8 100644
--- a/drivers/gpu/drm/glint/glint_drv.h
+++ b/drivers/gpu/drm/glint/glint_drv.h
@@ -11,6 +11,21 @@
#define DRIVER_MINOR 0
#define DRIVER_PATCHLEVEL 0
+#define GLINT_INFO(fmt, arg...) DRM_INFO(DRIVER_NAME ": " fmt, ##arg)
+
+#include "glint.h"
+
+ /* glint_device.c */
+int glint_device_init(struct glint_device *gdev,
+ struct drm_device *ddev,
+ struct pci_dev *pdev,
+ uint32_t flags);
+void glint_device_fini(struct glint_device *gdev);
+
+ /* glint_display.c */
+int glint_modeset_init(struct glint_device *gdev);
+void glint_modeset_fini(struct glint_device *gdev);
+
/* glint_irq.c */
void glint_driver_irq_preinstall(struct drm_device *dev);
int glint_driver_irq_postinstall(struct drm_device *dev);
diff --git a/drivers/gpu/drm/glint/glint_kms.c b/drivers/gpu/drm/glint/glint_kms.c
index 08057b7c9de1a9..1a8d6f4fe3040d 100644
--- a/drivers/gpu/drm/glint/glint_kms.c
+++ b/drivers/gpu/drm/glint/glint_kms.c
@@ -1,13 +1,45 @@
#include "drmP.h"
#include "drm.h"
+#include "glint.h"
+#include "glint_drv.h"
+
int glint_driver_load(struct drm_device *dev, unsigned long flags)
{
- return 0;
+ struct glint_device *gdev;
+ int r;
+
+ gdev = kzalloc(sizeof(struct glint_device), GFP_KERNEL);
+ if (gdev == NULL) {
+ return -ENOMEM;
+ }
+ dev->dev_private = (void *)gdev;
+
+ r = glint_device_init(gdev, dev, dev->pdev, flags);
+ if (r) {
+ dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");
+ goto out;
+ }
+
+ r = glint_modeset_init(gdev);
+ if (r)
+ dev_err(&dev->pdev->dev, "Fatal error during modeset init\n");
+out:
+ if (r)
+ glint_driver_unload(dev);
+ return r;
}
int glint_driver_unload(struct drm_device *dev)
{
+ struct glint_device *gdev = dev->dev_private;
+
+ if (gdev == NULL)
+ return 0;
+ glint_modeset_fini(gdev);
+ glint_device_fini(gdev);
+ kfree(gdev);
+ dev->dev_private = NULL;
return 0;
}