int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); const struct firmware *fw; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *fw_name_p; void *mba_virt; dma_addr_t mba_phys; int ret, count; const u8 *data; fw_name_p = drv->non_elf_image ? fw_name_legacy : fw_name; /* Load and authenticate mba image */ ret = request_firmware(&fw, fw_name_p, pil->dev); if (ret) { dev_err(pil->dev, "Failed to locate %s\n", fw_name_p); return ret; } drv->mba_size = SZ_1M; md->mba_mem_dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); mba_virt = dma_alloc_coherent(&md->mba_mem_dev, drv->mba_size, &mba_phys, GFP_KERNEL); if (!mba_virt) { dev_err(pil->dev, "MBA metadata buffer allocation failed\n"); ret = -ENOMEM; #ifdef CONFIG_TRACE_MODEM_MEM_FAIL /*Need ramdump on exact alloc failure case for MODEM_MBA_AUTH 1M*/ BUG_ON(1); #endif goto err_dma_alloc; } drv->mba_phys = mba_phys; drv->mba_virt = mba_virt; /* Load the MBA image into memory */ count = fw->size; data = fw ? fw->data : NULL; memcpy(mba_virt, data, count); wmb(); ret = pil_mss_reset(pil); if (ret) { dev_err(pil->dev, "MBA boot failed.\n"); goto err_mss_reset; } release_firmware(fw); return 0; err_mss_reset: dma_free_coherent(&md->mba_mem_dev, drv->mba_size, drv->mba_virt, drv->mba_phys); err_dma_alloc: release_firmware(fw); return ret; }
int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); const struct firmware *fw; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *fw_name_p; void *mba_virt; dma_addr_t mba_phys, mba_phys_end; int ret, count; const u8 *data; fw_name_p = drv->non_elf_image ? fw_name_legacy : fw_name; /* Load and authenticate mba image */ ret = request_firmware(&fw, fw_name_p, pil->dev); if (ret) { dev_err(pil->dev, "Failed to locate %s\n", fw_name_p); return ret; } drv->mba_size = SZ_1M; md->mba_mem_dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); init_dma_attrs(&md->attrs_dma); dma_set_attr(DMA_ATTR_STRONGLY_ORDERED, &md->attrs_dma); mba_virt = dma_alloc_attrs(&md->mba_mem_dev, drv->mba_size, &mba_phys, GFP_KERNEL, &md->attrs_dma); if (!mba_virt) { dev_err(pil->dev, "MBA metadata buffer allocation failed\n"); ret = -ENOMEM; goto err_dma_alloc; } drv->mba_phys = mba_phys; drv->mba_virt = mba_virt; mba_phys_end = mba_phys + drv->mba_size; dev_info(pil->dev, "MBA: loading from %pa to %pa\n", &mba_phys, &mba_phys_end); /* Load the MBA image into memory */ data = fw ? fw->data : NULL; if (!data) { dev_err(pil->dev, "MBA data is NULL\n"); ret = -ENOMEM; goto err_mss_reset; } count = fw->size; memcpy(mba_virt, data, count); wmb(); ret = pil_mss_reset(pil); if (ret) { dev_err(pil->dev, "MBA boot failed.\n"); goto err_mss_reset; } release_firmware(fw); return 0; err_mss_reset: dma_free_attrs(&md->mba_mem_dev, drv->mba_size, drv->mba_virt, drv->mba_phys, &md->attrs_dma); drv->mba_virt = NULL; err_dma_alloc: release_firmware(fw); return ret; }