drm/glint: map register BAR.

Signed-off-by: Matt Turner <mattst88@gmail.com>
diff --git a/drivers/gpu/drm/glint/Makefile b/drivers/gpu/drm/glint/Makefile
index b178df6..867349d 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 0000000..9c0a596
--- /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 0000000..51163f9
--- /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 0000000..174e269
--- /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 8894ef8..58fedbc 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 08057b7..1a8d6f4 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;
 }