aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2010-07-12 17:07:51 -0400
committerMatt Turner <mattst88@gmail.com>2011-01-25 13:27:08 -0500
commite8f9b1903633557bf889041c326a04d928f96570 (patch)
tree8d1e6a18599c27c13b49e28135136763a87ccde0
parent9ac95cd9aeeac5c918e42c01db44b9b35a623896 (diff)
downloadglint-e8f9b1903633557bf889041c326a04d928f96570.tar.gz
drm/glint: reorganize VRAM init
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r--drivers/gpu/drm/glint/glint.h3
-rw-r--r--drivers/gpu/drm/glint/glint_device.c67
2 files changed, 43 insertions, 27 deletions
diff --git a/drivers/gpu/drm/glint/glint.h b/drivers/gpu/drm/glint/glint.h
index e4fda7166c180..243043bb70bc1 100644
--- a/drivers/gpu/drm/glint/glint.h
+++ b/drivers/gpu/drm/glint/glint.h
@@ -7,6 +7,7 @@
struct glint_mc {
resource_size_t aper_size;
resource_size_t aper_base;
+ char __iomem *vram;
u32 vram_size;
};
@@ -19,7 +20,7 @@ struct glint_device {
resource_size_t rmmio_base;
resource_size_t rmmio_size;
- void *rmmio;
+ void __iomem *rmmio;
struct glint_mc mc;
struct glint_mode_info mode_info;
diff --git a/drivers/gpu/drm/glint/glint_device.c b/drivers/gpu/drm/glint/glint_device.c
index 125df20bb0588..de5a428a29ddf 100644
--- a/drivers/gpu/drm/glint/glint_device.c
+++ b/drivers/gpu/drm/glint/glint_device.c
@@ -6,35 +6,19 @@
#include <video/pm3fb.h>
-static u32 glint_vram_init_size(struct glint_device *gdev)
+static u32 glint_vram_size(struct glint_device *gdev)
{
- char __iomem *vram;
- unsigned i;
u32 tempBypass = RREG32(PM3MemBypassWriteMask);
u32 temp1, temp2;
u32 memsize = 0;
-
- /* work out accessible VRAM */
- gdev->mc.aper_base = pci_resource_start(gdev->ddev->pdev, 1);
- gdev->mc.aper_size = pci_resource_len(gdev->ddev->pdev, 1);
-
- vram = ioremap(gdev->mc.aper_base, gdev->mc.aper_size);
- if (!vram) {
- GLINT_ERROR("Unable to ioremap %lu MB of VRAM. Retrying...\n", (unsigned long)gdev->mc.aper_size / MB);
- gdev->mc.aper_size /= 2;
- ioremap(gdev->mc.aper_base, gdev->mc.aper_size);
- if (!vram) {
- GLINT_ERROR("Unable to ioremap %lu MB of VRAM. Bailing out.\n", (unsigned long)gdev->mc.aper_size / MB);
- return 0;
- }
- GLINT_INFO("ioremapped %lu MB of VRAM.\n", (unsigned long)gdev->mc.aper_size / MB);
- }
+ unsigned i;
+ char __iomem *vram = gdev->mc.vram;
WREG32(PM3MemBypassWriteMask, 0xffffffff);
#define TEST_PATTERN 0x00345678
for (i = 0; i < 32; i++) {
- iowrite32(i * TEST_PATTERN, vram + (i * MB));
+ iowrite32(i * TEST_PATTERN, gdev->mc.vram + (i * MB));
mb();
temp1 = ioread32(vram + (i * MB));
@@ -69,16 +53,47 @@ static u32 glint_vram_init_size(struct glint_device *gdev)
GLINT_INFO("Second pass detected %u MB of VRAM\n", memsize + 1);
WREG32(PM3MemBypassWriteMask, tempBypass);
- iounmap(vram);
return (memsize + 1) * MB;
}
+static int glint_vram_init(struct glint_device *gdev)
+{
+ /* work out accessible VRAM */
+ gdev->mc.aper_base = pci_resource_start(gdev->ddev->pdev, 1);
+ gdev->mc.aper_size = pci_resource_len(gdev->ddev->pdev, 1);
+
+ gdev->mc.vram = ioremap(gdev->mc.aper_base, gdev->mc.aper_size);
+ if (!gdev->mc.vram) {
+ GLINT_ERROR("Unable to ioremap %lu MB of VRAM. Retrying...\n", (unsigned long)gdev->mc.aper_size / MB);
+ gdev->mc.aper_size /= 2;
+ ioremap(gdev->mc.aper_base, gdev->mc.aper_size);
+ if (!gdev->mc.vram) {
+ GLINT_ERROR("Unable to ioremap %lu MB of VRAM. Bailing out.\n", (unsigned long)gdev->mc.aper_size / MB);
+ return -1;
+ }
+ GLINT_INFO("ioremapped %lu MB of VRAM.\n", (unsigned long)gdev->mc.aper_size / MB);
+ }
+ gdev->mc.vram_size = glint_vram_size(gdev);
+
+ return 0;
+}
+
+static void glint_vram_fini(struct glint_device *gdev)
+{
+ iounmap(gdev->rmmio);
+ gdev->rmmio = NULL;
+ iounmap(gdev->mc.vram);
+ gdev->mc.vram = NULL;
+}
+
int glint_device_init(struct glint_device *gdev,
struct drm_device *ddev,
struct pci_dev *pdev,
uint32_t flags)
{
+ int ret;
+
gdev->dev = &pdev->dev;
gdev->ddev = ddev;
gdev->pdev = pdev;
@@ -97,19 +112,19 @@ int glint_device_init(struct glint_device *gdev,
#endif
gdev->rmmio = ioremap(gdev->rmmio_base, gdev->rmmio_size);
- if (gdev->rmmio == NULL) {
+ 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);
- gdev->mc.vram_size = glint_vram_init_size(gdev);
+ ret = glint_vram_init(gdev);
+ if (ret)
+ return ret;
return 0;
}
void glint_device_fini(struct glint_device *gdev)
{
- iounmap(gdev->rmmio);
- gdev->rmmio = NULL;
+ glint_vram_fini(gdev);
}