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

#include <device/pci_ids.h>
#include <device/pci_ops.h>
#include <fsp/api.h>
#include <soc/ramstage.h>
#include <soc/vr_config.h>
#include <console/console.h>
#include <intelblocks/cpulib.h>

static const struct vr_config default_configs[NUM_VR_DOMAINS] = {
	[VR_SYSTEM_AGENT] = {
		.vr_config_enable = 1,
		.psi1threshold = VR_CFG_AMP(20),
		.psi2threshold = VR_CFG_AMP(5),
		.psi3threshold = VR_CFG_AMP(1),
		.psi3enable = 1,
		.psi4enable = 1,
		.imon_slope = 0,
		.imon_offset = 0,
		.icc_max = 0,
		.voltage_limit = 1520,
	},
	[VR_IA_CORE] = {
		.vr_config_enable = 1,
		.psi1threshold = VR_CFG_AMP(20),
		.psi2threshold = VR_CFG_AMP(5),
		.psi3threshold = VR_CFG_AMP(1),
		.psi3enable = 1,
		.psi4enable = 1,
		.imon_slope = 0,
		.imon_offset = 0,
		.icc_max = 0,
		.voltage_limit = 1520,
	},
	[VR_GT_UNSLICED] = {
		.vr_config_enable = 1,
		.psi1threshold = VR_CFG_AMP(20),
		.psi2threshold = VR_CFG_AMP(5),
		.psi3threshold = VR_CFG_AMP(1),
		.psi3enable = 1,
		.psi4enable = 1,
		.imon_slope = 0,
		.imon_offset = 0,
		.icc_max = 0,
		.voltage_limit = 1520,
	},
	[VR_GT_SLICED] = {
		.vr_config_enable = 1,
		.psi1threshold = VR_CFG_AMP(20),
		.psi2threshold = VR_CFG_AMP(5),
		.psi3threshold = VR_CFG_AMP(1),
		.psi3enable = 1,
		.psi4enable = 1,
		.imon_slope = 0,
		.imon_offset = 0,
		.icc_max = 0,
		.voltage_limit = 1520,
	},
};

struct vr_lookup_item {
	uint16_t tdp_min;
	enum chip_pl2_4_cfg pl2_4_cfg; /* Use 'value_not_set' for don't care */
	uint16_t conf[NUM_VR_DOMAINS];
};

struct vr_lookup {
	uint16_t mchid;
	uint8_t num_items;
	const struct vr_lookup_item *items;
};

#define VR_CONFIG(x, y) \
	static const struct vr_lookup_item vr_config_##x##_##y[] =
#define VR_CONFIG_ICC(x) VR_CONFIG(x, ICC)
#define VR_CONFIG_LL(x) VR_CONFIG(x, LL)
#define VR_CONFIG_TDC(x) VR_CONFIG(x, TDC)

#define VR_REFITEM(x, y) { x, ARRAY_SIZE(vr_config_##x##_##y), vr_config_##x##_##y}
#define VR_REFITEM_ICC(x) VR_REFITEM(x, ICC)
#define VR_REFITEM_LL(x) VR_REFITEM(x, LL)
#define VR_REFITEM_TDC(x) VR_REFITEM(x, TDC)

static uint16_t load_table(const struct vr_lookup *tbl,
			   const int tbl_entries,
			   const int domain,
			   const uint16_t tdp,
			   const uint16_t mch_id)
{
	const config_t *cfg = config_of_soc();

	for (size_t i = 0; i < tbl_entries; i++) {
		if (tbl[i].mchid != mch_id)
			continue;

		for (size_t j = 0; j < tbl[i].num_items; j++) {
			if (tbl[i].items[j].tdp_min > tdp)
				continue;

			if ((tbl[i].items[j].pl2_4_cfg != value_not_set) &&
			    (tbl[i].items[j].pl2_4_cfg != cfg->cpu_pl2_4_cfg))
				continue;

			return tbl[i].items[j].conf[domain];
		}
		break;
	}

	printk(BIOS_ERR, "ERROR: Unknown MCH (0x%x) in %s\n", mch_id, __func__);

	return 0;
}

