]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: host: make MSENC firmware read-only
authorDeepak Nibade <dnibade@nvidia.com>
Mon, 30 Sep 2013 10:17:40 +0000 (15:47 +0530)
committerAjay Nandakumar <anandakumarm@nvidia.com>
Thu, 3 Oct 2013 18:01:15 +0000 (23:31 +0530)
- use dma_alloc_attrs() to allocate memory for MSENC firmware
- pass 'DMA_ATTR_READ_ONLY' to above API to make the memory
  read-only

Bug 1309863

Change-Id: I6d18064de1069ef55b6ffaf36219b892ed09d162
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/280233
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Reviewed-by: Arto Merilainen <amerilainen@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
(cherry picked from commit a9175249f3ab197b8e1e76d2bf1d30c19afdd068)
Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com>
drivers/video/tegra/host/msenc/msenc.c
drivers/video/tegra/host/msenc/msenc.h

index 5efa99ce7185e3fad03c67149a81db8b61fd5353..9a91f4c0a763e822bae3343f58f0fa2bc307d7a8 100644 (file)
@@ -153,7 +153,7 @@ int msenc_boot(struct platform_device *dev)
 
        nvhost_device_writel(dev, msenc_dmactl_r(), 0);
        nvhost_device_writel(dev, msenc_dmatrfbase_r(),
-               (nvhost_memmgr_dma_addr(m->pa) + m->os.bin_data_offset) >> 8);
+               (m->phys + m->os.bin_data_offset) >> 8);
 
        for (offset = 0; offset < m->os.data_size; offset += 256)
                msenc_dma_pa_to_internal_256b(dev,
@@ -268,6 +268,10 @@ int msenc_read_ucode(struct platform_device *dev, const char *fw_name)
        const struct firmware *ucode_fw;
        int err;
 
+       m->phys = 0;
+       m->mapped = NULL;
+       init_dma_attrs(&m->attrs);
+
        ucode_fw  = nvhost_client_request_firmware(dev, fw_name);
        if (!ucode_fw) {
                dev_err(&dev->dev, "failed to get msenc firmware\n");
@@ -275,36 +279,22 @@ int msenc_read_ucode(struct platform_device *dev, const char *fw_name)
                return err;
        }
 
-       /* allocate pages for ucode */
-       m->mem_r = nvhost_memmgr_alloc(nvhost_get_host(dev)->memmgr,
-                                    roundup(ucode_fw->size, PAGE_SIZE),
-                                    PAGE_SIZE, mem_mgr_flag_uncacheable, 0);
-       if (IS_ERR(m->mem_r)) {
-               dev_err(&dev->dev, "nvmap alloc failed");
-               err = PTR_ERR(m->mem_r);
-               goto clean_up;
-       }
-
-       m->pa = nvhost_memmgr_pin(nvhost_get_host(dev)->memmgr, m->mem_r,
-                       &dev->dev, mem_flag_read_only);
-       if (IS_ERR(m->pa)) {
-               dev_err(&dev->dev, "nvmap pin failed for ucode");
-               err = PTR_ERR(m->pa);
-               m->pa = NULL;
-               goto clean_up;
-       }
+       m->size = ucode_fw->size;
+       dma_set_attr(DMA_ATTR_READ_ONLY, &m->attrs);
 
-       m->mapped = nvhost_memmgr_mmap(m->mem_r);
+       m->mapped = dma_alloc_attrs(&dev->dev,
+                               m->size, &m->phys,
+                               GFP_KERNEL, &m->attrs);
        if (!m->mapped) {
-               dev_err(&dev->dev, "nvmap mmap failed");
+               dev_err(&dev->dev, "dma memory allocation failed");
                err = -ENOMEM;
                goto clean_up;
        }
 
-       err = msenc_setup_ucode_image(dev, (u32 *)m->mapped, ucode_fw);
+       err = msenc_setup_ucode_image(dev, m->mapped, ucode_fw);
        if (err) {
                dev_err(&dev->dev, "failed to parse firmware image\n");
-               return err;
+               goto clean_up;
        }
 
        m->valid = true;
@@ -315,18 +305,11 @@ int msenc_read_ucode(struct platform_device *dev, const char *fw_name)
 
 clean_up:
        if (m->mapped) {
-               nvhost_memmgr_munmap(m->mem_r, (u32 *)m->mapped);
+               dma_free_attrs(&dev->dev,
+                       m->size, m->mapped,
+                       m->phys, &m->attrs);
                m->mapped = NULL;
        }
-       if (m->pa) {
-               nvhost_memmgr_unpin(nvhost_get_host(dev)->memmgr, m->mem_r,
-                               &dev->dev, m->pa);
-               m->pa = NULL;
-       }
-       if (m->mem_r) {
-               nvhost_memmgr_put(nvhost_get_host(dev)->memmgr, m->mem_r);
-               m->mem_r = NULL;
-       }
        release_firmware(ucode_fw);
        return err;
 }
@@ -388,18 +371,11 @@ void nvhost_msenc_deinit(struct platform_device *dev)
 
        /* unpin, free ucode memory */
        if (m->mapped) {
-               nvhost_memmgr_munmap(m->mem_r, m->mapped);
+               dma_free_attrs(&dev->dev,
+                       m->size, m->mapped,
+                       m->phys, &m->attrs);
                m->mapped = NULL;
        }
-       if (m->pa) {
-               nvhost_memmgr_unpin(nvhost_get_host(dev)->memmgr, m->mem_r,
-                       &dev->dev, m->pa);
-               m->pa = NULL;
-       }
-       if (m->mem_r) {
-               nvhost_memmgr_put(nvhost_get_host(dev)->memmgr, m->mem_r);
-               m->mem_r = NULL;
-       }
        m->valid = false;
        kfree(m);
        set_msenc(dev, NULL);
index b080858c44e530be1876ffc4c55d734cd7efe059..ad0d677e5ac67b1f3a9e0b989c070cc9f1ccc9e7 100644 (file)
 #ifndef __NVHOST_MSENC_H__
 #define __NVHOST_MSENC_H__
 
+#include <linux/types.h>
+#include <linux/dma-attrs.h>
 #include <linux/nvhost.h>
 
-struct mem_handle;
-struct sg_table;
-
 int nvhost_msenc_finalize_poweron(struct platform_device *dev);
 int nvhost_msenc_init(struct platform_device *dev);
 void nvhost_msenc_deinit(struct platform_device *dev);
@@ -44,8 +43,7 @@ static inline void decode_msenc_ver(int version, u8 *maj, u8 *min)
 
 struct msenc {
        bool valid;
-       u32  size;
-       struct mem_handle *mem_r;
+       size_t size;
 
        struct {
                u32 bin_data_offset;
@@ -55,8 +53,9 @@ struct msenc {
                u32 size;
        } os;
 
-       struct sg_table *pa;
-       u8 *mapped;
+       struct dma_attrs attrs;
+       dma_addr_t phys;
+       u32 *mapped;
 };
 
 struct msenc_ucode_bin_header_v1 {
@@ -88,8 +87,6 @@ struct msenc_ucode_os_header_v1 {
 struct msenc_ucode_v1 {
        struct msenc_ucode_bin_header_v1 *bin_header;
        struct msenc_ucode_os_header_v1  *os_header;
-       struct mem_handle *mem;
-       struct sg_table *pa;
        bool valid;
 };