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,
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");
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;
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;
}
/* 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);
#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);
struct msenc {
bool valid;
- u32 size;
- struct mem_handle *mem_r;
+ size_t size;
struct {
u32 bin_data_offset;
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 {
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;
};