diff options
author | Matt Turner <mattst88@gmail.com> | 2010-06-06 05:21:47 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2010-08-13 19:41:57 -0400 |
commit | 200c2c410f4ef592173e645ad448739ccaedc32b (patch) | |
tree | 7e2ec62aecba6ffc9e9dd12386b9ddf2f16651fd | |
parent | 92cabe97c27c0e49136a3de9f9260545887d9d19 (diff) | |
download | glint-200c2c410f4ef592173e645ad448739ccaedc32b.tar.gz |
drm/glint: map register BAR.
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | drivers/gpu/drm/glint/Makefile | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint.h | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_device.c | 42 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_display.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_drv.h | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_kms.c | 34 |
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; } |