diff options
Diffstat (limited to 'drivers/gpu/drm/msm/adreno/adreno_gpu.c')
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 5e10446f7798..10838943d4ab 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -313,6 +313,39 @@ static inline bool _rev_match(uint8_t entry, uint8_t id) return (entry == ANY_ID) || (entry == id); } +static void __iomem *adreno_ioremap(struct platform_device *pdev, + const char *name, const char *dbgname) +{ + struct resource *res; + unsigned long size; + void __iomem *ptr; + + if (name) + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name); + else + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + if (!res) { + dev_err(&pdev->dev, "failed to get memory resource: %s\n", name); + return ERR_PTR(-EINVAL); + } + + size = resource_size(res); + + ptr = devm_ioremap_nocache(&pdev->dev, res->start, size); + if (!ptr) { + dev_err(&pdev->dev, "failed to ioremap: %s\n", name); + return ERR_PTR(-ENOMEM); + } + + if (IS_ENABLED(CONFIG_DRM_MSM_REGISTER_LOGGING) && + unlikely(adreno_reglog)) + printk(KERN_DEBUG "IO:region %s %08x %08lx\n", dbgname, + (u32)ptr, size); + + return ptr; +} + int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, struct adreno_gpu *gpu, const struct adreno_gpu_funcs *funcs, struct adreno_gem *gem, struct workqueue_struct *wq, @@ -366,6 +399,12 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev, return ret; } + /* Map registers: */ + gpu->mmio = adreno_ioremap(pdev, "kgsl_3d0_reg_memory", + adreno_get_name(gpu)); + if (IS_ERR(gpu->mmio)) + return PTR_ERR(gpu->mmio); + ret = msm_gpu_init(drm, pdev, &gpu->base, funcs, "kgsl_3d0_reg_memory", "kgsl_3d0_irq", RB_SIZE); |