static int flcn_read_ucode(struct platform_device *dev, const char *fw_name) { struct flcn *v = get_flcn(dev); const struct firmware *ucode_fw; int err; DEFINE_DMA_ATTRS(attrs); nvhost_dbg_fn(""); v->dma_addr = 0; v->mapped = NULL; ucode_fw = nvhost_client_request_firmware(dev, fw_name); if (!ucode_fw) { nvhost_dbg_fn("request firmware failed"); dev_err(&dev->dev, "failed to get firmware\n"); err = -ENOENT; return err; } v->size = ucode_fw->size; dma_set_attr(DMA_ATTR_READ_ONLY, &attrs); v->mapped = dma_alloc_attrs(&dev->dev, v->size, &v->dma_addr, GFP_KERNEL, &attrs); if (!v->mapped) { dev_err(&dev->dev, "dma memory allocation failed"); err = -ENOMEM; goto clean_up; } err = flcn_setup_ucode_image(dev, v->mapped, ucode_fw); if (err) { dev_err(&dev->dev, "failed to parse firmware image\n"); goto clean_up; } v->valid = true; release_firmware(ucode_fw); return 0; clean_up: if (v->mapped) { dma_free_attrs(&dev->dev, v->size, v->mapped, v->dma_addr, &attrs); v->mapped = NULL; v->dma_addr = 0; } release_firmware(ucode_fw); return err; }
int msenc_read_ucode(struct platform_device *dev, const char *fw_name) { struct msenc *m = get_msenc(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"); err = -ENOENT; return err; } m->size = ucode_fw->size; dma_set_attr(DMA_ATTR_READ_ONLY, &m->attrs); m->mapped = dma_alloc_attrs(&dev->dev, m->size, &m->phys, GFP_KERNEL, &m->attrs); if (!m->mapped) { dev_err(&dev->dev, "dma memory allocation failed"); err = -ENOMEM; goto clean_up; } err = msenc_setup_ucode_image(dev, m->mapped, ucode_fw); if (err) { dev_err(&dev->dev, "failed to parse firmware image\n"); goto clean_up; } m->valid = true; release_firmware(ucode_fw); return 0; clean_up: if (m->mapped) { dma_free_attrs(&dev->dev, m->size, m->mapped, m->phys, &m->attrs); m->mapped = NULL; } release_firmware(ucode_fw); return err; }
int msenc_read_ucode(struct platform_device *dev, const char *fw_name) { struct msenc *m = get_msenc(dev); const struct firmware *ucode_fw; int err; ucode_fw = nvhost_client_request_firmware(dev, fw_name); if (IS_ERR_OR_NULL(ucode_fw)) { dev_err(&dev->dev, "failed to get msenc firmware\n"); err = -ENOENT; return err; } /* allocate pages for ucode */ m->mem_r = mem_op().alloc(nvhost_get_host(dev)->memmgr, roundup(ucode_fw->size, PAGE_SIZE), PAGE_SIZE, mem_mgr_flag_uncacheable); if (IS_ERR_OR_NULL(m->mem_r)) { dev_err(&dev->dev, "nvmap alloc failed"); err = -ENOMEM; goto clean_up; } m->pa = mem_op().pin(nvhost_get_host(dev)->memmgr, m->mem_r); if (IS_ERR_OR_NULL(m->pa)) { dev_err(&dev->dev, "nvmap pin failed for ucode"); err = PTR_ERR(m->pa); m->pa = NULL; goto clean_up; } m->mapped = mem_op().mmap(m->mem_r); if (IS_ERR_OR_NULL(m->mapped)) { dev_err(&dev->dev, "nvmap mmap failed"); err = -ENOMEM; goto clean_up; } err = msenc_setup_ucode_image(dev, (u32 *)m->mapped, ucode_fw); if (err) { dev_err(&dev->dev, "failed to parse firmware image\n"); return err; } m->valid = true; release_firmware(ucode_fw); return 0; clean_up: if (m->mapped) { mem_op().munmap(m->mem_r, (u32 *)m->mapped); m->mapped = NULL; } if (m->pa) { mem_op().unpin(nvhost_get_host(dev)->memmgr, m->mem_r, m->pa); m->pa = NULL; } if (m->mem_r) { mem_op().put(nvhost_get_host(dev)->memmgr, m->mem_r); m->mem_r = NULL; } release_firmware(ucode_fw); return err; }