/*
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define LOG_LEVEL CONFIG_PCIE_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(pcie);

#include <errno.h>

#include <zephyr/kernel.h>

#include <soc.h>
#include <zephyr/device.h>
#include <zephyr/init.h>

#include <zephyr/drivers/pcie/pcie.h>
#include "ptm.h"

static int pcie_ptm_root_setup(const struct device *dev, uint32_t base)
{
	const struct pcie_ptm_root_config *config = dev->config;
	union ptm_cap_reg cap;
	union ptm_ctrl_reg ctrl;

	cap.raw = pcie_conf_read(config->bdf, base + PTM_CAP_REG_OFFSET);
	if ((cap.root == 0) || ((cap.root == 1) && (cap.responder == 0))) {
		LOG_ERR("PTM root not supported on 0x%x", config->bdf);
		return -ENOTSUP;
	}

	ctrl.ptm_enable = 1;
	ctrl.root_select = 1;

	pcie_conf_write(config->bdf, base + PTM_CTRL_REG_OFFSET, ctrl.raw);

	LOG_DBG("PTM root 0x%x enabled", config->bdf);

	return 0;
}

static int pcie_ptm_root_init(const struct device *dev)
{
	const struct pcie_ptm_root_config *config = dev->config;
	uint32_t reg;

	reg = pcie_get_ext_cap(config->bdf, PCIE_EXT_CAP_ID_PTM);
	if (reg == 0) {
		LOG_ERR("PTM capability not exposed on 0x%x", config->bdf);
		return -ENODEV;
	}

	return pcie_ptm_root_setup(dev, reg);
}

#define PCIE_PTM_ROOT_INIT(index)					\
	static const struct pcie_ptm_root_config ptm_config_##index = {	\
		.bdf = DT_INST_REG_ADDR(index),				\
	};								\
	DEVICE_DT_INST_DEFINE(index, &pcie_ptm_root_init, NULL, NULL,	\
			      &ptm_config_##index, PRE_KERNEL_1,	\
			      CONFIG_KERNEL_INIT_PRIORITY_DEVICE, NULL);

DT_INST_FOREACH_STATUS_OKAY(PCIE_PTM_ROOT_INIT)


bool pcie_ptm_enable(pcie_bdf_t bdf)
{
	uint32_t base;
	union ptm_cap_reg cap;
	union ptm_ctrl_reg ctrl;

	base = pcie_get_ext_cap(bdf, PCIE_EXT_CAP_ID_PTM);
	if (base == 0) {
		LOG_ERR("PTM capability not exposed on 0x%x", bdf);
		return false;
	}

	cap.raw = pcie_conf_read(bdf, base + PTM_CAP_REG_OFFSET);
	if (cap.requester == 0) {
		LOG_ERR("PTM requester not supported on 0x%x", bdf);
		return false;
	}

	ctrl.ptm_enable = 1;

	pcie_conf_write(bdf, base + PTM_CTRL_REG_OFFSET, ctrl.raw);

	LOG_DBG("PTM requester 0x%x enabled", bdf);

	return true;
}
