diff options
author | Matt Turner <mattst88@gmail.com> | 2010-07-12 17:07:51 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2011-01-25 13:27:08 -0500 |
commit | e8f9b1903633557bf889041c326a04d928f96570 (patch) | |
tree | 8d1e6a18599c27c13b49e28135136763a87ccde0 | |
parent | 9ac95cd9aeeac5c918e42c01db44b9b35a623896 (diff) | |
download | glint-e8f9b1903633557bf889041c326a04d928f96570.tar.gz |
drm/glint: reorganize VRAM init
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | drivers/gpu/drm/glint/glint.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_device.c | 67 |
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); } |