/*
 * Iccmax table from Doc #337344 Section 7.2 DC Specifications for CFL.
 * Iccmax table from Doc #338023 Section 7.2 DC Specifications for WHL.
 * Iccmax table from Doc #606599 Section 7.2 DC Specifications for CML.
 *
 *   Platform             Segment           SA       IA      GT (GT/GTx)
 * ---------------------------------------------------------------------
 *  CFL-U                 (28W) GT3 quad   8.5       64       64
 *  CFL-U                 (28W) GT3 dual   8.5       64       64
 *
 *  CFL-H                 (45W) GT2 hex    11.1      128      0
 *  CFL-H                 (45W) GT2 quad   11.1      86       0
 *
 *  CFL-S                 (95W) GT2 octa   11.1      193      45
 *
 *  CFL-S                 (95W) GT2 hex    11.1      138      45
 *  CFL-S                 (65W) GT2 hex    11.1      133      45
 *  CFL-S                 (80W) GT2 hex    11.1      133      45
 *  CFL-S                 (35W) GT2 hex    11.1      104      35
 *
 *  CFL-S                 (91W) GT2 quad   11.1      100      45
 *  CFL-S                 (83W) GT2 quad   11.1      100      45
 *  CFL-S                 (71W) GT2 quad   11.1      100      45
 *  CFL-S                 (65W) GT2 quad   11.1      79       45
 *  CFL-S                 (62W) GT2 quad   11.1      79       45
 *  CFL-S                 (35W) GT2 quad   11.1      66       35
 *
 *  CFL-S                 (58W) GT2 dual   11.1      79       45
 *  CFL-S                 (54W) GT2 dual   11.1      58       45
 *  CFL-S                 (35W) GT2 dual   11.1      40       35
 *
 *  CNL-U                 (15W)            13        34        0
 *
 *  WHL-U                 (15W) GT2 quad   6         70       31
 *  WHL-U                 (15W) GT2 dual   6         35       31
 *
 *  CML-U v1/v2           (15W) GT2 hex    6         85(70)   31
 *  CML-U v1/v2           (15W) GT2 quad   6         85(70)   31
 *  CML-U v1/v2           (15W) GT2 dual   6         35       31
 *
 *  CML-H                 (65W) GT2 octa   11.1      192(165) 32
 *  CML-H                 (45W) GT2 octa   11.1      165(140) 32
 *  CML-H                 (45W) GT2 hex    11.1      140(128) 32
 *  CML-H                 (45W) GT2 quad   11.1      105(86)  32
 *
 *  CML-S                 (125W)GT2 deca   11.1      245(210) 35
 *  CML-S                 (125W)GT2 octa   11.1      245(210) 35
 *  CML-S                 (125W)GT2 hex    11.1      140      35
 *  CML-S XeonW           (80W) GT2 deca   11.1      210      35
 *  CML-S XeonW           (80W) GT2 octa   11.1      210      35
 *  CML-S XeonW           (80W) GT2 hex    11.1      140      35
 *  CML-S                 (65W) GT2 deca   11.1      210(175) 35
 *  CML-S                 (65W) GT2 octa   11.1      210(175) 35
 *  CML-S                 (65W) GT2 hex    11.1      140      35
 *  CML-S                 (35W) GT2 deca   11.1      140(104) 35
 *  CML-S                 (35W) GT2 octa   11.1      140(104) 35
 *  CML-S                 (35W) GT2 hex    11.1      104      35
 *  CML-S                 (65W) GT2 quad   11.1      102      35
 *  CML-S                 (35W) GT2 quad   11.1      65       35
 *  CML-S                 (58W) GT2 dual   11.1      60       35
 *  CML-S                 (35W) GT2 dual   11.1      55       35
 *
 *  GT0 versions are the same as GT2/GT3, but have GT/GTx set to 0.
 *  The above values in () are for baseline.
 */

VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CNL_ID_U) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(13, 34, 0, 0) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CNL_ID_Y) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(13, 34, 0, 0) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_WHL_ID_W_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_WHL_ID_W_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 35, 31, 31) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_U) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(8.5, 64, 64, 64) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_U_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(8.5, 64, 64, 64) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H_8) { /* undocumented */
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 128, 0, 0) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 128, 0, 0) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 86, 0, 0) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2) {
	{ 58, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 35, 35) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 58, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 40, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4) {
	{ 71, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 100, 45, 45) },
	{ 62, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 45, 45) },
	{ 35, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 193, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 186, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S) {
	{ 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6) {
	{ 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6) {
	{ 95, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 138, 45, 45) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 133, 45, 45) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4) {
	{ 71, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 100, 45, 45) },
	{ 62, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 79, 45, 45) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 45, 45) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 66, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_ULT) {
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(6, 85, 31, 31) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_ULT_6_2) {
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(6, 85, 31, 31) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(6, 70, 31, 31) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_ULT_2_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(6, 35, 31, 31) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_H_8_2) {
	{ 65, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 165, 32, 32) },
	{ 65, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 192, 32, 32) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 165, 32, 32) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_H) {
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 32, 32) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_H_4_2) {
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 105, 32, 32) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 86, 32, 32) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2) {
	{125, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 245, 35, 35) },
	{125, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 65, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 65, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 175, 35, 35) },
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2) {
	{125, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 245, 35, 35) },
	{125, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 65, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 210, 35, 35) },
	{ 65, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 175, 35, 35) },
	{  0, performance,  VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
	{  0, baseline,     VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2) {
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 140, 35, 35) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 104, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 102, 35, 35) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 65, 35, 35) },
};
VR_CONFIG_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 60, 35, 35) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_ICC(11.1, 55, 35, 35) },
};

static const struct vr_lookup vr_config_icc[] = {
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CNL_ID_U),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CNL_ID_Y),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_WHL_ID_W_4),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_WHL_ID_W_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_U),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_U_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H_8),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_H_4),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_ULT),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_ULT_6_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_ULT_2_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_H_8_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_H),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_H_4_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4),
	VR_REFITEM_ICC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2),
};

VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CNL_ID_U) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CNL_ID_Y) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_WHL_ID_W_4) { /* unspecified */
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 0, 0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_WHL_ID_W_2) { /* unspecified */
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 0, 0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_U) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_U_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 2.0, 2.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H_8) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.6, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.1, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_ULT) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_ULT_6_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.8, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_ULT_2_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 2.4, 3.1, 3.1) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_H_8_2) {
	{ 0, value_not_set,  VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_H) {
	{ 0, value_not_set,  VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_H_4_2) {
	{ 0, value_not_set,  VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 2.7, 2.7) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2) {
	{125, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.1, 4.0, 4.0) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
};
VR_CONFIG_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_LOADLINE(10.3, 1.7, 4.0, 4.0) },
};


static const struct vr_lookup vr_config_ll[] = {
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CNL_ID_U),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CNL_ID_Y),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_WHL_ID_W_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_WHL_ID_W_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_U),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_U_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H_8),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_H_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_ULT),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_ULT_6_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_ULT_2_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_H_8_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_H),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_H_4_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4),
	VR_REFITEM_LL(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2),
};

VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_H) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S) {
	{ 58, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 33, 30, 30) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 31, 30, 30) },
	{  0, value_not_set,  VR_CFG_ALL_DOMAINS_TDC(10, 29, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2) {
	{ 58, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 33, 30, 30) },
	{ 54, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 31, 30, 30) },
	{  0, value_not_set,  VR_CFG_ALL_DOMAINS_TDC(10, 29, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4) {
	{ 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
	{ 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
	{  0, value_not_set,  VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_4) {
	{ 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
	{ 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
	{  0, value_not_set,  VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4) {
	{ 71, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 70, 30, 30) },
	{ 62, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 62, 30, 30) },
	{  0, value_not_set,  VR_CFG_ALL_DOMAINS_TDC(10, 45, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6) {
	{ 95, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 30, 30) },
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 89, 30, 30) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 91, 30, 30) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6) {
	{ 95, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 30, 30) },
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 89, 30, 30) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 91, 30, 30) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8) {
	{ 80, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 150, 30, 30) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 146, 30, 30) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_ULT) {
	{  0, baseline,      VR_CFG_ALL_DOMAINS_TDC(4, 48, 22, 22) },
	{  0, performance,   VR_CFG_ALL_DOMAINS_TDC(4, 58, 22, 22) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_ULT_6_2) {
	{  0, baseline,      VR_CFG_ALL_DOMAINS_TDC(4, 48, 22, 22) },
	{  0, performance,   VR_CFG_ALL_DOMAINS_TDC(4, 58, 22, 22) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_ULT_2_2) {
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(4, 24, 22, 22) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_H_8_2) {
	{ 65, performance,   VR_CFG_ALL_DOMAINS_TDC(10, 146, 25, 25) },
	{ 65, baseline,      VR_CFG_ALL_DOMAINS_TDC(10, 117, 25, 25) },
	{  0, performance,   VR_CFG_ALL_DOMAINS_TDC(10, 125, 25, 25) },
	{  0, baseline,      VR_CFG_ALL_DOMAINS_TDC(10,  86, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_H) {
	{  0, performance,   VR_CFG_ALL_DOMAINS_TDC(10, 92, 25, 25) },
	{  0, baseline,      VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_H_4_2) {
	{  0, performance,   VR_CFG_ALL_DOMAINS_TDC(10, 80, 25, 25) },
	{  0, baseline,      VR_CFG_ALL_DOMAINS_TDC(10, 60, 25, 25) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 175, 28, 28) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 28, 28) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 175, 28, 28) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 100, 28, 28) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2) {
	{125, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 132, 28, 28) },
	{ 65, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 104, 28, 28) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 74, 28, 28) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 68, 28, 28) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 42, 28, 28) },
};
VR_CONFIG_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2) {
	{ 36, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 38, 28, 28) },
	{  0, value_not_set, VR_CFG_ALL_DOMAINS_TDC(10, 25, 28, 28) },
};

static const struct vr_lookup vr_config_tdc[] = {
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_H),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_4),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_4),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_4),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_6),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_6),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_S_8),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_WS_8),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CFL_ID_S_DT_8),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_ULT),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_ULT_6_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_ULT_2_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_H_8_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_H),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_H_4_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_8_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_S_P0P1_10_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_P0P1_6_2),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_4),
	VR_REFITEM_TDC(PCI_DEVICE_ID_INTEL_CML_S_G0G1_2),
};

static uint16_t get_sku_voltagelimit(int domain)
{
	return 1520;
}

static uint16_t get_sku_icc_max(const int domain,
				const uint16_t tdp,
				const uint16_t mch_id,
				const uint16_t igd_id)
{
	if (igd_id == 0xffff && ((domain == VR_GT_SLICED) || (domain == VR_GT_UNSLICED)))
		return 0;

	return load_table(vr_config_icc, ARRAY_SIZE(vr_config_icc), domain, tdp, mch_id);
}

