int fmpfw_hash_final(struct fmp_info *info, struct hash_data *hdata, void *output) { int ret = 0; unsigned long addr; struct device *dev = info->dev; struct hmac_sha256_fmpfw_info *fmpfw_info = hdata->fmpfw_info; memset(output, 0, hdata->digestsize); fmpfw_info->s.step = FINAL; fmpfw_info->s.output = (uint32_t)virt_to_phys(output); __flush_dcache_area(fmpfw_info, sizeof(*fmpfw_info)); addr = virt_to_phys(fmpfw_info); reinit_completion(&hdata->async.result->completion); __dma_unmap_area((void *)output, hdata->digestsize, DMA_FROM_DEVICE); if (fmpfw_info->hmac_mode) { ret = exynos_smc(SMC_CMD_FMP, FMP_FW_HMAC_SHA2_TEST, addr, 0); if (unlikely(ret)) { dev_err(dev, "Fail to smc call for FMPFW HMAC SHA256 final. ret = 0x%x\n", ret); ret = -EFAULT; } } else { ret = exynos_smc(SMC_CMD_FMP, FMP_FW_SHA2_TEST, addr, 0); if (unlikely(ret)) { dev_err(dev, "Fail to smc call for FMPFW SHA256 final. ret = 0x%x\n", ret); ret = -EFAULT; } } __dma_unmap_area((void *)output, hdata->digestsize, DMA_FROM_DEVICE); if (fmpfw_info->hmac_mode) dev_info(dev, "fmp fw hmac sha256 F/W final is done\n"); else dev_info(dev, "fmp fw sha256 F/W final is done\n"); kfree(fmpfw_info); return waitfor(info, hdata->async.result, ret); }
void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr, size_t size, enum dma_data_direction dir) { __dma_unmap_area(phys_to_virt(paddr), size, dir); }