]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: dc: Allocate fb using dma_alloc_attrs()
authorSri Krishna chowdary <schowdary@nvidia.com>
Tue, 28 Oct 2014 13:30:51 +0000 (19:00 +0530)
committerKrishna Reddy <vdumpa@nvidia.com>
Wed, 3 Dec 2014 20:13:47 +0000 (12:13 -0800)
Framebuffer need not have physically contiguous memory.
It just needs contiguous IOVA. dma_alloc_attrs()
guarantees us the same.

This will avoid the need for framebuffer carveout.

Bug 200022149

Change-Id: I86b713e1ea9a323c7e85c82716894339cb9a1ef3
Signed-off-by: Sri Krishna chowdary <schowdary@nvidia.com>
Reviewed-on: http://git-master/r/590792
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
drivers/video/tegra/fb.c

index d1acc463287796eeff2fe1137a1401a4e79c22b7..693c250cfde976a2bf331b6087cbee0ec35dc88e 100644 (file)
@@ -743,6 +743,7 @@ struct tegra_fb_info *tegra_fb_register(struct platform_device *ndev,
        int mode_idx;
        unsigned stride;
        struct fb_videomode m;
+       DEFINE_DMA_ATTRS(attrs);
 
        if (!tegra_dc_get_window(dc, fb_data->win)) {
                dev_err(&ndev->dev, "dc does not have a window at index %d\n",
@@ -765,15 +766,16 @@ struct tegra_fb_info *tegra_fb_register(struct platform_device *ndev,
        tegra_fb->win.idx = fb_data->win;
 
        if (fb_mem) {
+               dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
                fb_size = resource_size(fb_mem);
-               tegra_fb->phys_start = fb_mem->start;
 
-               /* If the caller provided virtual address, meaning the buffer
-                * is already mapped, just use that address */
-               fb_base = virt_addr ? virt_addr :
-                       ioremap_wc(tegra_fb->phys_start, fb_size);
+               fb_base = dma_alloc_attrs(&ndev->dev,
+                                         fb_size,
+                                         &tegra_fb->phys_start,
+                                         GFP_KERNEL,
+                                         &attrs);
                if (!fb_base) {
-                       dev_err(&ndev->dev, "fb can't be mapped\n");
+                       dev_err(&ndev->dev, "failed to allocate framebuffer\n");
                        ret = -EBUSY;
                        goto err_free;
                }
@@ -877,8 +879,8 @@ struct tegra_fb_info *tegra_fb_register(struct platform_device *ndev,
        return tegra_fb;
 
 err_iounmap_fb:
-       if (fb_base)
-               iounmap(fb_base);
+       dma_free_attrs(&ndev->dev, fb_size, fb_base, tegra_fb->phys_start,
+                      &attrs);
 err_free:
        framebuffer_release(info);
 err:
@@ -888,6 +890,15 @@ err:
 void tegra_fb_unregister(struct tegra_fb_info *fb_info)
 {
        struct fb_info *info = fb_info->info;
+       phys_addr_t fb_size = resource_size(fb_info->fb_mem);
+       phys_addr_t fb_phys_start = fb_info->phys_start;
+       void *fb_base = fb_info->win.virt_addr;
+       struct device *dev = &fb_info->ndev->dev;
+       DEFINE_DMA_ATTRS(attrs);
+
+       dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs);
+
+       dma_free_attrs(dev, fb_size, fb_base, fb_phys_start, &attrs);
 
        unregister_framebuffer(info);