void fill_vr_domain_config(void *params,
		int domain, const struct vr_config *chip_cfg)
{
	FSP_S_CONFIG *vr_params = (FSP_S_CONFIG *)params;
	const struct vr_config *cfg;
	static uint16_t mch_id = 0, igd_id = 0;
	const uint16_t tdp = cpu_get_power_max();

	if (!mch_id) {
		struct device *dev = pcidev_path_on_root(SA_DEVFN_ROOT);
		mch_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
	}
	if (!igd_id) {
		struct device *dev = pcidev_path_on_root(SA_DEVFN_IGD);
		igd_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
	}

	if (domain < 0 || domain >= NUM_VR_DOMAINS)
		return;

	/* Use device tree override if requested. */
	if (chip_cfg->vr_config_enable)
		cfg = chip_cfg;
	else
		cfg = &default_configs[domain];

	vr_params->VrConfigEnable[domain] = cfg->vr_config_enable;
	vr_params->Psi1Threshold[domain] = cfg->psi1threshold;
	vr_params->Psi2Threshold[domain] = cfg->psi2threshold;
	vr_params->Psi3Threshold[domain] = cfg->psi3threshold;
	vr_params->Psi3Enable[domain] = cfg->psi3enable;
	vr_params->Psi4Enable[domain] = cfg->psi4enable;
	vr_params->ImonSlope[domain] = cfg->imon_slope;
	vr_params->ImonOffset[domain] = cfg->imon_offset;
	printk(BIOS_INFO, "VR config[%d]:\n", domain);
	printk(BIOS_INFO, "  Psi1Threshold:  %u\n", cfg->psi1threshold);
	printk(BIOS_INFO, "  Psi2Threshold:  %u\n", cfg->psi2threshold);
	printk(BIOS_INFO, "  Psi3Threshold:  %u\n", cfg->psi3threshold);
	printk(BIOS_INFO, "  Psi3Enable:     %u\n", cfg->psi3enable);
	printk(BIOS_INFO, "  Psi4Enable:     %u\n", cfg->psi4enable);
	printk(BIOS_INFO, "  ImonSlope:      %u\n", cfg->imon_slope);
	printk(BIOS_INFO, "  ImonOffset:     %u\n", cfg->imon_offset);

	/* If board provided non-zero value, use it. */
	if (cfg->voltage_limit)
		vr_params->VrVoltageLimit[domain] = cfg->voltage_limit;
	else
		vr_params->VrVoltageLimit[domain] = get_sku_voltagelimit(domain);
	printk(BIOS_INFO, "  VrVoltageLimit: %u\n", vr_params->VrVoltageLimit[domain]);

	if (cfg->icc_max)
		vr_params->IccMax[domain] = cfg->icc_max;
	else
		vr_params->IccMax[domain] = get_sku_icc_max(domain, tdp, mch_id, igd_id);
	printk(BIOS_INFO, "  IccMax:         %u\n", vr_params->IccMax[domain]);

	if (cfg->ac_loadline)
		vr_params->AcLoadline[domain] = cfg->ac_loadline;
	else
		vr_params->AcLoadline[domain] = load_table(vr_config_ll,
							   ARRAY_SIZE(vr_config_ll),
							   domain, tdp, mch_id);
	printk(BIOS_INFO, "  AcLoadline:     %u\n", vr_params->AcLoadline[domain]);

	if (cfg->dc_loadline)
		vr_params->DcLoadline[domain] = cfg->dc_loadline;
	else
		vr_params->DcLoadline[domain] = load_table(vr_config_ll,
							   ARRAY_SIZE(vr_config_ll),
							   domain, tdp, mch_id);
	printk(BIOS_INFO, "  DcLoadline:     %u\n", vr_params->DcLoadline[domain]);

	vr_params->TdcEnable[domain] = !cfg->tdc_disable;
	printk(BIOS_INFO, "  TdcEnable:      %u\n", vr_params->TdcEnable[domain]);

	if (cfg->tdc_powerlimit)
		vr_params->TdcPowerLimit[domain] = cfg->tdc_powerlimit;
	else
		vr_params->TdcPowerLimit[domain] = load_table(vr_config_tdc,
							      ARRAY_SIZE(vr_config_tdc),
							      domain, tdp, mch_id);
	printk(BIOS_INFO, "  TdcPowerLimit:  %u\n", vr_params->TdcPowerLimit[domain]);
}
