/* SPDX-License-Identifier: GPL-2.0-only */

#include <baseboard/variants.h>
#include <console/console.h>
#include <fw_config.h>
#include <gpio.h>
#include <soc/platform_descriptors.h>
#include <types.h>

static fsp_dxio_descriptor myst_dxio_descriptors[] = {
	[DXIO_WWAN] = {
		.engine_type = UNUSED_ENGINE,
		.port_present = true,
		.start_logical_lane = 13,
		.end_logical_lane = 13,
		.device_number = PCI_SLOT(WWAN_DEVFN),
		.function_number = PCI_FUNC(WWAN_DEVFN),
		.link_speed_capability = GEN3,
		.turn_off_unused_lanes = true,
		.clk_req = CLK_REQ2,
	},
	[DXIO_WLAN] = {
		.engine_type = PCIE_ENGINE,
		.port_present = true,
		.start_logical_lane = 14,
		.end_logical_lane = 14,
		.device_number = PCI_SLOT(WLAN_DEVFN),
		.function_number = PCI_FUNC(WLAN_DEVFN),
		.link_speed_capability = GEN3,
		.turn_off_unused_lanes = true,
		.clk_req = CLK_REQ0,
	},
	[DXIO_SD] = {
		.engine_type = PCIE_ENGINE,
		.port_present = true,
		.start_logical_lane = 15,
		.end_logical_lane = 15,
		.device_number = PCI_SLOT(SD_DEVFN),
		.function_number = PCI_FUNC(SD_DEVFN),
		.link_speed_capability = GEN1,
		.turn_off_unused_lanes = true,
		.link_hotplug = 3,
		.clk_req = CLK_REQ1,
	},
	[DXIO_STORAGE] = { 0 },
};

static const fsp_dxio_descriptor emmc_descriptor = {
	.engine_type = PCIE_ENGINE,
	.port_present = true,
	.start_logical_lane = 16,
	.end_logical_lane = 16,
	.device_number = PCI_SLOT(NVME_DEVFN),
	.function_number = PCI_FUNC(NVME_DEVFN),
	.link_speed_capability = GEN_MAX,
	.turn_off_unused_lanes = true,
	/* TODO(b/284213391): Fix PCIe shutdown */
	.link_hotplug = 3,
	.clk_req = CLK_REQ3,
};

static const fsp_dxio_descriptor nvme_descriptor = {
	.engine_type = PCIE_ENGINE,
	.port_present = true,
	.start_logical_lane = 16,
	.end_logical_lane = 19,
	.device_number = PCI_SLOT(NVME_DEVFN),
	.function_number = PCI_FUNC(NVME_DEVFN),
	.link_speed_capability = GEN_MAX,
	.turn_off_unused_lanes = true,
	/* TODO(b/284213391): Fix PCIe shutdown */
	.link_hotplug = 3,
	.clk_req = CLK_REQ3,
};

static const fsp_ddi_descriptor myst_ddi_descriptors[] = {
	{ /* DDI0 - eDP */
		.connector_type = DDI_EDP,
		.aux_index = DDI_AUX1,
		.hdp_index = DDI_HDP1
	},
	{ /* DDI1 - HDMI/DP */
		.connector_type = DDI_HDMI,
		.aux_index = DDI_AUX2,
		.hdp_index = DDI_HDP2
	},
	{ /* DDI2 - DP (type C) */
		.connector_type = DDI_DP_W_TYPEC,
		.aux_index = DDI_AUX3,
		.hdp_index = DDI_HDP3,
	},
	{ /* DDI3 - DP (type C) */
		.connector_type = DDI_DP_W_TYPEC,
		.aux_index = DDI_AUX4,
		.hdp_index = DDI_HDP4,
	},
	{ /* DDI4 - Unused */
		.connector_type = DDI_UNUSED_TYPE,
		.aux_index = DDI_AUX5,
		.hdp_index = DDI_HDP5,
	},
};

void mainboard_get_dxio_ddi_descriptors(
		const fsp_dxio_descriptor **dxio_descs, size_t *dxio_num,
		const fsp_ddi_descriptor **ddi_descs, size_t *ddi_num)
{
	if (fw_config_is_provisioned() && fw_config_probe(FW_CONFIG(STORAGE, NVME))) {
		printk(BIOS_DEBUG, "Enabling NVMe.\n");
		myst_dxio_descriptors[DXIO_STORAGE] = nvme_descriptor;
	} else {
		printk(BIOS_DEBUG, "Enabling eMMC.\n");
		myst_dxio_descriptors[DXIO_STORAGE] = emmc_descriptor;
	}

	*dxio_descs = myst_dxio_descriptors;
	*dxio_num = ARRAY_SIZE(myst_dxio_descriptors);
	*ddi_descs = myst_ddi_descriptors;
	*ddi_num = ARRAY_SIZE(myst_ddi_descriptors);
}
