/*
 * SPDX-FileCopyrightText: Copyright 2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
 * SPDX-License-Identifier: GPL-2.0-only
 *
 * This program is free software and is provided to you under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation, and any use by you of this program is subject to the terms
 * of such GNU licence.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can access it online at
 * http://www.gnu.org/licenses/gpl-2.0.html.
 */

/****************************************************************************
 * Includes
 ****************************************************************************/

#include "ethosu_dma_mem.h"

#include <linux/err.h>
#include <linux/dma-mapping.h>

/****************************************************************************
 * Functions
 ****************************************************************************/

struct ethosu_dma_mem *ethosu_dma_mem_alloc(struct device *dev,
					    size_t size)
{
	struct ethosu_dma_mem *dma_mem;

	if (!size)
		return ERR_PTR(-EINVAL);

	dma_mem = devm_kzalloc(dev, sizeof(*dma_mem), GFP_KERNEL);
	if (!dma_mem)
		return ERR_PTR(-ENOMEM);

	dma_mem->dev = dev;
	dma_mem->size = size;
	dma_mem->cpu_addr = dma_alloc_coherent(dev, size, &dma_mem->dma_addr,
					       GFP_KERNEL);
	if (!dma_mem->cpu_addr) {
		memset(dma_mem, 0, sizeof(*dma_mem));
		devm_kfree(dev, dma_mem);

		return ERR_PTR(-ENOMEM);
	}

	return dma_mem;
}

void ethosu_dma_mem_free(struct ethosu_dma_mem **dma_mem)
{
	struct device *dev;
	struct ethosu_dma_mem *mem;

	if (!dma_mem || !*dma_mem)
		return;

	mem = *dma_mem;
	dev = mem->dev;

	memset(mem->cpu_addr, 0, mem->size);
	dma_free_coherent(dev, mem->size, mem->cpu_addr, mem->dma_addr);

	memset(mem, 0, sizeof(*mem));
	devm_kfree(dev, mem);

	*dma_mem = NULL;
}
