xref: /openbmc/linux/drivers/gpu/drm/i915/display/intel_cx0_phy.c (revision 3e7759b94a0fcfdd6771caa64a37dda7ce825874)
151390cc0SRadhakrishna Sripada // SPDX-License-Identifier: MIT
251390cc0SRadhakrishna Sripada /*
351390cc0SRadhakrishna Sripada  * Copyright © 2023 Intel Corporation
451390cc0SRadhakrishna Sripada  */
551390cc0SRadhakrishna Sripada 
6234fcb97SClint Taylor #include <linux/log2.h>
7234fcb97SClint Taylor #include <linux/math64.h>
851390cc0SRadhakrishna Sripada #include "i915_reg.h"
951390cc0SRadhakrishna Sripada #include "intel_cx0_phy.h"
1051390cc0SRadhakrishna Sripada #include "intel_cx0_phy_regs.h"
11ea8af87aSMika Kahola #include "intel_ddi.h"
12ea8af87aSMika Kahola #include "intel_ddi_buf_trans.h"
1351390cc0SRadhakrishna Sripada #include "intel_de.h"
1451390cc0SRadhakrishna Sripada #include "intel_display_types.h"
1551390cc0SRadhakrishna Sripada #include "intel_dp.h"
16929f527aSMika Kahola #include "intel_hdmi.h"
1751390cc0SRadhakrishna Sripada #include "intel_panel.h"
1851390cc0SRadhakrishna Sripada #include "intel_psr.h"
1951390cc0SRadhakrishna Sripada #include "intel_tc.h"
2051390cc0SRadhakrishna Sripada 
2151390cc0SRadhakrishna Sripada #define MB_WRITE_COMMITTED      true
2251390cc0SRadhakrishna Sripada #define MB_WRITE_UNCOMMITTED    false
2351390cc0SRadhakrishna Sripada 
2451390cc0SRadhakrishna Sripada #define for_each_cx0_lane_in_mask(__lane_mask, __lane) \
2551390cc0SRadhakrishna Sripada 	for ((__lane) = 0; (__lane) < 2; (__lane)++) \
2651390cc0SRadhakrishna Sripada 		for_each_if((__lane_mask) & BIT(__lane))
2751390cc0SRadhakrishna Sripada 
2851390cc0SRadhakrishna Sripada #define INTEL_CX0_LANE0		BIT(0)
2951390cc0SRadhakrishna Sripada #define INTEL_CX0_LANE1		BIT(1)
3051390cc0SRadhakrishna Sripada #define INTEL_CX0_BOTH_LANES	(INTEL_CX0_LANE1 | INTEL_CX0_LANE0)
3151390cc0SRadhakrishna Sripada 
intel_is_c10phy(struct drm_i915_private * i915,enum phy phy)3251390cc0SRadhakrishna Sripada bool intel_is_c10phy(struct drm_i915_private *i915, enum phy phy)
3351390cc0SRadhakrishna Sripada {
3451390cc0SRadhakrishna Sripada 	if (IS_METEORLAKE(i915) && (phy < PHY_C))
3551390cc0SRadhakrishna Sripada 		return true;
3651390cc0SRadhakrishna Sripada 
3751390cc0SRadhakrishna Sripada 	return false;
3851390cc0SRadhakrishna Sripada }
3951390cc0SRadhakrishna Sripada 
lane_mask_to_lane(u8 lane_mask)4051390cc0SRadhakrishna Sripada static int lane_mask_to_lane(u8 lane_mask)
4151390cc0SRadhakrishna Sripada {
4251390cc0SRadhakrishna Sripada 	if (WARN_ON((lane_mask & ~INTEL_CX0_BOTH_LANES) ||
4351390cc0SRadhakrishna Sripada 		    hweight8(lane_mask) != 1))
4451390cc0SRadhakrishna Sripada 		return 0;
4551390cc0SRadhakrishna Sripada 
4651390cc0SRadhakrishna Sripada 	return ilog2(lane_mask);
4751390cc0SRadhakrishna Sripada }
4851390cc0SRadhakrishna Sripada 
4951390cc0SRadhakrishna Sripada static void
assert_dc_off(struct drm_i915_private * i915)5051390cc0SRadhakrishna Sripada assert_dc_off(struct drm_i915_private *i915)
5151390cc0SRadhakrishna Sripada {
5251390cc0SRadhakrishna Sripada 	bool enabled;
5351390cc0SRadhakrishna Sripada 
5451390cc0SRadhakrishna Sripada 	enabled = intel_display_power_is_enabled(i915, POWER_DOMAIN_DC_OFF);
5551390cc0SRadhakrishna Sripada 	drm_WARN_ON(&i915->drm, !enabled);
5651390cc0SRadhakrishna Sripada }
5751390cc0SRadhakrishna Sripada 
5851390cc0SRadhakrishna Sripada /*
5951390cc0SRadhakrishna Sripada  * Prepare HW for CX0 phy transactions.
6051390cc0SRadhakrishna Sripada  *
6151390cc0SRadhakrishna Sripada  * It is required that PSR and DC5/6 are disabled before any CX0 message
6251390cc0SRadhakrishna Sripada  * bus transaction is executed.
6351390cc0SRadhakrishna Sripada  */
intel_cx0_phy_transaction_begin(struct intel_encoder * encoder)6451390cc0SRadhakrishna Sripada static intel_wakeref_t intel_cx0_phy_transaction_begin(struct intel_encoder *encoder)
6551390cc0SRadhakrishna Sripada {
6651390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
6751390cc0SRadhakrishna Sripada 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
6851390cc0SRadhakrishna Sripada 
6951390cc0SRadhakrishna Sripada 	intel_psr_pause(intel_dp);
7051390cc0SRadhakrishna Sripada 	return intel_display_power_get(i915, POWER_DOMAIN_DC_OFF);
7151390cc0SRadhakrishna Sripada }
7251390cc0SRadhakrishna Sripada 
intel_cx0_phy_transaction_end(struct intel_encoder * encoder,intel_wakeref_t wakeref)7351390cc0SRadhakrishna Sripada static void intel_cx0_phy_transaction_end(struct intel_encoder *encoder, intel_wakeref_t wakeref)
7451390cc0SRadhakrishna Sripada {
7551390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
7651390cc0SRadhakrishna Sripada 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
7751390cc0SRadhakrishna Sripada 
7851390cc0SRadhakrishna Sripada 	intel_psr_resume(intel_dp);
7951390cc0SRadhakrishna Sripada 	intel_display_power_put(i915, POWER_DOMAIN_DC_OFF, wakeref);
8051390cc0SRadhakrishna Sripada }
8151390cc0SRadhakrishna Sripada 
intel_clear_response_ready_flag(struct drm_i915_private * i915,enum port port,int lane)8251390cc0SRadhakrishna Sripada static void intel_clear_response_ready_flag(struct drm_i915_private *i915,
8351390cc0SRadhakrishna Sripada 					    enum port port, int lane)
8451390cc0SRadhakrishna Sripada {
8551390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_P2M_MSGBUS_STATUS(port, lane),
8651390cc0SRadhakrishna Sripada 		     0, XELPDP_PORT_P2M_RESPONSE_READY | XELPDP_PORT_P2M_ERROR_SET);
8751390cc0SRadhakrishna Sripada }
8851390cc0SRadhakrishna Sripada 
intel_cx0_bus_reset(struct drm_i915_private * i915,enum port port,int lane)8951390cc0SRadhakrishna Sripada static void intel_cx0_bus_reset(struct drm_i915_private *i915, enum port port, int lane)
9051390cc0SRadhakrishna Sripada {
9151390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
9251390cc0SRadhakrishna Sripada 
9351390cc0SRadhakrishna Sripada 	intel_de_write(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
9451390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_TRANSACTION_RESET);
9551390cc0SRadhakrishna Sripada 
9651390cc0SRadhakrishna Sripada 	if (intel_de_wait_for_clear(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
9751390cc0SRadhakrishna Sripada 				    XELPDP_PORT_M2P_TRANSACTION_RESET,
9851390cc0SRadhakrishna Sripada 				    XELPDP_MSGBUS_TIMEOUT_SLOW)) {
9951390cc0SRadhakrishna Sripada 		drm_err_once(&i915->drm, "Failed to bring PHY %c to idle.\n", phy_name(phy));
10051390cc0SRadhakrishna Sripada 		return;
10151390cc0SRadhakrishna Sripada 	}
10251390cc0SRadhakrishna Sripada 
10351390cc0SRadhakrishna Sripada 	intel_clear_response_ready_flag(i915, port, lane);
10451390cc0SRadhakrishna Sripada }
10551390cc0SRadhakrishna Sripada 
intel_cx0_wait_for_ack(struct drm_i915_private * i915,enum port port,int command,int lane,u32 * val)10651390cc0SRadhakrishna Sripada static int intel_cx0_wait_for_ack(struct drm_i915_private *i915, enum port port,
10751390cc0SRadhakrishna Sripada 				  int command, int lane, u32 *val)
10851390cc0SRadhakrishna Sripada {
10951390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
11051390cc0SRadhakrishna Sripada 
11151390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915,
11251390cc0SRadhakrishna Sripada 					 XELPDP_PORT_P2M_MSGBUS_STATUS(port, lane),
11351390cc0SRadhakrishna Sripada 					 XELPDP_PORT_P2M_RESPONSE_READY,
11451390cc0SRadhakrishna Sripada 					 XELPDP_PORT_P2M_RESPONSE_READY,
11551390cc0SRadhakrishna Sripada 					 XELPDP_MSGBUS_TIMEOUT_FAST_US,
11651390cc0SRadhakrishna Sripada 					 XELPDP_MSGBUS_TIMEOUT_SLOW, val)) {
11751390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm, "PHY %c Timeout waiting for message ACK. Status: 0x%x\n",
11851390cc0SRadhakrishna Sripada 			    phy_name(phy), *val);
119d4b62a1aSMika Kahola 		intel_cx0_bus_reset(i915, port, lane);
12051390cc0SRadhakrishna Sripada 		return -ETIMEDOUT;
12151390cc0SRadhakrishna Sripada 	}
12251390cc0SRadhakrishna Sripada 
12351390cc0SRadhakrishna Sripada 	if (*val & XELPDP_PORT_P2M_ERROR_SET) {
12451390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm, "PHY %c Error occurred during %s command. Status: 0x%x\n", phy_name(phy),
12551390cc0SRadhakrishna Sripada 			    command == XELPDP_PORT_P2M_COMMAND_READ_ACK ? "read" : "write", *val);
12651390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
12751390cc0SRadhakrishna Sripada 		return -EINVAL;
12851390cc0SRadhakrishna Sripada 	}
12951390cc0SRadhakrishna Sripada 
13051390cc0SRadhakrishna Sripada 	if (REG_FIELD_GET(XELPDP_PORT_P2M_COMMAND_TYPE_MASK, *val) != command) {
13151390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm, "PHY %c Not a %s response. MSGBUS Status: 0x%x.\n", phy_name(phy),
13251390cc0SRadhakrishna Sripada 			    command == XELPDP_PORT_P2M_COMMAND_READ_ACK ? "read" : "write", *val);
13351390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
13451390cc0SRadhakrishna Sripada 		return -EINVAL;
13551390cc0SRadhakrishna Sripada 	}
13651390cc0SRadhakrishna Sripada 
13751390cc0SRadhakrishna Sripada 	return 0;
13851390cc0SRadhakrishna Sripada }
13951390cc0SRadhakrishna Sripada 
__intel_cx0_read_once(struct drm_i915_private * i915,enum port port,int lane,u16 addr)14051390cc0SRadhakrishna Sripada static int __intel_cx0_read_once(struct drm_i915_private *i915, enum port port,
14151390cc0SRadhakrishna Sripada 				 int lane, u16 addr)
14251390cc0SRadhakrishna Sripada {
14351390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
14451390cc0SRadhakrishna Sripada 	int ack;
14551390cc0SRadhakrishna Sripada 	u32 val;
14651390cc0SRadhakrishna Sripada 
14751390cc0SRadhakrishna Sripada 	if (intel_de_wait_for_clear(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
14851390cc0SRadhakrishna Sripada 				    XELPDP_PORT_M2P_TRANSACTION_PENDING,
14951390cc0SRadhakrishna Sripada 				    XELPDP_MSGBUS_TIMEOUT_SLOW)) {
15051390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm,
15151390cc0SRadhakrishna Sripada 			    "PHY %c Timeout waiting for previous transaction to complete. Reset the bus and retry.\n", phy_name(phy));
15251390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
15351390cc0SRadhakrishna Sripada 		return -ETIMEDOUT;
15451390cc0SRadhakrishna Sripada 	}
15551390cc0SRadhakrishna Sripada 
15651390cc0SRadhakrishna Sripada 	intel_de_write(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
15751390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
15851390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_COMMAND_READ |
15951390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_ADDRESS(addr));
16051390cc0SRadhakrishna Sripada 
16151390cc0SRadhakrishna Sripada 	ack = intel_cx0_wait_for_ack(i915, port, XELPDP_PORT_P2M_COMMAND_READ_ACK, lane, &val);
162d4b62a1aSMika Kahola 	if (ack < 0)
16351390cc0SRadhakrishna Sripada 		return ack;
16451390cc0SRadhakrishna Sripada 
16551390cc0SRadhakrishna Sripada 	intel_clear_response_ready_flag(i915, port, lane);
16651390cc0SRadhakrishna Sripada 
16751390cc0SRadhakrishna Sripada 	return REG_FIELD_GET(XELPDP_PORT_P2M_DATA_MASK, val);
16851390cc0SRadhakrishna Sripada }
16951390cc0SRadhakrishna Sripada 
__intel_cx0_read(struct drm_i915_private * i915,enum port port,int lane,u16 addr)17051390cc0SRadhakrishna Sripada static u8 __intel_cx0_read(struct drm_i915_private *i915, enum port port,
17151390cc0SRadhakrishna Sripada 			   int lane, u16 addr)
17251390cc0SRadhakrishna Sripada {
17351390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
17451390cc0SRadhakrishna Sripada 	int i, status;
17551390cc0SRadhakrishna Sripada 
17651390cc0SRadhakrishna Sripada 	assert_dc_off(i915);
17751390cc0SRadhakrishna Sripada 
17851390cc0SRadhakrishna Sripada 	/* 3 tries is assumed to be enough to read successfully */
17951390cc0SRadhakrishna Sripada 	for (i = 0; i < 3; i++) {
18051390cc0SRadhakrishna Sripada 		status = __intel_cx0_read_once(i915, port, lane, addr);
18151390cc0SRadhakrishna Sripada 
18251390cc0SRadhakrishna Sripada 		if (status >= 0)
18351390cc0SRadhakrishna Sripada 			return status;
18451390cc0SRadhakrishna Sripada 	}
18551390cc0SRadhakrishna Sripada 
18651390cc0SRadhakrishna Sripada 	drm_err_once(&i915->drm, "PHY %c Read %04x failed after %d retries.\n",
18751390cc0SRadhakrishna Sripada 		     phy_name(phy), addr, i);
18851390cc0SRadhakrishna Sripada 
18951390cc0SRadhakrishna Sripada 	return 0;
19051390cc0SRadhakrishna Sripada }
19151390cc0SRadhakrishna Sripada 
intel_cx0_read(struct drm_i915_private * i915,enum port port,u8 lane_mask,u16 addr)19251390cc0SRadhakrishna Sripada static u8 intel_cx0_read(struct drm_i915_private *i915, enum port port,
19351390cc0SRadhakrishna Sripada 			 u8 lane_mask, u16 addr)
19451390cc0SRadhakrishna Sripada {
19551390cc0SRadhakrishna Sripada 	int lane = lane_mask_to_lane(lane_mask);
19651390cc0SRadhakrishna Sripada 
19751390cc0SRadhakrishna Sripada 	return __intel_cx0_read(i915, port, lane, addr);
19851390cc0SRadhakrishna Sripada }
19951390cc0SRadhakrishna Sripada 
__intel_cx0_write_once(struct drm_i915_private * i915,enum port port,int lane,u16 addr,u8 data,bool committed)20051390cc0SRadhakrishna Sripada static int __intel_cx0_write_once(struct drm_i915_private *i915, enum port port,
20151390cc0SRadhakrishna Sripada 				  int lane, u16 addr, u8 data, bool committed)
20251390cc0SRadhakrishna Sripada {
20351390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
204d4b62a1aSMika Kahola 	int ack;
20551390cc0SRadhakrishna Sripada 	u32 val;
20651390cc0SRadhakrishna Sripada 
20751390cc0SRadhakrishna Sripada 	if (intel_de_wait_for_clear(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
20851390cc0SRadhakrishna Sripada 				    XELPDP_PORT_M2P_TRANSACTION_PENDING,
20951390cc0SRadhakrishna Sripada 				    XELPDP_MSGBUS_TIMEOUT_SLOW)) {
21051390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm,
21151390cc0SRadhakrishna Sripada 			    "PHY %c Timeout waiting for previous transaction to complete. Resetting the bus.\n", phy_name(phy));
21251390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
21351390cc0SRadhakrishna Sripada 		return -ETIMEDOUT;
21451390cc0SRadhakrishna Sripada 	}
21551390cc0SRadhakrishna Sripada 
21651390cc0SRadhakrishna Sripada 	intel_de_write(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
21751390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_TRANSACTION_PENDING |
21851390cc0SRadhakrishna Sripada 		       (committed ? XELPDP_PORT_M2P_COMMAND_WRITE_COMMITTED :
21951390cc0SRadhakrishna Sripada 				    XELPDP_PORT_M2P_COMMAND_WRITE_UNCOMMITTED) |
22051390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_DATA(data) |
22151390cc0SRadhakrishna Sripada 		       XELPDP_PORT_M2P_ADDRESS(addr));
22251390cc0SRadhakrishna Sripada 
22351390cc0SRadhakrishna Sripada 	if (intel_de_wait_for_clear(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
22451390cc0SRadhakrishna Sripada 				    XELPDP_PORT_M2P_TRANSACTION_PENDING,
22551390cc0SRadhakrishna Sripada 				    XELPDP_MSGBUS_TIMEOUT_SLOW)) {
22651390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm,
22751390cc0SRadhakrishna Sripada 			    "PHY %c Timeout waiting for write to complete. Resetting the bus.\n", phy_name(phy));
22851390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
22951390cc0SRadhakrishna Sripada 		return -ETIMEDOUT;
23051390cc0SRadhakrishna Sripada 	}
23151390cc0SRadhakrishna Sripada 
23251390cc0SRadhakrishna Sripada 	if (committed) {
233d4b62a1aSMika Kahola 		ack = intel_cx0_wait_for_ack(i915, port, XELPDP_PORT_P2M_COMMAND_WRITE_ACK, lane, &val);
234d4b62a1aSMika Kahola 		if (ack < 0)
235d4b62a1aSMika Kahola 			return ack;
23651390cc0SRadhakrishna Sripada 	} else if ((intel_de_read(i915, XELPDP_PORT_P2M_MSGBUS_STATUS(port, lane)) &
23751390cc0SRadhakrishna Sripada 		    XELPDP_PORT_P2M_ERROR_SET)) {
23851390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm,
23951390cc0SRadhakrishna Sripada 			    "PHY %c Error occurred during write command.\n", phy_name(phy));
24051390cc0SRadhakrishna Sripada 		intel_cx0_bus_reset(i915, port, lane);
24151390cc0SRadhakrishna Sripada 		return -EINVAL;
24251390cc0SRadhakrishna Sripada 	}
24351390cc0SRadhakrishna Sripada 
24451390cc0SRadhakrishna Sripada 	intel_clear_response_ready_flag(i915, port, lane);
24551390cc0SRadhakrishna Sripada 
24651390cc0SRadhakrishna Sripada 	return 0;
24751390cc0SRadhakrishna Sripada }
24851390cc0SRadhakrishna Sripada 
__intel_cx0_write(struct drm_i915_private * i915,enum port port,int lane,u16 addr,u8 data,bool committed)24951390cc0SRadhakrishna Sripada static void __intel_cx0_write(struct drm_i915_private *i915, enum port port,
25051390cc0SRadhakrishna Sripada 			      int lane, u16 addr, u8 data, bool committed)
25151390cc0SRadhakrishna Sripada {
25251390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
25351390cc0SRadhakrishna Sripada 	int i, status;
25451390cc0SRadhakrishna Sripada 
25551390cc0SRadhakrishna Sripada 	assert_dc_off(i915);
25651390cc0SRadhakrishna Sripada 
25751390cc0SRadhakrishna Sripada 	/* 3 tries is assumed to be enough to write successfully */
25851390cc0SRadhakrishna Sripada 	for (i = 0; i < 3; i++) {
25951390cc0SRadhakrishna Sripada 		status = __intel_cx0_write_once(i915, port, lane, addr, data, committed);
26051390cc0SRadhakrishna Sripada 
26151390cc0SRadhakrishna Sripada 		if (status == 0)
26251390cc0SRadhakrishna Sripada 			return;
26351390cc0SRadhakrishna Sripada 	}
26451390cc0SRadhakrishna Sripada 
26551390cc0SRadhakrishna Sripada 	drm_err_once(&i915->drm,
26651390cc0SRadhakrishna Sripada 		     "PHY %c Write %04x failed after %d retries.\n", phy_name(phy), addr, i);
26751390cc0SRadhakrishna Sripada }
26851390cc0SRadhakrishna Sripada 
intel_cx0_write(struct drm_i915_private * i915,enum port port,u8 lane_mask,u16 addr,u8 data,bool committed)26951390cc0SRadhakrishna Sripada static void intel_cx0_write(struct drm_i915_private *i915, enum port port,
27051390cc0SRadhakrishna Sripada 			    u8 lane_mask, u16 addr, u8 data, bool committed)
27151390cc0SRadhakrishna Sripada {
27251390cc0SRadhakrishna Sripada 	int lane;
27351390cc0SRadhakrishna Sripada 
27451390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
27551390cc0SRadhakrishna Sripada 		__intel_cx0_write(i915, port, lane, addr, data, committed);
27651390cc0SRadhakrishna Sripada }
27751390cc0SRadhakrishna Sripada 
intel_c20_sram_write(struct drm_i915_private * i915,enum port port,int lane,u16 addr,u16 data)27862618c7fSMika Kahola static void intel_c20_sram_write(struct drm_i915_private *i915, enum port port,
27962618c7fSMika Kahola 				 int lane, u16 addr, u16 data)
28062618c7fSMika Kahola {
28162618c7fSMika Kahola 	assert_dc_off(i915);
28262618c7fSMika Kahola 
28362618c7fSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_WR_ADDRESS_H, addr >> 8, 0);
28462618c7fSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_WR_ADDRESS_L, addr & 0xff, 0);
28562618c7fSMika Kahola 
28662618c7fSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_WR_DATA_H, data >> 8, 0);
28762618c7fSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_WR_DATA_L, data & 0xff, 1);
28862618c7fSMika Kahola }
28962618c7fSMika Kahola 
intel_c20_sram_read(struct drm_i915_private * i915,enum port port,int lane,u16 addr)290929f527aSMika Kahola static u16 intel_c20_sram_read(struct drm_i915_private *i915, enum port port,
291929f527aSMika Kahola 			       int lane, u16 addr)
292929f527aSMika Kahola {
293929f527aSMika Kahola 	u16 val;
294929f527aSMika Kahola 
295929f527aSMika Kahola 	assert_dc_off(i915);
296929f527aSMika Kahola 
297929f527aSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_RD_ADDRESS_H, addr >> 8, 0);
298929f527aSMika Kahola 	intel_cx0_write(i915, port, lane, PHY_C20_RD_ADDRESS_L, addr & 0xff, 1);
299929f527aSMika Kahola 
300929f527aSMika Kahola 	val = intel_cx0_read(i915, port, lane, PHY_C20_RD_DATA_H);
301929f527aSMika Kahola 	val <<= 8;
302929f527aSMika Kahola 	val |= intel_cx0_read(i915, port, lane, PHY_C20_RD_DATA_L);
303929f527aSMika Kahola 
304929f527aSMika Kahola 	return val;
305929f527aSMika Kahola }
306929f527aSMika Kahola 
__intel_cx0_rmw(struct drm_i915_private * i915,enum port port,int lane,u16 addr,u8 clear,u8 set,bool committed)30751390cc0SRadhakrishna Sripada static void __intel_cx0_rmw(struct drm_i915_private *i915, enum port port,
30851390cc0SRadhakrishna Sripada 			    int lane, u16 addr, u8 clear, u8 set, bool committed)
30951390cc0SRadhakrishna Sripada {
31051390cc0SRadhakrishna Sripada 	u8 old, val;
31151390cc0SRadhakrishna Sripada 
31251390cc0SRadhakrishna Sripada 	old = __intel_cx0_read(i915, port, lane, addr);
31351390cc0SRadhakrishna Sripada 	val = (old & ~clear) | set;
31451390cc0SRadhakrishna Sripada 
31551390cc0SRadhakrishna Sripada 	if (val != old)
31651390cc0SRadhakrishna Sripada 		__intel_cx0_write(i915, port, lane, addr, val, committed);
31751390cc0SRadhakrishna Sripada }
31851390cc0SRadhakrishna Sripada 
intel_cx0_rmw(struct drm_i915_private * i915,enum port port,u8 lane_mask,u16 addr,u8 clear,u8 set,bool committed)31951390cc0SRadhakrishna Sripada static void intel_cx0_rmw(struct drm_i915_private *i915, enum port port,
32051390cc0SRadhakrishna Sripada 			  u8 lane_mask, u16 addr, u8 clear, u8 set, bool committed)
32151390cc0SRadhakrishna Sripada {
32251390cc0SRadhakrishna Sripada 	u8 lane;
32351390cc0SRadhakrishna Sripada 
32451390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
32551390cc0SRadhakrishna Sripada 		__intel_cx0_rmw(i915, port, lane, addr, clear, set, committed);
32651390cc0SRadhakrishna Sripada }
32751390cc0SRadhakrishna Sripada 
intel_c10_get_tx_vboost_lvl(const struct intel_crtc_state * crtc_state)328ea8af87aSMika Kahola static u8 intel_c10_get_tx_vboost_lvl(const struct intel_crtc_state *crtc_state)
329ea8af87aSMika Kahola {
330ea8af87aSMika Kahola 	if (intel_crtc_has_dp_encoder(crtc_state)) {
331ea8af87aSMika Kahola 		if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) &&
332ea8af87aSMika Kahola 		    (crtc_state->port_clock == 540000 ||
333ea8af87aSMika Kahola 		     crtc_state->port_clock == 810000))
334ea8af87aSMika Kahola 			return 5;
335ea8af87aSMika Kahola 		else
336ea8af87aSMika Kahola 			return 4;
337ea8af87aSMika Kahola 	} else {
338ea8af87aSMika Kahola 		return 5;
339ea8af87aSMika Kahola 	}
340ea8af87aSMika Kahola }
341ea8af87aSMika Kahola 
intel_c10_get_tx_term_ctl(const struct intel_crtc_state * crtc_state)342ea8af87aSMika Kahola static u8 intel_c10_get_tx_term_ctl(const struct intel_crtc_state *crtc_state)
343ea8af87aSMika Kahola {
344ea8af87aSMika Kahola 	if (intel_crtc_has_dp_encoder(crtc_state)) {
345ea8af87aSMika Kahola 		if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) &&
346ea8af87aSMika Kahola 		    (crtc_state->port_clock == 540000 ||
347ea8af87aSMika Kahola 		     crtc_state->port_clock == 810000))
348ea8af87aSMika Kahola 			return 5;
349ea8af87aSMika Kahola 		else
350ea8af87aSMika Kahola 			return 2;
351ea8af87aSMika Kahola 	} else {
352ea8af87aSMika Kahola 		return 6;
353ea8af87aSMika Kahola 	}
354ea8af87aSMika Kahola }
355ea8af87aSMika Kahola 
intel_cx0_phy_set_signal_levels(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)356ea8af87aSMika Kahola void intel_cx0_phy_set_signal_levels(struct intel_encoder *encoder,
357ea8af87aSMika Kahola 				     const struct intel_crtc_state *crtc_state)
358ea8af87aSMika Kahola {
359ea8af87aSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
360ea8af87aSMika Kahola 	const struct intel_ddi_buf_trans *trans;
361ea8af87aSMika Kahola 	enum phy phy = intel_port_to_phy(i915, encoder->port);
362ea8af87aSMika Kahola 	intel_wakeref_t wakeref;
363ea8af87aSMika Kahola 	int n_entries, ln;
364ea8af87aSMika Kahola 
365ea8af87aSMika Kahola 	wakeref = intel_cx0_phy_transaction_begin(encoder);
366ea8af87aSMika Kahola 
367ea8af87aSMika Kahola 	trans = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
368ea8af87aSMika Kahola 	if (drm_WARN_ON_ONCE(&i915->drm, !trans)) {
369ea8af87aSMika Kahola 		intel_cx0_phy_transaction_end(encoder, wakeref);
370ea8af87aSMika Kahola 		return;
371ea8af87aSMika Kahola 	}
372ea8af87aSMika Kahola 
373ea8af87aSMika Kahola 	if (intel_is_c10phy(i915, phy)) {
374ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1),
375ea8af87aSMika Kahola 			      0, C10_VDR_CTRL_MSGBUS_ACCESS, MB_WRITE_COMMITTED);
376ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CMN(3),
377ea8af87aSMika Kahola 			      C10_CMN3_TXVBOOST_MASK,
378ea8af87aSMika Kahola 			      C10_CMN3_TXVBOOST(intel_c10_get_tx_vboost_lvl(crtc_state)),
379ea8af87aSMika Kahola 			      MB_WRITE_UNCOMMITTED);
380ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_TX(1),
381ea8af87aSMika Kahola 			      C10_TX1_TERMCTL_MASK,
382ea8af87aSMika Kahola 			      C10_TX1_TERMCTL(intel_c10_get_tx_term_ctl(crtc_state)),
383ea8af87aSMika Kahola 			      MB_WRITE_COMMITTED);
384ea8af87aSMika Kahola 	}
385ea8af87aSMika Kahola 
386ea8af87aSMika Kahola 	for (ln = 0; ln < crtc_state->lane_count; ln++) {
387ea8af87aSMika Kahola 		int level = intel_ddi_level(encoder, crtc_state, ln);
388ea8af87aSMika Kahola 		int lane, tx;
389ea8af87aSMika Kahola 
390ea8af87aSMika Kahola 		lane = ln / 2;
391ea8af87aSMika Kahola 		tx = ln % 2;
392ea8af87aSMika Kahola 
393ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, BIT(lane), PHY_CX0_VDROVRD_CTL(lane, tx, 0),
394ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL_MASK,
395ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL(trans->entries[level].snps.pre_cursor),
396ea8af87aSMika Kahola 			      MB_WRITE_COMMITTED);
397ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, BIT(lane), PHY_CX0_VDROVRD_CTL(lane, tx, 1),
398ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL_MASK,
399ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL(trans->entries[level].snps.vswing),
400ea8af87aSMika Kahola 			      MB_WRITE_COMMITTED);
401ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, BIT(lane), PHY_CX0_VDROVRD_CTL(lane, tx, 2),
402ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL_MASK,
403ea8af87aSMika Kahola 			      C10_PHY_OVRD_LEVEL(trans->entries[level].snps.post_cursor),
404ea8af87aSMika Kahola 			      MB_WRITE_COMMITTED);
405ea8af87aSMika Kahola 	}
406ea8af87aSMika Kahola 
407ea8af87aSMika Kahola 	/* Write Override enables in 0xD71 */
408ea8af87aSMika Kahola 	intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_OVRD,
409ea8af87aSMika Kahola 		      0, PHY_C10_VDR_OVRD_TX1 | PHY_C10_VDR_OVRD_TX2,
410ea8af87aSMika Kahola 		      MB_WRITE_COMMITTED);
411ea8af87aSMika Kahola 
412ea8af87aSMika Kahola 	if (intel_is_c10phy(i915, phy))
413ea8af87aSMika Kahola 		intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1),
414ea8af87aSMika Kahola 			      0, C10_VDR_CTRL_UPDATE_CFG, MB_WRITE_COMMITTED);
415ea8af87aSMika Kahola 
416ea8af87aSMika Kahola 	intel_cx0_phy_transaction_end(encoder, wakeref);
417ea8af87aSMika Kahola }
418ea8af87aSMika Kahola 
41951390cc0SRadhakrishna Sripada /*
42051390cc0SRadhakrishna Sripada  * Basic DP link rates with 38.4 MHz reference clock.
42151390cc0SRadhakrishna Sripada  * Note: The tables below are with SSC. In non-ssc
42251390cc0SRadhakrishna Sripada  * registers 0xC04 to 0xC08(pll[4] to pll[8]) will be
42351390cc0SRadhakrishna Sripada  * programmed 0.
42451390cc0SRadhakrishna Sripada  */
42551390cc0SRadhakrishna Sripada 
42651390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_dp_rbr = {
42751390cc0SRadhakrishna Sripada 	.clock = 162000,
42851390cc0SRadhakrishna Sripada 	.tx = 0x10,
42951390cc0SRadhakrishna Sripada 	.cmn = 0x21,
43051390cc0SRadhakrishna Sripada 	.pll[0] = 0xB4,
43151390cc0SRadhakrishna Sripada 	.pll[1] = 0,
43251390cc0SRadhakrishna Sripada 	.pll[2] = 0x30,
43351390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
43451390cc0SRadhakrishna Sripada 	.pll[4] = 0x26,
43551390cc0SRadhakrishna Sripada 	.pll[5] = 0x0C,
43651390cc0SRadhakrishna Sripada 	.pll[6] = 0x98,
43751390cc0SRadhakrishna Sripada 	.pll[7] = 0x46,
43851390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
43951390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
44051390cc0SRadhakrishna Sripada 	.pll[10] = 0,
44151390cc0SRadhakrishna Sripada 	.pll[11] = 0,
44251390cc0SRadhakrishna Sripada 	.pll[12] = 0xC0,
44351390cc0SRadhakrishna Sripada 	.pll[13] = 0,
44451390cc0SRadhakrishna Sripada 	.pll[14] = 0,
44551390cc0SRadhakrishna Sripada 	.pll[15] = 0x2,
44651390cc0SRadhakrishna Sripada 	.pll[16] = 0x84,
44751390cc0SRadhakrishna Sripada 	.pll[17] = 0x4F,
44851390cc0SRadhakrishna Sripada 	.pll[18] = 0xE5,
44951390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
45051390cc0SRadhakrishna Sripada };
45151390cc0SRadhakrishna Sripada 
45251390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_edp_r216 = {
45351390cc0SRadhakrishna Sripada 	.clock = 216000,
45451390cc0SRadhakrishna Sripada 	.tx = 0x10,
45551390cc0SRadhakrishna Sripada 	.cmn = 0x21,
45651390cc0SRadhakrishna Sripada 	.pll[0] = 0x4,
45751390cc0SRadhakrishna Sripada 	.pll[1] = 0,
45851390cc0SRadhakrishna Sripada 	.pll[2] = 0xA2,
45951390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
46051390cc0SRadhakrishna Sripada 	.pll[4] = 0x33,
46151390cc0SRadhakrishna Sripada 	.pll[5] = 0x10,
46251390cc0SRadhakrishna Sripada 	.pll[6] = 0x75,
46351390cc0SRadhakrishna Sripada 	.pll[7] = 0xB3,
46451390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
46551390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
46651390cc0SRadhakrishna Sripada 	.pll[10] = 0,
46751390cc0SRadhakrishna Sripada 	.pll[11] = 0,
46851390cc0SRadhakrishna Sripada 	.pll[12] = 0,
46951390cc0SRadhakrishna Sripada 	.pll[13] = 0,
47051390cc0SRadhakrishna Sripada 	.pll[14] = 0,
47151390cc0SRadhakrishna Sripada 	.pll[15] = 0x2,
47251390cc0SRadhakrishna Sripada 	.pll[16] = 0x85,
47351390cc0SRadhakrishna Sripada 	.pll[17] = 0x0F,
47451390cc0SRadhakrishna Sripada 	.pll[18] = 0xE6,
47551390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
47651390cc0SRadhakrishna Sripada };
47751390cc0SRadhakrishna Sripada 
47851390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_edp_r243 = {
47951390cc0SRadhakrishna Sripada 	.clock = 243000,
48051390cc0SRadhakrishna Sripada 	.tx = 0x10,
48151390cc0SRadhakrishna Sripada 	.cmn = 0x21,
48251390cc0SRadhakrishna Sripada 	.pll[0] = 0x34,
48351390cc0SRadhakrishna Sripada 	.pll[1] = 0,
48451390cc0SRadhakrishna Sripada 	.pll[2] = 0xDA,
48551390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
48651390cc0SRadhakrishna Sripada 	.pll[4] = 0x39,
48751390cc0SRadhakrishna Sripada 	.pll[5] = 0x12,
48851390cc0SRadhakrishna Sripada 	.pll[6] = 0xE3,
48951390cc0SRadhakrishna Sripada 	.pll[7] = 0xE9,
49051390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
49151390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
49251390cc0SRadhakrishna Sripada 	.pll[10] = 0,
49351390cc0SRadhakrishna Sripada 	.pll[11] = 0,
49451390cc0SRadhakrishna Sripada 	.pll[12] = 0x20,
49551390cc0SRadhakrishna Sripada 	.pll[13] = 0,
49651390cc0SRadhakrishna Sripada 	.pll[14] = 0,
49751390cc0SRadhakrishna Sripada 	.pll[15] = 0x2,
49851390cc0SRadhakrishna Sripada 	.pll[16] = 0x85,
49951390cc0SRadhakrishna Sripada 	.pll[17] = 0x8F,
50051390cc0SRadhakrishna Sripada 	.pll[18] = 0xE6,
50151390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
50251390cc0SRadhakrishna Sripada };
50351390cc0SRadhakrishna Sripada 
50451390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_dp_hbr1 = {
50551390cc0SRadhakrishna Sripada 	.clock = 270000,
50651390cc0SRadhakrishna Sripada 	.tx = 0x10,
50751390cc0SRadhakrishna Sripada 	.cmn = 0x21,
50851390cc0SRadhakrishna Sripada 	.pll[0] = 0xF4,
50951390cc0SRadhakrishna Sripada 	.pll[1] = 0,
51051390cc0SRadhakrishna Sripada 	.pll[2] = 0xF8,
51151390cc0SRadhakrishna Sripada 	.pll[3] = 0x0,
51251390cc0SRadhakrishna Sripada 	.pll[4] = 0x20,
51351390cc0SRadhakrishna Sripada 	.pll[5] = 0x0A,
51451390cc0SRadhakrishna Sripada 	.pll[6] = 0x29,
51551390cc0SRadhakrishna Sripada 	.pll[7] = 0x10,
51651390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,   /* Verify */
51751390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
51851390cc0SRadhakrishna Sripada 	.pll[10] = 0,
51951390cc0SRadhakrishna Sripada 	.pll[11] = 0,
52051390cc0SRadhakrishna Sripada 	.pll[12] = 0xA0,
52151390cc0SRadhakrishna Sripada 	.pll[13] = 0,
52251390cc0SRadhakrishna Sripada 	.pll[14] = 0,
52351390cc0SRadhakrishna Sripada 	.pll[15] = 0x1,
52451390cc0SRadhakrishna Sripada 	.pll[16] = 0x84,
52551390cc0SRadhakrishna Sripada 	.pll[17] = 0x4F,
52651390cc0SRadhakrishna Sripada 	.pll[18] = 0xE5,
52751390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
52851390cc0SRadhakrishna Sripada };
52951390cc0SRadhakrishna Sripada 
53051390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_edp_r324 = {
53151390cc0SRadhakrishna Sripada 	.clock = 324000,
53251390cc0SRadhakrishna Sripada 	.tx = 0x10,
53351390cc0SRadhakrishna Sripada 	.cmn = 0x21,
53451390cc0SRadhakrishna Sripada 	.pll[0] = 0xB4,
53551390cc0SRadhakrishna Sripada 	.pll[1] = 0,
53651390cc0SRadhakrishna Sripada 	.pll[2] = 0x30,
53751390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
53851390cc0SRadhakrishna Sripada 	.pll[4] = 0x26,
53951390cc0SRadhakrishna Sripada 	.pll[5] = 0x0C,
54051390cc0SRadhakrishna Sripada 	.pll[6] = 0x98,
54151390cc0SRadhakrishna Sripada 	.pll[7] = 0x46,
54251390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
54351390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
54451390cc0SRadhakrishna Sripada 	.pll[10] = 0,
54551390cc0SRadhakrishna Sripada 	.pll[11] = 0,
54651390cc0SRadhakrishna Sripada 	.pll[12] = 0xC0,
54751390cc0SRadhakrishna Sripada 	.pll[13] = 0,
54851390cc0SRadhakrishna Sripada 	.pll[14] = 0,
54951390cc0SRadhakrishna Sripada 	.pll[15] = 0x1,
55051390cc0SRadhakrishna Sripada 	.pll[16] = 0x85,
55151390cc0SRadhakrishna Sripada 	.pll[17] = 0x4F,
55251390cc0SRadhakrishna Sripada 	.pll[18] = 0xE6,
55351390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
55451390cc0SRadhakrishna Sripada };
55551390cc0SRadhakrishna Sripada 
55651390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_edp_r432 = {
55751390cc0SRadhakrishna Sripada 	.clock = 432000,
55851390cc0SRadhakrishna Sripada 	.tx = 0x10,
55951390cc0SRadhakrishna Sripada 	.cmn = 0x21,
56051390cc0SRadhakrishna Sripada 	.pll[0] = 0x4,
56151390cc0SRadhakrishna Sripada 	.pll[1] = 0,
56251390cc0SRadhakrishna Sripada 	.pll[2] = 0xA2,
56351390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
56451390cc0SRadhakrishna Sripada 	.pll[4] = 0x33,
56551390cc0SRadhakrishna Sripada 	.pll[5] = 0x10,
56651390cc0SRadhakrishna Sripada 	.pll[6] = 0x75,
56751390cc0SRadhakrishna Sripada 	.pll[7] = 0xB3,
56851390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
56951390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
57051390cc0SRadhakrishna Sripada 	.pll[10] = 0,
57151390cc0SRadhakrishna Sripada 	.pll[11] = 0,
57251390cc0SRadhakrishna Sripada 	.pll[12] = 0,
57351390cc0SRadhakrishna Sripada 	.pll[13] = 0,
57451390cc0SRadhakrishna Sripada 	.pll[14] = 0,
57551390cc0SRadhakrishna Sripada 	.pll[15] = 0x1,
57651390cc0SRadhakrishna Sripada 	.pll[16] = 0x85,
57751390cc0SRadhakrishna Sripada 	.pll[17] = 0x0F,
57851390cc0SRadhakrishna Sripada 	.pll[18] = 0xE6,
57951390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
58051390cc0SRadhakrishna Sripada };
58151390cc0SRadhakrishna Sripada 
58251390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_dp_hbr2 = {
58351390cc0SRadhakrishna Sripada 	.clock = 540000,
58451390cc0SRadhakrishna Sripada 	.tx = 0x10,
58551390cc0SRadhakrishna Sripada 	.cmn = 0x21,
58651390cc0SRadhakrishna Sripada 	.pll[0] = 0xF4,
58751390cc0SRadhakrishna Sripada 	.pll[1] = 0,
58851390cc0SRadhakrishna Sripada 	.pll[2] = 0xF8,
58951390cc0SRadhakrishna Sripada 	.pll[3] = 0,
59051390cc0SRadhakrishna Sripada 	.pll[4] = 0x20,
59151390cc0SRadhakrishna Sripada 	.pll[5] = 0x0A,
59251390cc0SRadhakrishna Sripada 	.pll[6] = 0x29,
59351390cc0SRadhakrishna Sripada 	.pll[7] = 0x10,
59451390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
59551390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
59651390cc0SRadhakrishna Sripada 	.pll[10] = 0,
59751390cc0SRadhakrishna Sripada 	.pll[11] = 0,
59851390cc0SRadhakrishna Sripada 	.pll[12] = 0xA0,
59951390cc0SRadhakrishna Sripada 	.pll[13] = 0,
60051390cc0SRadhakrishna Sripada 	.pll[14] = 0,
60151390cc0SRadhakrishna Sripada 	.pll[15] = 0,
60251390cc0SRadhakrishna Sripada 	.pll[16] = 0x84,
60351390cc0SRadhakrishna Sripada 	.pll[17] = 0x4F,
60451390cc0SRadhakrishna Sripada 	.pll[18] = 0xE5,
60551390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
60651390cc0SRadhakrishna Sripada };
60751390cc0SRadhakrishna Sripada 
60851390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_edp_r675 = {
60951390cc0SRadhakrishna Sripada 	.clock = 675000,
61051390cc0SRadhakrishna Sripada 	.tx = 0x10,
61151390cc0SRadhakrishna Sripada 	.cmn = 0x21,
61251390cc0SRadhakrishna Sripada 	.pll[0] = 0xB4,
61351390cc0SRadhakrishna Sripada 	.pll[1] = 0,
61451390cc0SRadhakrishna Sripada 	.pll[2] = 0x3E,
61551390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
61651390cc0SRadhakrishna Sripada 	.pll[4] = 0xA8,
61751390cc0SRadhakrishna Sripada 	.pll[5] = 0x0C,
61851390cc0SRadhakrishna Sripada 	.pll[6] = 0x33,
61951390cc0SRadhakrishna Sripada 	.pll[7] = 0x54,
62051390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
62151390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
62251390cc0SRadhakrishna Sripada 	.pll[10] = 0,
62351390cc0SRadhakrishna Sripada 	.pll[11] = 0,
62451390cc0SRadhakrishna Sripada 	.pll[12] = 0xC8,
62551390cc0SRadhakrishna Sripada 	.pll[13] = 0,
62651390cc0SRadhakrishna Sripada 	.pll[14] = 0,
62751390cc0SRadhakrishna Sripada 	.pll[15] = 0,
62851390cc0SRadhakrishna Sripada 	.pll[16] = 0x85,
62951390cc0SRadhakrishna Sripada 	.pll[17] = 0x8F,
63051390cc0SRadhakrishna Sripada 	.pll[18] = 0xE6,
63151390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
63251390cc0SRadhakrishna Sripada };
63351390cc0SRadhakrishna Sripada 
63451390cc0SRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_dp_hbr3 = {
63551390cc0SRadhakrishna Sripada 	.clock = 810000,
63651390cc0SRadhakrishna Sripada 	.tx = 0x10,
63751390cc0SRadhakrishna Sripada 	.cmn = 0x21,
63851390cc0SRadhakrishna Sripada 	.pll[0] = 0x34,
63951390cc0SRadhakrishna Sripada 	.pll[1] = 0,
64051390cc0SRadhakrishna Sripada 	.pll[2] = 0x84,
64151390cc0SRadhakrishna Sripada 	.pll[3] = 0x1,
64251390cc0SRadhakrishna Sripada 	.pll[4] = 0x30,
64351390cc0SRadhakrishna Sripada 	.pll[5] = 0x0F,
64451390cc0SRadhakrishna Sripada 	.pll[6] = 0x3D,
64551390cc0SRadhakrishna Sripada 	.pll[7] = 0x98,
64651390cc0SRadhakrishna Sripada 	.pll[8] = 0x1,
64751390cc0SRadhakrishna Sripada 	.pll[9] = 0x1,
64851390cc0SRadhakrishna Sripada 	.pll[10] = 0,
64951390cc0SRadhakrishna Sripada 	.pll[11] = 0,
65051390cc0SRadhakrishna Sripada 	.pll[12] = 0xF0,
65151390cc0SRadhakrishna Sripada 	.pll[13] = 0,
65251390cc0SRadhakrishna Sripada 	.pll[14] = 0,
65351390cc0SRadhakrishna Sripada 	.pll[15] = 0,
65451390cc0SRadhakrishna Sripada 	.pll[16] = 0x84,
65551390cc0SRadhakrishna Sripada 	.pll[17] = 0x0F,
65651390cc0SRadhakrishna Sripada 	.pll[18] = 0xE5,
65751390cc0SRadhakrishna Sripada 	.pll[19] = 0x23,
65851390cc0SRadhakrishna Sripada };
65951390cc0SRadhakrishna Sripada 
66051390cc0SRadhakrishna Sripada static const struct intel_c10pll_state * const mtl_c10_dp_tables[] = {
66151390cc0SRadhakrishna Sripada 	&mtl_c10_dp_rbr,
66251390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr1,
66351390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr2,
66451390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr3,
66551390cc0SRadhakrishna Sripada 	NULL,
66651390cc0SRadhakrishna Sripada };
66751390cc0SRadhakrishna Sripada 
66851390cc0SRadhakrishna Sripada static const struct intel_c10pll_state * const mtl_c10_edp_tables[] = {
66951390cc0SRadhakrishna Sripada 	&mtl_c10_dp_rbr,
67051390cc0SRadhakrishna Sripada 	&mtl_c10_edp_r216,
67151390cc0SRadhakrishna Sripada 	&mtl_c10_edp_r243,
67251390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr1,
67351390cc0SRadhakrishna Sripada 	&mtl_c10_edp_r324,
67451390cc0SRadhakrishna Sripada 	&mtl_c10_edp_r432,
67551390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr2,
67651390cc0SRadhakrishna Sripada 	&mtl_c10_edp_r675,
67751390cc0SRadhakrishna Sripada 	&mtl_c10_dp_hbr3,
67851390cc0SRadhakrishna Sripada 	NULL,
67951390cc0SRadhakrishna Sripada };
68051390cc0SRadhakrishna Sripada 
681929f527aSMika Kahola /* C20 basic DP 1.4 tables */
682929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_rbr = {
683929f527aSMika Kahola 	.link_bit_rate = 162000,
684929f527aSMika Kahola 	.clock = 162000,
685929f527aSMika Kahola 	.tx = {	0xbe88, /* tx cfg0 */
686929f527aSMika Kahola 		0x5800, /* tx cfg1 */
687929f527aSMika Kahola 		0x0000, /* tx cfg2 */
688929f527aSMika Kahola 		},
689929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
690929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
691929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
692929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
693929f527aSMika Kahola 		},
694929f527aSMika Kahola 	.mpllb = { 0x50a8,	/* mpllb cfg0 */
695929f527aSMika Kahola 		0x2120,		/* mpllb cfg1 */
696929f527aSMika Kahola 		0xcd9a,		/* mpllb cfg2 */
697929f527aSMika Kahola 		0xbfc1,		/* mpllb cfg3 */
698929f527aSMika Kahola 		0x5ab8,         /* mpllb cfg4 */
699929f527aSMika Kahola 		0x4c34,         /* mpllb cfg5 */
700929f527aSMika Kahola 		0x2000,		/* mpllb cfg6 */
701929f527aSMika Kahola 		0x0001,		/* mpllb cfg7 */
702929f527aSMika Kahola 		0x6000,		/* mpllb cfg8 */
703929f527aSMika Kahola 		0x0000,		/* mpllb cfg9 */
704929f527aSMika Kahola 		0x0000,		/* mpllb cfg10 */
705929f527aSMika Kahola 		},
706929f527aSMika Kahola };
707929f527aSMika Kahola 
708929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_hbr1 = {
709929f527aSMika Kahola 	.link_bit_rate = 270000,
710929f527aSMika Kahola 	.clock = 270000,
711929f527aSMika Kahola 	.tx = {	0xbe88, /* tx cfg0 */
712929f527aSMika Kahola 		0x4800, /* tx cfg1 */
713929f527aSMika Kahola 		0x0000, /* tx cfg2 */
714929f527aSMika Kahola 		},
715929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
716929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
717929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
718929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
719929f527aSMika Kahola 		},
720929f527aSMika Kahola 	.mpllb = { 0x308c,	/* mpllb cfg0 */
721929f527aSMika Kahola 		0x2110,		/* mpllb cfg1 */
722929f527aSMika Kahola 		0xcc9c,		/* mpllb cfg2 */
723929f527aSMika Kahola 		0xbfc1,		/* mpllb cfg3 */
724929f527aSMika Kahola 		0x4b9a,         /* mpllb cfg4 */
725929f527aSMika Kahola 		0x3f81,         /* mpllb cfg5 */
726929f527aSMika Kahola 		0x2000,		/* mpllb cfg6 */
727929f527aSMika Kahola 		0x0001,		/* mpllb cfg7 */
728929f527aSMika Kahola 		0x5000,		/* mpllb cfg8 */
729929f527aSMika Kahola 		0x0000,		/* mpllb cfg9 */
730929f527aSMika Kahola 		0x0000,		/* mpllb cfg10 */
731929f527aSMika Kahola 		},
732929f527aSMika Kahola };
733929f527aSMika Kahola 
734929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_hbr2 = {
735929f527aSMika Kahola 	.link_bit_rate = 540000,
736929f527aSMika Kahola 	.clock = 540000,
737929f527aSMika Kahola 	.tx = {	0xbe88, /* tx cfg0 */
738929f527aSMika Kahola 		0x4800, /* tx cfg1 */
739929f527aSMika Kahola 		0x0000, /* tx cfg2 */
740929f527aSMika Kahola 		},
741929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
742929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
743929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
744929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
745929f527aSMika Kahola 		},
746929f527aSMika Kahola 	.mpllb = { 0x108c,	/* mpllb cfg0 */
747929f527aSMika Kahola 		0x2108,		/* mpllb cfg1 */
748929f527aSMika Kahola 		0xcc9c,		/* mpllb cfg2 */
749929f527aSMika Kahola 		0xbfc1,		/* mpllb cfg3 */
750929f527aSMika Kahola 		0x4b9a,         /* mpllb cfg4 */
751929f527aSMika Kahola 		0x3f81,         /* mpllb cfg5 */
752929f527aSMika Kahola 		0x2000,		/* mpllb cfg6 */
753929f527aSMika Kahola 		0x0001,		/* mpllb cfg7 */
754929f527aSMika Kahola 		0x5000,		/* mpllb cfg8 */
755929f527aSMika Kahola 		0x0000,		/* mpllb cfg9 */
756929f527aSMika Kahola 		0x0000,		/* mpllb cfg10 */
757929f527aSMika Kahola 		},
758929f527aSMika Kahola };
759929f527aSMika Kahola 
760929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_hbr3 = {
761929f527aSMika Kahola 	.link_bit_rate = 810000,
762929f527aSMika Kahola 	.clock = 810000,
763929f527aSMika Kahola 	.tx = {	0xbe88, /* tx cfg0 */
764929f527aSMika Kahola 		0x4800, /* tx cfg1 */
765929f527aSMika Kahola 		0x0000, /* tx cfg2 */
766929f527aSMika Kahola 		},
767929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
768929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
769929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
770929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
771929f527aSMika Kahola 		},
772929f527aSMika Kahola 	.mpllb = { 0x10d2,	/* mpllb cfg0 */
773929f527aSMika Kahola 		0x2108,		/* mpllb cfg1 */
774929f527aSMika Kahola 		0x8d98,		/* mpllb cfg2 */
775929f527aSMika Kahola 		0xbfc1,		/* mpllb cfg3 */
776929f527aSMika Kahola 		0x7166,         /* mpllb cfg4 */
777929f527aSMika Kahola 		0x5f42,         /* mpllb cfg5 */
778929f527aSMika Kahola 		0x2000,		/* mpllb cfg6 */
779929f527aSMika Kahola 		0x0001,		/* mpllb cfg7 */
780929f527aSMika Kahola 		0x7800,		/* mpllb cfg8 */
781929f527aSMika Kahola 		0x0000,		/* mpllb cfg9 */
782929f527aSMika Kahola 		0x0000,		/* mpllb cfg10 */
783929f527aSMika Kahola 		},
784929f527aSMika Kahola };
785929f527aSMika Kahola 
786929f527aSMika Kahola /* C20 basic DP 2.0 tables */
787929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_uhbr10 = {
788929f527aSMika Kahola 	.link_bit_rate = 1000000, /* 10 Gbps */
789929f527aSMika Kahola 	.clock = 312500,
790929f527aSMika Kahola 	.tx = {	0xbe21, /* tx cfg0 */
791929f527aSMika Kahola 		0x4800, /* tx cfg1 */
792929f527aSMika Kahola 		0x0000, /* tx cfg2 */
793929f527aSMika Kahola 		},
794929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
795929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
796929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
797929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
798929f527aSMika Kahola 		},
799929f527aSMika Kahola 	.mplla = { 0x3104,	/* mplla cfg0 */
800929f527aSMika Kahola 		0xd105,		/* mplla cfg1 */
801929f527aSMika Kahola 		0xc025,		/* mplla cfg2 */
802929f527aSMika Kahola 		0xc025,		/* mplla cfg3 */
803929f527aSMika Kahola 		0x8c00,		/* mplla cfg4 */
804929f527aSMika Kahola 		0x759a,		/* mplla cfg5 */
805929f527aSMika Kahola 		0x4000,		/* mplla cfg6 */
806929f527aSMika Kahola 		0x0003,		/* mplla cfg7 */
807929f527aSMika Kahola 		0x3555,		/* mplla cfg8 */
808929f527aSMika Kahola 		0x0001,		/* mplla cfg9 */
809929f527aSMika Kahola 		},
810929f527aSMika Kahola };
811929f527aSMika Kahola 
812929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_uhbr13_5 = {
813929f527aSMika Kahola 	.link_bit_rate = 1350000, /* 13.5 Gbps */
814929f527aSMika Kahola 	.clock = 421875,
815929f527aSMika Kahola 	.tx = {	0xbea0, /* tx cfg0 */
816929f527aSMika Kahola 		0x4800, /* tx cfg1 */
817929f527aSMika Kahola 		0x0000, /* tx cfg2 */
818929f527aSMika Kahola 		},
819929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
820929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
821929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
822929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
823929f527aSMika Kahola 		},
824929f527aSMika Kahola 	.mpllb = { 0x015f,	/* mpllb cfg0 */
825929f527aSMika Kahola 		0x2205,		/* mpllb cfg1 */
826929f527aSMika Kahola 		0x1b17,		/* mpllb cfg2 */
827929f527aSMika Kahola 		0xffc1,		/* mpllb cfg3 */
828929f527aSMika Kahola 		0xe100,		/* mpllb cfg4 */
829929f527aSMika Kahola 		0xbd00,		/* mpllb cfg5 */
830929f527aSMika Kahola 		0x2000,		/* mpllb cfg6 */
831929f527aSMika Kahola 		0x0001,		/* mpllb cfg7 */
832929f527aSMika Kahola 		0x4800,		/* mpllb cfg8 */
833929f527aSMika Kahola 		0x0000,		/* mpllb cfg9 */
834929f527aSMika Kahola 		0x0000,		/* mpllb cfg10 */
835929f527aSMika Kahola 		},
836929f527aSMika Kahola };
837929f527aSMika Kahola 
838929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_dp_uhbr20 = {
839929f527aSMika Kahola 	.link_bit_rate = 2000000, /* 20 Gbps */
840929f527aSMika Kahola 	.clock = 625000,
841929f527aSMika Kahola 	.tx = {	0xbe20, /* tx cfg0 */
842929f527aSMika Kahola 		0x4800, /* tx cfg1 */
843929f527aSMika Kahola 		0x0000, /* tx cfg2 */
844929f527aSMika Kahola 		},
845929f527aSMika Kahola 	.cmn = {0x0500, /* cmn cfg0*/
846929f527aSMika Kahola 		0x0005, /* cmn cfg1 */
847929f527aSMika Kahola 		0x0000, /* cmn cfg2 */
848929f527aSMika Kahola 		0x0000, /* cmn cfg3 */
849929f527aSMika Kahola 		},
850929f527aSMika Kahola 	.mplla = { 0x3104,	/* mplla cfg0 */
851929f527aSMika Kahola 		0xd105,		/* mplla cfg1 */
852929f527aSMika Kahola 		0xc025,		/* mplla cfg2 */
853929f527aSMika Kahola 		0xc025,		/* mplla cfg3 */
854929f527aSMika Kahola 		0xa6ab,		/* mplla cfg4 */
855929f527aSMika Kahola 		0x8c00,		/* mplla cfg5 */
856929f527aSMika Kahola 		0x4000,		/* mplla cfg6 */
857929f527aSMika Kahola 		0x0003,		/* mplla cfg7 */
858929f527aSMika Kahola 		0x3555,		/* mplla cfg8 */
859929f527aSMika Kahola 		0x0001,		/* mplla cfg9 */
860929f527aSMika Kahola 		},
861929f527aSMika Kahola };
862929f527aSMika Kahola 
863929f527aSMika Kahola static const struct intel_c20pll_state * const mtl_c20_dp_tables[] = {
864929f527aSMika Kahola 	&mtl_c20_dp_rbr,
865929f527aSMika Kahola 	&mtl_c20_dp_hbr1,
866929f527aSMika Kahola 	&mtl_c20_dp_hbr2,
867929f527aSMika Kahola 	&mtl_c20_dp_hbr3,
868929f527aSMika Kahola 	&mtl_c20_dp_uhbr10,
869929f527aSMika Kahola 	&mtl_c20_dp_uhbr13_5,
870929f527aSMika Kahola 	&mtl_c20_dp_uhbr20,
871929f527aSMika Kahola 	NULL,
872929f527aSMika Kahola };
873929f527aSMika Kahola 
8745836bc5fSRadhakrishna Sripada /*
8755836bc5fSRadhakrishna Sripada  * HDMI link rates with 38.4 MHz reference clock.
8765836bc5fSRadhakrishna Sripada  */
8775836bc5fSRadhakrishna Sripada 
8785836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_25_2 = {
8795836bc5fSRadhakrishna Sripada 	.clock = 25200,
8805836bc5fSRadhakrishna Sripada 	.tx = 0x10,
8815836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
8825836bc5fSRadhakrishna Sripada 	.pll[0] = 0x4,
8835836bc5fSRadhakrishna Sripada 	.pll[1] = 0,
8845836bc5fSRadhakrishna Sripada 	.pll[2] = 0xB2,
8855836bc5fSRadhakrishna Sripada 	.pll[3] = 0,
8865836bc5fSRadhakrishna Sripada 	.pll[4] = 0,
8875836bc5fSRadhakrishna Sripada 	.pll[5] = 0,
8885836bc5fSRadhakrishna Sripada 	.pll[6] = 0,
8895836bc5fSRadhakrishna Sripada 	.pll[7] = 0,
8905836bc5fSRadhakrishna Sripada 	.pll[8] = 0x20,
8915836bc5fSRadhakrishna Sripada 	.pll[9] = 0x1,
8925836bc5fSRadhakrishna Sripada 	.pll[10] = 0,
8935836bc5fSRadhakrishna Sripada 	.pll[11] = 0,
8945836bc5fSRadhakrishna Sripada 	.pll[12] = 0,
8955836bc5fSRadhakrishna Sripada 	.pll[13] = 0,
8965836bc5fSRadhakrishna Sripada 	.pll[14] = 0,
8975836bc5fSRadhakrishna Sripada 	.pll[15] = 0xD,
8985836bc5fSRadhakrishna Sripada 	.pll[16] = 0x6,
8995836bc5fSRadhakrishna Sripada 	.pll[17] = 0x8F,
9005836bc5fSRadhakrishna Sripada 	.pll[18] = 0x84,
9015836bc5fSRadhakrishna Sripada 	.pll[19] = 0x23,
9025836bc5fSRadhakrishna Sripada };
9035836bc5fSRadhakrishna Sripada 
9045836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_27_0 = {
9055836bc5fSRadhakrishna Sripada 	.clock = 27000,
9065836bc5fSRadhakrishna Sripada 	.tx = 0x10,
9075836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
9085836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34,
9095836bc5fSRadhakrishna Sripada 	.pll[1] = 0,
9105836bc5fSRadhakrishna Sripada 	.pll[2] = 0xC0,
9115836bc5fSRadhakrishna Sripada 	.pll[3] = 0,
9125836bc5fSRadhakrishna Sripada 	.pll[4] = 0,
9135836bc5fSRadhakrishna Sripada 	.pll[5] = 0,
9145836bc5fSRadhakrishna Sripada 	.pll[6] = 0,
9155836bc5fSRadhakrishna Sripada 	.pll[7] = 0,
9165836bc5fSRadhakrishna Sripada 	.pll[8] = 0x20,
9175836bc5fSRadhakrishna Sripada 	.pll[9] = 0x1,
9185836bc5fSRadhakrishna Sripada 	.pll[10] = 0,
9195836bc5fSRadhakrishna Sripada 	.pll[11] = 0,
9205836bc5fSRadhakrishna Sripada 	.pll[12] = 0x80,
9215836bc5fSRadhakrishna Sripada 	.pll[13] = 0,
9225836bc5fSRadhakrishna Sripada 	.pll[14] = 0,
9235836bc5fSRadhakrishna Sripada 	.pll[15] = 0xD,
9245836bc5fSRadhakrishna Sripada 	.pll[16] = 0x6,
9255836bc5fSRadhakrishna Sripada 	.pll[17] = 0xCF,
9265836bc5fSRadhakrishna Sripada 	.pll[18] = 0x84,
9275836bc5fSRadhakrishna Sripada 	.pll[19] = 0x23,
9285836bc5fSRadhakrishna Sripada };
9295836bc5fSRadhakrishna Sripada 
9305836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_74_25 = {
9315836bc5fSRadhakrishna Sripada 	.clock = 74250,
9325836bc5fSRadhakrishna Sripada 	.tx = 0x10,
9335836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
9345836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4,
9355836bc5fSRadhakrishna Sripada 	.pll[1] = 0,
9365836bc5fSRadhakrishna Sripada 	.pll[2] = 0x7A,
9375836bc5fSRadhakrishna Sripada 	.pll[3] = 0,
9385836bc5fSRadhakrishna Sripada 	.pll[4] = 0,
9395836bc5fSRadhakrishna Sripada 	.pll[5] = 0,
9405836bc5fSRadhakrishna Sripada 	.pll[6] = 0,
9415836bc5fSRadhakrishna Sripada 	.pll[7] = 0,
9425836bc5fSRadhakrishna Sripada 	.pll[8] = 0x20,
9435836bc5fSRadhakrishna Sripada 	.pll[9] = 0x1,
9445836bc5fSRadhakrishna Sripada 	.pll[10] = 0,
9455836bc5fSRadhakrishna Sripada 	.pll[11] = 0,
9465836bc5fSRadhakrishna Sripada 	.pll[12] = 0x58,
9475836bc5fSRadhakrishna Sripada 	.pll[13] = 0,
9485836bc5fSRadhakrishna Sripada 	.pll[14] = 0,
9495836bc5fSRadhakrishna Sripada 	.pll[15] = 0xB,
9505836bc5fSRadhakrishna Sripada 	.pll[16] = 0x6,
9515836bc5fSRadhakrishna Sripada 	.pll[17] = 0xF,
9525836bc5fSRadhakrishna Sripada 	.pll[18] = 0x85,
9535836bc5fSRadhakrishna Sripada 	.pll[19] = 0x23,
9545836bc5fSRadhakrishna Sripada };
9555836bc5fSRadhakrishna Sripada 
9565836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_148_5 = {
9575836bc5fSRadhakrishna Sripada 	.clock = 148500,
9585836bc5fSRadhakrishna Sripada 	.tx = 0x10,
9595836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
9605836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4,
9615836bc5fSRadhakrishna Sripada 	.pll[1] = 0,
9625836bc5fSRadhakrishna Sripada 	.pll[2] = 0x7A,
9635836bc5fSRadhakrishna Sripada 	.pll[3] = 0,
9645836bc5fSRadhakrishna Sripada 	.pll[4] = 0,
9655836bc5fSRadhakrishna Sripada 	.pll[5] = 0,
9665836bc5fSRadhakrishna Sripada 	.pll[6] = 0,
9675836bc5fSRadhakrishna Sripada 	.pll[7] = 0,
9685836bc5fSRadhakrishna Sripada 	.pll[8] = 0x20,
9695836bc5fSRadhakrishna Sripada 	.pll[9] = 0x1,
9705836bc5fSRadhakrishna Sripada 	.pll[10] = 0,
9715836bc5fSRadhakrishna Sripada 	.pll[11] = 0,
9725836bc5fSRadhakrishna Sripada 	.pll[12] = 0x58,
9735836bc5fSRadhakrishna Sripada 	.pll[13] = 0,
9745836bc5fSRadhakrishna Sripada 	.pll[14] = 0,
9755836bc5fSRadhakrishna Sripada 	.pll[15] = 0xA,
9765836bc5fSRadhakrishna Sripada 	.pll[16] = 0x6,
9775836bc5fSRadhakrishna Sripada 	.pll[17] = 0xF,
9785836bc5fSRadhakrishna Sripada 	.pll[18] = 0x85,
9795836bc5fSRadhakrishna Sripada 	.pll[19] = 0x23,
9805836bc5fSRadhakrishna Sripada };
9815836bc5fSRadhakrishna Sripada 
9825836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_594 = {
9835836bc5fSRadhakrishna Sripada 	.clock = 594000,
9845836bc5fSRadhakrishna Sripada 	.tx = 0x10,
9855836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
9865836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4,
9875836bc5fSRadhakrishna Sripada 	.pll[1] = 0,
9885836bc5fSRadhakrishna Sripada 	.pll[2] = 0x7A,
9895836bc5fSRadhakrishna Sripada 	.pll[3] = 0,
9905836bc5fSRadhakrishna Sripada 	.pll[4] = 0,
9915836bc5fSRadhakrishna Sripada 	.pll[5] = 0,
9925836bc5fSRadhakrishna Sripada 	.pll[6] = 0,
9935836bc5fSRadhakrishna Sripada 	.pll[7] = 0,
9945836bc5fSRadhakrishna Sripada 	.pll[8] = 0x20,
9955836bc5fSRadhakrishna Sripada 	.pll[9] = 0x1,
9965836bc5fSRadhakrishna Sripada 	.pll[10] = 0,
9975836bc5fSRadhakrishna Sripada 	.pll[11] = 0,
9985836bc5fSRadhakrishna Sripada 	.pll[12] = 0x58,
9995836bc5fSRadhakrishna Sripada 	.pll[13] = 0,
10005836bc5fSRadhakrishna Sripada 	.pll[14] = 0,
10015836bc5fSRadhakrishna Sripada 	.pll[15] = 0x8,
10025836bc5fSRadhakrishna Sripada 	.pll[16] = 0x6,
10035836bc5fSRadhakrishna Sripada 	.pll[17] = 0xF,
10045836bc5fSRadhakrishna Sripada 	.pll[18] = 0x85,
10055836bc5fSRadhakrishna Sripada 	.pll[19] = 0x23,
10065836bc5fSRadhakrishna Sripada };
10075836bc5fSRadhakrishna Sripada 
10085836bc5fSRadhakrishna Sripada /* Precomputed C10 HDMI PLL tables */
10095836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_27027 = {
10105836bc5fSRadhakrishna Sripada 	.clock = 27027,
10115836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10125836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10135836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xC0, .pll[3] = 0x00, .pll[4] = 0x00,
10145836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10155836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xCC, .pll[12] = 0x9C, .pll[13] = 0xCB, .pll[14] = 0xCC,
10165836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0D, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10175836bc5fSRadhakrishna Sripada };
10185836bc5fSRadhakrishna Sripada 
10195836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_28320 = {
10205836bc5fSRadhakrishna Sripada 	.clock = 28320,
10215836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10225836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10235836bc5fSRadhakrishna Sripada 	.pll[0] = 0x04, .pll[1] = 0x00, .pll[2] = 0xCC, .pll[3] = 0x00, .pll[4] = 0x00,
10245836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10255836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x00, .pll[13] = 0x00, .pll[14] = 0x00,
10265836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0D, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10275836bc5fSRadhakrishna Sripada };
10285836bc5fSRadhakrishna Sripada 
10295836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_30240 = {
10305836bc5fSRadhakrishna Sripada 	.clock = 30240,
10315836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10325836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10335836bc5fSRadhakrishna Sripada 	.pll[0] = 0x04, .pll[1] = 0x00, .pll[2] = 0xDC, .pll[3] = 0x00, .pll[4] = 0x00,
10345836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10355836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x00, .pll[13] = 0x00, .pll[14] = 0x00,
10365836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0D, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
10375836bc5fSRadhakrishna Sripada };
10385836bc5fSRadhakrishna Sripada 
10395836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_31500 = {
10405836bc5fSRadhakrishna Sripada 	.clock = 31500,
10415836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10425836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10435836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x62, .pll[3] = 0x00, .pll[4] = 0x00,
10445836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10455836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0xA0, .pll[13] = 0x00, .pll[14] = 0x00,
10465836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x09, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10475836bc5fSRadhakrishna Sripada };
10485836bc5fSRadhakrishna Sripada 
10495836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_36000 = {
10505836bc5fSRadhakrishna Sripada 	.clock = 36000,
10515836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10525836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10535836bc5fSRadhakrishna Sripada 	.pll[0] = 0xC4, .pll[1] = 0x00, .pll[2] = 0x76, .pll[3] = 0x00, .pll[4] = 0x00,
10545836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10555836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x00, .pll[13] = 0x00, .pll[14] = 0x00,
10565836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10575836bc5fSRadhakrishna Sripada };
10585836bc5fSRadhakrishna Sripada 
10595836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_40000 = {
10605836bc5fSRadhakrishna Sripada 	.clock = 40000,
10615836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10625836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10635836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x86, .pll[3] = 0x00, .pll[4] = 0x00,
10645836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10655836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0x55, .pll[13] = 0x55, .pll[14] = 0x55,
10665836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10675836bc5fSRadhakrishna Sripada };
10685836bc5fSRadhakrishna Sripada 
10695836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_49500 = {
10705836bc5fSRadhakrishna Sripada 	.clock = 49500,
10715836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10725836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10735836bc5fSRadhakrishna Sripada 	.pll[0] = 0x74, .pll[1] = 0x00, .pll[2] = 0xAE, .pll[3] = 0x00, .pll[4] = 0x00,
10745836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10755836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x20, .pll[13] = 0x00, .pll[14] = 0x00,
10765836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
10775836bc5fSRadhakrishna Sripada };
10785836bc5fSRadhakrishna Sripada 
10795836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_50000 = {
10805836bc5fSRadhakrishna Sripada 	.clock = 50000,
10815836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10825836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10835836bc5fSRadhakrishna Sripada 	.pll[0] = 0x74, .pll[1] = 0x00, .pll[2] = 0xB0, .pll[3] = 0x00, .pll[4] = 0x00,
10845836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10855836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0x2A, .pll[13] = 0xA9, .pll[14] = 0xAA,
10865836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
10875836bc5fSRadhakrishna Sripada };
10885836bc5fSRadhakrishna Sripada 
10895836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_57284 = {
10905836bc5fSRadhakrishna Sripada 	.clock = 57284,
10915836bc5fSRadhakrishna Sripada 	.tx = 0x10,
10925836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
10935836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xCE, .pll[3] = 0x00, .pll[4] = 0x00,
10945836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
10955836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x77, .pll[12] = 0x57, .pll[13] = 0x77, .pll[14] = 0x77,
10965836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
10975836bc5fSRadhakrishna Sripada };
10985836bc5fSRadhakrishna Sripada 
10995836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_58000 = {
11005836bc5fSRadhakrishna Sripada 	.clock = 58000,
11015836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11025836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11035836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xD0, .pll[3] = 0x00, .pll[4] = 0x00,
11045836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11055836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0xD5, .pll[13] = 0x55, .pll[14] = 0x55,
11065836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0C, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
11075836bc5fSRadhakrishna Sripada };
11085836bc5fSRadhakrishna Sripada 
11095836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_65000 = {
11105836bc5fSRadhakrishna Sripada 	.clock = 65000,
11115836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11125836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11135836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x66, .pll[3] = 0x00, .pll[4] = 0x00,
11145836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11155836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0xB5, .pll[13] = 0x55, .pll[14] = 0x55,
11165836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x09, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
11175836bc5fSRadhakrishna Sripada };
11185836bc5fSRadhakrishna Sripada 
11195836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_71000 = {
11205836bc5fSRadhakrishna Sripada 	.clock = 71000,
11215836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11225836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11235836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x72, .pll[3] = 0x00, .pll[4] = 0x00,
11245836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11255836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0xF5, .pll[13] = 0x55, .pll[14] = 0x55,
11265836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
11275836bc5fSRadhakrishna Sripada };
11285836bc5fSRadhakrishna Sripada 
11295836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_74176 = {
11305836bc5fSRadhakrishna Sripada 	.clock = 74176,
11315836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11325836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11335836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
11345836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11355836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x44, .pll[12] = 0x44, .pll[13] = 0x44, .pll[14] = 0x44,
11365836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
11375836bc5fSRadhakrishna Sripada };
11385836bc5fSRadhakrishna Sripada 
11395836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_75000 = {
11405836bc5fSRadhakrishna Sripada 	.clock = 75000,
11415836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11425836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11435836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7C, .pll[3] = 0x00, .pll[4] = 0x00,
11445836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11455836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x20, .pll[13] = 0x00, .pll[14] = 0x00,
11465836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
11475836bc5fSRadhakrishna Sripada };
11485836bc5fSRadhakrishna Sripada 
11495836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_78750 = {
11505836bc5fSRadhakrishna Sripada 	.clock = 78750,
11515836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11525836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11535836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x84, .pll[3] = 0x00, .pll[4] = 0x00,
11545836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11555836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x08, .pll[13] = 0x00, .pll[14] = 0x00,
11565836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
11575836bc5fSRadhakrishna Sripada };
11585836bc5fSRadhakrishna Sripada 
11595836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_85500 = {
11605836bc5fSRadhakrishna Sripada 	.clock = 85500,
11615836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11625836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11635836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x92, .pll[3] = 0x00, .pll[4] = 0x00,
11645836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11655836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x10, .pll[13] = 0x00, .pll[14] = 0x00,
11665836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
11675836bc5fSRadhakrishna Sripada };
11685836bc5fSRadhakrishna Sripada 
11695836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_88750 = {
11705836bc5fSRadhakrishna Sripada 	.clock = 88750,
11715836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11725836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11735836bc5fSRadhakrishna Sripada 	.pll[0] = 0x74, .pll[1] = 0x00, .pll[2] = 0x98, .pll[3] = 0x00, .pll[4] = 0x00,
11745836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11755836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0x72, .pll[13] = 0xA9, .pll[14] = 0xAA,
11765836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x09, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
11775836bc5fSRadhakrishna Sripada };
11785836bc5fSRadhakrishna Sripada 
11795836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_106500 = {
11805836bc5fSRadhakrishna Sripada 	.clock = 106500,
11815836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11825836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11835836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xBC, .pll[3] = 0x00, .pll[4] = 0x00,
11845836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11855836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0xF0, .pll[13] = 0x00, .pll[14] = 0x00,
11865836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
11875836bc5fSRadhakrishna Sripada };
11885836bc5fSRadhakrishna Sripada 
11895836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_108000 = {
11905836bc5fSRadhakrishna Sripada 	.clock = 108000,
11915836bc5fSRadhakrishna Sripada 	.tx = 0x10,
11925836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
11935836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xC0, .pll[3] = 0x00, .pll[4] = 0x00,
11945836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
11955836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x80, .pll[13] = 0x00, .pll[14] = 0x00,
11965836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
11975836bc5fSRadhakrishna Sripada };
11985836bc5fSRadhakrishna Sripada 
11995836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_115500 = {
12005836bc5fSRadhakrishna Sripada 	.clock = 115500,
12015836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12025836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12035836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xD0, .pll[3] = 0x00, .pll[4] = 0x00,
12045836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12055836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x50, .pll[13] = 0x00, .pll[14] = 0x00,
12065836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
12075836bc5fSRadhakrishna Sripada };
12085836bc5fSRadhakrishna Sripada 
12095836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_119000 = {
12105836bc5fSRadhakrishna Sripada 	.clock = 119000,
12115836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12125836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12135836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xD6, .pll[3] = 0x00, .pll[4] = 0x00,
12145836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12155836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0xF5, .pll[13] = 0x55, .pll[14] = 0x55,
12165836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0B, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
12175836bc5fSRadhakrishna Sripada };
12185836bc5fSRadhakrishna Sripada 
12195836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_135000 = {
12205836bc5fSRadhakrishna Sripada 	.clock = 135000,
12215836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12225836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12235836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x6C, .pll[3] = 0x00, .pll[4] = 0x00,
12245836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12255836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x50, .pll[13] = 0x00, .pll[14] = 0x00,
12265836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x09, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
12275836bc5fSRadhakrishna Sripada };
12285836bc5fSRadhakrishna Sripada 
12295836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_138500 = {
12305836bc5fSRadhakrishna Sripada 	.clock = 138500,
12315836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12325836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12335836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x70, .pll[3] = 0x00, .pll[4] = 0x00,
12345836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12355836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0x22, .pll[13] = 0xA9, .pll[14] = 0xAA,
12365836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12375836bc5fSRadhakrishna Sripada };
12385836bc5fSRadhakrishna Sripada 
12395836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_147160 = {
12405836bc5fSRadhakrishna Sripada 	.clock = 147160,
12415836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12425836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12435836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x78, .pll[3] = 0x00, .pll[4] = 0x00,
12445836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12455836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0xA5, .pll[13] = 0x55, .pll[14] = 0x55,
12465836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12475836bc5fSRadhakrishna Sripada };
12485836bc5fSRadhakrishna Sripada 
12495836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_148352 = {
12505836bc5fSRadhakrishna Sripada 	.clock = 148352,
12515836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12525836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12535836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
12545836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12555836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x44, .pll[12] = 0x44, .pll[13] = 0x44, .pll[14] = 0x44,
12565836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12575836bc5fSRadhakrishna Sripada };
12585836bc5fSRadhakrishna Sripada 
12595836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_154000 = {
12605836bc5fSRadhakrishna Sripada 	.clock = 154000,
12615836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12625836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12635836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x80, .pll[3] = 0x00, .pll[4] = 0x00,
12645836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12655836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0x35, .pll[13] = 0x55, .pll[14] = 0x55,
12665836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12675836bc5fSRadhakrishna Sripada };
12685836bc5fSRadhakrishna Sripada 
12695836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_162000 = {
12705836bc5fSRadhakrishna Sripada 	.clock = 162000,
12715836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12725836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12735836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x88, .pll[3] = 0x00, .pll[4] = 0x00,
12745836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12755836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x60, .pll[13] = 0x00, .pll[14] = 0x00,
12765836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12775836bc5fSRadhakrishna Sripada };
12785836bc5fSRadhakrishna Sripada 
12795836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_167000 = {
12805836bc5fSRadhakrishna Sripada 	.clock = 167000,
12815836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12825836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12835836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x8C, .pll[3] = 0x00, .pll[4] = 0x00,
12845836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12855836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0xFA, .pll[13] = 0xA9, .pll[14] = 0xAA,
12865836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
12875836bc5fSRadhakrishna Sripada };
12885836bc5fSRadhakrishna Sripada 
12895836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_197802 = {
12905836bc5fSRadhakrishna Sripada 	.clock = 197802,
12915836bc5fSRadhakrishna Sripada 	.tx = 0x10,
12925836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
12935836bc5fSRadhakrishna Sripada 	.pll[0] = 0x74, .pll[1] = 0x00, .pll[2] = 0xAE, .pll[3] = 0x00, .pll[4] = 0x00,
12945836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
12955836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x99, .pll[12] = 0x05, .pll[13] = 0x98, .pll[14] = 0x99,
12965836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
12975836bc5fSRadhakrishna Sripada };
12985836bc5fSRadhakrishna Sripada 
12995836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_198000 = {
13005836bc5fSRadhakrishna Sripada 	.clock = 198000,
13015836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13025836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13035836bc5fSRadhakrishna Sripada 	.pll[0] = 0x74, .pll[1] = 0x00, .pll[2] = 0xAE, .pll[3] = 0x00, .pll[4] = 0x00,
13045836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13055836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x20, .pll[13] = 0x00, .pll[14] = 0x00,
13065836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
13075836bc5fSRadhakrishna Sripada };
13085836bc5fSRadhakrishna Sripada 
13095836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_209800 = {
13105836bc5fSRadhakrishna Sripada 	.clock = 209800,
13115836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13125836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13135836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xBA, .pll[3] = 0x00, .pll[4] = 0x00,
13145836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13155836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0x45, .pll[13] = 0x55, .pll[14] = 0x55,
13165836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
13175836bc5fSRadhakrishna Sripada };
13185836bc5fSRadhakrishna Sripada 
13195836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_241500 = {
13205836bc5fSRadhakrishna Sripada 	.clock = 241500,
13215836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13225836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13235836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xDA, .pll[3] = 0x00, .pll[4] = 0x00,
13245836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13255836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0xC8, .pll[13] = 0x00, .pll[14] = 0x00,
13265836bc5fSRadhakrishna Sripada 	.pll[15] = 0x0A, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
13275836bc5fSRadhakrishna Sripada };
13285836bc5fSRadhakrishna Sripada 
13295836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_262750 = {
13305836bc5fSRadhakrishna Sripada 	.clock = 262750,
13315836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13325836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13335836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x68, .pll[3] = 0x00, .pll[4] = 0x00,
13345836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13355836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0x6C, .pll[13] = 0xA9, .pll[14] = 0xAA,
13365836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x09, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
13375836bc5fSRadhakrishna Sripada };
13385836bc5fSRadhakrishna Sripada 
13395836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_268500 = {
13405836bc5fSRadhakrishna Sripada 	.clock = 268500,
13415836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13425836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13435836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x6A, .pll[3] = 0x00, .pll[4] = 0x00,
13445836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13455836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0xEC, .pll[13] = 0x00, .pll[14] = 0x00,
13465836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x09, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
13475836bc5fSRadhakrishna Sripada };
13485836bc5fSRadhakrishna Sripada 
13495836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_296703 = {
13505836bc5fSRadhakrishna Sripada 	.clock = 296703,
13515836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13525836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13535836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
13545836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13555836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x33, .pll[12] = 0x44, .pll[13] = 0x33, .pll[14] = 0x33,
13565836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
13575836bc5fSRadhakrishna Sripada };
13585836bc5fSRadhakrishna Sripada 
13595836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_297000 = {
13605836bc5fSRadhakrishna Sripada 	.clock = 297000,
13615836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13625836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13635836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
13645836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13655836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x00, .pll[12] = 0x58, .pll[13] = 0x00, .pll[14] = 0x00,
13665836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
13675836bc5fSRadhakrishna Sripada };
13685836bc5fSRadhakrishna Sripada 
13695836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_319750 = {
13705836bc5fSRadhakrishna Sripada 	.clock = 319750,
13715836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13725836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13735836bc5fSRadhakrishna Sripada 	.pll[0] = 0xB4, .pll[1] = 0x00, .pll[2] = 0x86, .pll[3] = 0x00, .pll[4] = 0x00,
13745836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13755836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0xAA, .pll[12] = 0x44, .pll[13] = 0xA9, .pll[14] = 0xAA,
13765836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
13775836bc5fSRadhakrishna Sripada };
13785836bc5fSRadhakrishna Sripada 
13795836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_497750 = {
13805836bc5fSRadhakrishna Sripada 	.clock = 497750,
13815836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13825836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13835836bc5fSRadhakrishna Sripada 	.pll[0] = 0x34, .pll[1] = 0x00, .pll[2] = 0xE2, .pll[3] = 0x00, .pll[4] = 0x00,
13845836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13855836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0x9F, .pll[13] = 0x55, .pll[14] = 0x55,
13865836bc5fSRadhakrishna Sripada 	.pll[15] = 0x09, .pll[16] = 0x08, .pll[17] = 0xCF, .pll[18] = 0x84, .pll[19] = 0x23,
13875836bc5fSRadhakrishna Sripada };
13885836bc5fSRadhakrishna Sripada 
13895836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_592000 = {
13905836bc5fSRadhakrishna Sripada 	.clock = 592000,
13915836bc5fSRadhakrishna Sripada 	.tx = 0x10,
13925836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
13935836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
13945836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
13955836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x55, .pll[12] = 0x15, .pll[13] = 0x55, .pll[14] = 0x55,
13965836bc5fSRadhakrishna Sripada 	.pll[15] = 0x08, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
13975836bc5fSRadhakrishna Sripada };
13985836bc5fSRadhakrishna Sripada 
13995836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state mtl_c10_hdmi_593407 = {
14005836bc5fSRadhakrishna Sripada 	.clock = 593407,
14015836bc5fSRadhakrishna Sripada 	.tx = 0x10,
14025836bc5fSRadhakrishna Sripada 	.cmn = 0x1,
14035836bc5fSRadhakrishna Sripada 	.pll[0] = 0xF4, .pll[1] = 0x00, .pll[2] = 0x7A, .pll[3] = 0x00, .pll[4] = 0x00,
14045836bc5fSRadhakrishna Sripada 	.pll[5] = 0x00, .pll[6] = 0x00, .pll[7] = 0x00, .pll[8] = 0x20, .pll[9] = 0xFF,
14055836bc5fSRadhakrishna Sripada 	.pll[10] = 0xFF, .pll[11] = 0x3B, .pll[12] = 0x44, .pll[13] = 0xBA, .pll[14] = 0xBB,
14065836bc5fSRadhakrishna Sripada 	.pll[15] = 0x08, .pll[16] = 0x08, .pll[17] = 0x8F, .pll[18] = 0x84, .pll[19] = 0x23,
14075836bc5fSRadhakrishna Sripada };
14085836bc5fSRadhakrishna Sripada 
14095836bc5fSRadhakrishna Sripada static const struct intel_c10pll_state * const mtl_c10_hdmi_tables[] = {
14105836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_25_2, /* Consolidated Table */
14115836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_27_0, /* Consolidated Table */
14125836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_27027,
14135836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_28320,
14145836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_30240,
14155836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_31500,
14165836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_36000,
14175836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_40000,
14185836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_49500,
14195836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_50000,
14205836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_57284,
14215836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_58000,
14225836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_65000,
14235836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_71000,
14245836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_74176,
14255836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_74_25, /* Consolidated Table */
14265836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_75000,
14275836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_78750,
14285836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_85500,
14295836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_88750,
14305836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_106500,
14315836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_108000,
14325836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_115500,
14335836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_119000,
14345836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_135000,
14355836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_138500,
14365836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_147160,
14375836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_148352,
14385836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_148_5, /* Consolidated Table */
14395836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_154000,
14405836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_162000,
14415836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_167000,
14425836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_197802,
14435836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_198000,
14445836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_209800,
14455836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_241500,
14465836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_262750,
14475836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_268500,
14485836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_296703,
14495836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_297000,
14505836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_319750,
14515836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_497750,
14525836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_592000,
14535836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_593407,
14545836bc5fSRadhakrishna Sripada 	&mtl_c10_hdmi_594, /* Consolidated Table */
14555836bc5fSRadhakrishna Sripada 	NULL,
14565836bc5fSRadhakrishna Sripada };
14575836bc5fSRadhakrishna Sripada 
1458929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_25_175 = {
1459929f527aSMika Kahola 	.link_bit_rate = 25175,
1460929f527aSMika Kahola 	.clock = 25175,
1461929f527aSMika Kahola 	.tx = {  0xbe88, /* tx cfg0 */
1462929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1463929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1464929f527aSMika Kahola 		},
1465929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1466929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1467929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1468929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1469929f527aSMika Kahola 		},
1470929f527aSMika Kahola 	.mpllb = { 0xa0d2,	/* mpllb cfg0 */
1471929f527aSMika Kahola 		   0x7d80,	/* mpllb cfg1 */
1472929f527aSMika Kahola 		   0x0906,	/* mpllb cfg2 */
1473929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1474929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1475929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1476929f527aSMika Kahola 		   0x0200,	/* mpllb cfg6 */
1477929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1478929f527aSMika Kahola 		   0x0000,	/* mpllb cfg8 */
1479929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1480929f527aSMika Kahola 		   0x0001,	/* mpllb cfg10 */
1481929f527aSMika Kahola 		},
1482929f527aSMika Kahola };
1483929f527aSMika Kahola 
1484929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_27_0 = {
1485929f527aSMika Kahola 	.link_bit_rate = 27000,
1486929f527aSMika Kahola 	.clock = 27000,
1487929f527aSMika Kahola 	.tx = {  0xbe88, /* tx cfg0 */
1488929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1489929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1490929f527aSMika Kahola 		},
1491929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1492929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1493929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1494929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1495929f527aSMika Kahola 		},
1496929f527aSMika Kahola 	.mpllb = { 0xa0e0,	/* mpllb cfg0 */
1497929f527aSMika Kahola 		   0x7d80,	/* mpllb cfg1 */
1498929f527aSMika Kahola 		   0x0906,	/* mpllb cfg2 */
1499929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1500929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1501929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1502929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1503929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1504929f527aSMika Kahola 		   0x8000,	/* mpllb cfg8 */
1505929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1506929f527aSMika Kahola 		   0x0001,	/* mpllb cfg10 */
1507929f527aSMika Kahola 		},
1508929f527aSMika Kahola };
1509929f527aSMika Kahola 
1510929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_74_25 = {
1511929f527aSMika Kahola 	.link_bit_rate = 74250,
1512929f527aSMika Kahola 	.clock = 74250,
1513929f527aSMika Kahola 	.tx = {  0xbe88, /* tx cfg0 */
1514929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1515929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1516929f527aSMika Kahola 		},
1517929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1518929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1519929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1520929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1521929f527aSMika Kahola 		},
1522929f527aSMika Kahola 	.mpllb = { 0x609a,	/* mpllb cfg0 */
1523929f527aSMika Kahola 		   0x7d40,	/* mpllb cfg1 */
1524929f527aSMika Kahola 		   0xca06,	/* mpllb cfg2 */
1525929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1526929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1527929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1528929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1529929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1530929f527aSMika Kahola 		   0x5800,	/* mpllb cfg8 */
1531929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1532929f527aSMika Kahola 		   0x0001,	/* mpllb cfg10 */
1533929f527aSMika Kahola 		},
1534929f527aSMika Kahola };
1535929f527aSMika Kahola 
1536929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_148_5 = {
1537929f527aSMika Kahola 	.link_bit_rate = 148500,
1538929f527aSMika Kahola 	.clock = 148500,
1539929f527aSMika Kahola 	.tx = {  0xbe88, /* tx cfg0 */
1540929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1541929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1542929f527aSMika Kahola 		},
1543929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1544929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1545929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1546929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1547929f527aSMika Kahola 		},
1548929f527aSMika Kahola 	.mpllb = { 0x409a,	/* mpllb cfg0 */
1549929f527aSMika Kahola 		   0x7d20,	/* mpllb cfg1 */
1550929f527aSMika Kahola 		   0xca06,	/* mpllb cfg2 */
1551929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1552929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1553929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1554929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1555929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1556929f527aSMika Kahola 		   0x5800,	/* mpllb cfg8 */
1557929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1558929f527aSMika Kahola 		   0x0001,	/* mpllb cfg10 */
1559929f527aSMika Kahola 		},
1560929f527aSMika Kahola };
1561929f527aSMika Kahola 
1562929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_594 = {
1563929f527aSMika Kahola 	.link_bit_rate = 594000,
1564929f527aSMika Kahola 	.clock = 594000,
1565929f527aSMika Kahola 	.tx = {  0xbe88, /* tx cfg0 */
1566929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1567929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1568929f527aSMika Kahola 		},
1569929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1570929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1571929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1572929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1573929f527aSMika Kahola 		},
1574929f527aSMika Kahola 	.mpllb = { 0x009a,	/* mpllb cfg0 */
1575929f527aSMika Kahola 		   0x7d08,	/* mpllb cfg1 */
1576929f527aSMika Kahola 		   0xca06,	/* mpllb cfg2 */
1577929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1578929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1579929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1580929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1581929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1582929f527aSMika Kahola 		   0x5800,	/* mpllb cfg8 */
1583929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1584929f527aSMika Kahola 		   0x0001,	/* mpllb cfg10 */
1585929f527aSMika Kahola 		},
1586929f527aSMika Kahola };
1587929f527aSMika Kahola 
1588929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_300 = {
1589929f527aSMika Kahola 	.link_bit_rate = 3000000,
1590929f527aSMika Kahola 	.clock = 166670,
1591929f527aSMika Kahola 	.tx = {  0xbe98, /* tx cfg0 */
1592929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1593929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1594929f527aSMika Kahola 		},
1595929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1596929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1597929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1598929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1599929f527aSMika Kahola 		},
1600929f527aSMika Kahola 	.mpllb = { 0x209c,	/* mpllb cfg0 */
1601929f527aSMika Kahola 		   0x7d10,	/* mpllb cfg1 */
1602929f527aSMika Kahola 		   0xca06,	/* mpllb cfg2 */
1603929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1604929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1605929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1606929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1607929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1608929f527aSMika Kahola 		   0x2000,	/* mpllb cfg8 */
1609929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1610929f527aSMika Kahola 		   0x0004,	/* mpllb cfg10 */
1611929f527aSMika Kahola 		},
1612929f527aSMika Kahola };
1613929f527aSMika Kahola 
1614929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_600 = {
1615929f527aSMika Kahola 	.link_bit_rate = 6000000,
1616929f527aSMika Kahola 	.clock = 333330,
1617929f527aSMika Kahola 	.tx = {  0xbe98, /* tx cfg0 */
1618929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1619929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1620929f527aSMika Kahola 		},
1621929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1622929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1623929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1624929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1625929f527aSMika Kahola 		},
1626929f527aSMika Kahola 	.mpllb = { 0x009c,	/* mpllb cfg0 */
1627929f527aSMika Kahola 		   0x7d08,	/* mpllb cfg1 */
1628929f527aSMika Kahola 		   0xca06,	/* mpllb cfg2 */
1629929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1630929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1631929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1632929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1633929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1634929f527aSMika Kahola 		   0x2000,	/* mpllb cfg8 */
1635929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1636929f527aSMika Kahola 		   0x0004,	/* mpllb cfg10 */
1637929f527aSMika Kahola 		},
1638929f527aSMika Kahola };
1639929f527aSMika Kahola 
1640929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_800 = {
1641929f527aSMika Kahola 	.link_bit_rate = 8000000,
1642929f527aSMika Kahola 	.clock = 444440,
1643929f527aSMika Kahola 	.tx = {  0xbe98, /* tx cfg0 */
1644929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1645929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1646929f527aSMika Kahola 		},
1647929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1648929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1649929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1650929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1651929f527aSMika Kahola 		},
1652929f527aSMika Kahola 	.mpllb = { 0x00d0,	/* mpllb cfg0 */
1653929f527aSMika Kahola 		   0x7d08,	/* mpllb cfg1 */
1654929f527aSMika Kahola 		   0x4a06,	/* mpllb cfg2 */
1655929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1656929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1657929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1658929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1659929f527aSMika Kahola 		   0x0003,	/* mpllb cfg7 */
1660929f527aSMika Kahola 		   0x2aaa,	/* mpllb cfg8 */
1661929f527aSMika Kahola 		   0x0002,	/* mpllb cfg9 */
1662929f527aSMika Kahola 		   0x0004,	/* mpllb cfg10 */
1663929f527aSMika Kahola 		},
1664929f527aSMika Kahola };
1665929f527aSMika Kahola 
1666929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_1000 = {
1667929f527aSMika Kahola 	.link_bit_rate = 10000000,
1668929f527aSMika Kahola 	.clock = 555560,
1669929f527aSMika Kahola 	.tx = {  0xbe98, /* tx cfg0 */
1670929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1671929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1672929f527aSMika Kahola 		},
1673929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1674929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1675929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1676929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1677929f527aSMika Kahola 		},
1678929f527aSMika Kahola 	.mpllb = { 0x1104,	/* mpllb cfg0 */
1679929f527aSMika Kahola 		   0x7d08,	/* mpllb cfg1 */
1680929f527aSMika Kahola 		   0x0a06,	/* mpllb cfg2 */
1681929f527aSMika Kahola 		   0xbe40,	/* mpllb cfg3 */
1682929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1683929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1684929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1685929f527aSMika Kahola 		   0x0003,	/* mpllb cfg7 */
1686929f527aSMika Kahola 		   0x3555,	/* mpllb cfg8 */
1687929f527aSMika Kahola 		   0x0001,	/* mpllb cfg9 */
1688929f527aSMika Kahola 		   0x0004,	/* mpllb cfg10 */
1689929f527aSMika Kahola 		},
1690929f527aSMika Kahola };
1691929f527aSMika Kahola 
1692929f527aSMika Kahola static const struct intel_c20pll_state mtl_c20_hdmi_1200 = {
1693929f527aSMika Kahola 	.link_bit_rate = 12000000,
1694929f527aSMika Kahola 	.clock = 666670,
1695929f527aSMika Kahola 	.tx = {  0xbe98, /* tx cfg0 */
1696929f527aSMika Kahola 		  0x9800, /* tx cfg1 */
1697929f527aSMika Kahola 		  0x0000, /* tx cfg2 */
1698929f527aSMika Kahola 		},
1699929f527aSMika Kahola 	.cmn = { 0x0500, /* cmn cfg0*/
1700929f527aSMika Kahola 		  0x0005, /* cmn cfg1 */
1701929f527aSMika Kahola 		  0x0000, /* cmn cfg2 */
1702929f527aSMika Kahola 		  0x0000, /* cmn cfg3 */
1703929f527aSMika Kahola 		},
1704929f527aSMika Kahola 	.mpllb = { 0x0138,	/* mpllb cfg0 */
1705929f527aSMika Kahola 		   0x7d08,	/* mpllb cfg1 */
1706929f527aSMika Kahola 		   0x5486,	/* mpllb cfg2 */
1707929f527aSMika Kahola 		   0xfe40,	/* mpllb cfg3 */
1708929f527aSMika Kahola 		   0x0000,	/* mpllb cfg4 */
1709929f527aSMika Kahola 		   0x0000,	/* mpllb cfg5 */
1710929f527aSMika Kahola 		   0x2200,	/* mpllb cfg6 */
1711929f527aSMika Kahola 		   0x0001,	/* mpllb cfg7 */
1712929f527aSMika Kahola 		   0x4000,	/* mpllb cfg8 */
1713929f527aSMika Kahola 		   0x0000,	/* mpllb cfg9 */
1714929f527aSMika Kahola 		   0x0004,	/* mpllb cfg10 */
1715929f527aSMika Kahola 		},
1716929f527aSMika Kahola };
1717929f527aSMika Kahola 
1718929f527aSMika Kahola static const struct intel_c20pll_state * const mtl_c20_hdmi_tables[] = {
1719929f527aSMika Kahola 	&mtl_c20_hdmi_25_175,
1720929f527aSMika Kahola 	&mtl_c20_hdmi_27_0,
1721929f527aSMika Kahola 	&mtl_c20_hdmi_74_25,
1722929f527aSMika Kahola 	&mtl_c20_hdmi_148_5,
1723929f527aSMika Kahola 	&mtl_c20_hdmi_594,
1724929f527aSMika Kahola 	&mtl_c20_hdmi_300,
1725929f527aSMika Kahola 	&mtl_c20_hdmi_600,
1726929f527aSMika Kahola 	&mtl_c20_hdmi_800,
1727929f527aSMika Kahola 	&mtl_c20_hdmi_1000,
1728929f527aSMika Kahola 	&mtl_c20_hdmi_1200,
1729929f527aSMika Kahola 	NULL,
1730929f527aSMika Kahola };
1731929f527aSMika Kahola 
intel_c10_phy_check_hdmi_link_rate(int clock)1732929f527aSMika Kahola static int intel_c10_phy_check_hdmi_link_rate(int clock)
17335836bc5fSRadhakrishna Sripada {
17345836bc5fSRadhakrishna Sripada 	const struct intel_c10pll_state * const *tables = mtl_c10_hdmi_tables;
17355836bc5fSRadhakrishna Sripada 	int i;
17365836bc5fSRadhakrishna Sripada 
17375836bc5fSRadhakrishna Sripada 	for (i = 0; tables[i]; i++) {
17385836bc5fSRadhakrishna Sripada 		if (clock == tables[i]->clock)
17395836bc5fSRadhakrishna Sripada 			return MODE_OK;
17405836bc5fSRadhakrishna Sripada 	}
17415836bc5fSRadhakrishna Sripada 
17425836bc5fSRadhakrishna Sripada 	return MODE_CLOCK_RANGE;
17435836bc5fSRadhakrishna Sripada }
17445836bc5fSRadhakrishna Sripada 
174551390cc0SRadhakrishna Sripada static const struct intel_c10pll_state * const *
intel_c10pll_tables_get(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)174651390cc0SRadhakrishna Sripada intel_c10pll_tables_get(struct intel_crtc_state *crtc_state,
174751390cc0SRadhakrishna Sripada 			struct intel_encoder *encoder)
174851390cc0SRadhakrishna Sripada {
174951390cc0SRadhakrishna Sripada 	if (intel_crtc_has_dp_encoder(crtc_state)) {
175051390cc0SRadhakrishna Sripada 		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
175151390cc0SRadhakrishna Sripada 			return mtl_c10_edp_tables;
175251390cc0SRadhakrishna Sripada 		else
175351390cc0SRadhakrishna Sripada 			return mtl_c10_dp_tables;
17545836bc5fSRadhakrishna Sripada 	} else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
17555836bc5fSRadhakrishna Sripada 		return mtl_c10_hdmi_tables;
175651390cc0SRadhakrishna Sripada 	}
175751390cc0SRadhakrishna Sripada 
175851390cc0SRadhakrishna Sripada 	MISSING_CASE(encoder->type);
175951390cc0SRadhakrishna Sripada 	return NULL;
176051390cc0SRadhakrishna Sripada }
176151390cc0SRadhakrishna Sripada 
intel_c10pll_update_pll(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)176251390cc0SRadhakrishna Sripada static void intel_c10pll_update_pll(struct intel_crtc_state *crtc_state,
176351390cc0SRadhakrishna Sripada 				    struct intel_encoder *encoder)
176451390cc0SRadhakrishna Sripada {
176551390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
176651390cc0SRadhakrishna Sripada 	struct intel_cx0pll_state *pll_state = &crtc_state->cx0pll_state;
176751390cc0SRadhakrishna Sripada 	int i;
176851390cc0SRadhakrishna Sripada 
176951390cc0SRadhakrishna Sripada 	if (intel_crtc_has_dp_encoder(crtc_state)) {
177051390cc0SRadhakrishna Sripada 		if (intel_panel_use_ssc(i915)) {
177151390cc0SRadhakrishna Sripada 			struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
177251390cc0SRadhakrishna Sripada 
177351390cc0SRadhakrishna Sripada 			pll_state->ssc_enabled =
177451390cc0SRadhakrishna Sripada 				(intel_dp->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5);
177551390cc0SRadhakrishna Sripada 		}
177651390cc0SRadhakrishna Sripada 	}
177751390cc0SRadhakrishna Sripada 
177851390cc0SRadhakrishna Sripada 	if (pll_state->ssc_enabled)
177951390cc0SRadhakrishna Sripada 		return;
178051390cc0SRadhakrishna Sripada 
178151390cc0SRadhakrishna Sripada 	drm_WARN_ON(&i915->drm, ARRAY_SIZE(pll_state->c10.pll) < 9);
178251390cc0SRadhakrishna Sripada 	for (i = 4; i < 9; i++)
178351390cc0SRadhakrishna Sripada 		pll_state->c10.pll[i] = 0;
178451390cc0SRadhakrishna Sripada }
178551390cc0SRadhakrishna Sripada 
intel_c10pll_calc_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)178651390cc0SRadhakrishna Sripada static int intel_c10pll_calc_state(struct intel_crtc_state *crtc_state,
178751390cc0SRadhakrishna Sripada 				   struct intel_encoder *encoder)
178851390cc0SRadhakrishna Sripada {
178951390cc0SRadhakrishna Sripada 	const struct intel_c10pll_state * const *tables;
179051390cc0SRadhakrishna Sripada 	int i;
179151390cc0SRadhakrishna Sripada 
179251390cc0SRadhakrishna Sripada 	tables = intel_c10pll_tables_get(crtc_state, encoder);
179351390cc0SRadhakrishna Sripada 	if (!tables)
179451390cc0SRadhakrishna Sripada 		return -EINVAL;
179551390cc0SRadhakrishna Sripada 
179651390cc0SRadhakrishna Sripada 	for (i = 0; tables[i]; i++) {
179751390cc0SRadhakrishna Sripada 		if (crtc_state->port_clock == tables[i]->clock) {
179851390cc0SRadhakrishna Sripada 			crtc_state->cx0pll_state.c10 = *tables[i];
179951390cc0SRadhakrishna Sripada 			intel_c10pll_update_pll(crtc_state, encoder);
180051390cc0SRadhakrishna Sripada 
180151390cc0SRadhakrishna Sripada 			return 0;
180251390cc0SRadhakrishna Sripada 		}
180351390cc0SRadhakrishna Sripada 	}
180451390cc0SRadhakrishna Sripada 
180551390cc0SRadhakrishna Sripada 	return -EINVAL;
180651390cc0SRadhakrishna Sripada }
180751390cc0SRadhakrishna Sripada 
intel_c10pll_readout_hw_state(struct intel_encoder * encoder,struct intel_c10pll_state * pll_state)180851390cc0SRadhakrishna Sripada void intel_c10pll_readout_hw_state(struct intel_encoder *encoder,
180951390cc0SRadhakrishna Sripada 				   struct intel_c10pll_state *pll_state)
181051390cc0SRadhakrishna Sripada {
181151390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
181251390cc0SRadhakrishna Sripada 	u8 lane = INTEL_CX0_LANE0;
181351390cc0SRadhakrishna Sripada 	intel_wakeref_t wakeref;
181451390cc0SRadhakrishna Sripada 	int i;
181551390cc0SRadhakrishna Sripada 
181651390cc0SRadhakrishna Sripada 	wakeref = intel_cx0_phy_transaction_begin(encoder);
181751390cc0SRadhakrishna Sripada 
181851390cc0SRadhakrishna Sripada 	/*
181951390cc0SRadhakrishna Sripada 	 * According to C10 VDR Register programming Sequence we need
182051390cc0SRadhakrishna Sripada 	 * to do this to read PHY internal registers from MsgBus.
182151390cc0SRadhakrishna Sripada 	 */
182251390cc0SRadhakrishna Sripada 	intel_cx0_rmw(i915, encoder->port, lane, PHY_C10_VDR_CONTROL(1),
182351390cc0SRadhakrishna Sripada 		      0, C10_VDR_CTRL_MSGBUS_ACCESS,
182451390cc0SRadhakrishna Sripada 		      MB_WRITE_COMMITTED);
182551390cc0SRadhakrishna Sripada 
182651390cc0SRadhakrishna Sripada 	for (i = 0; i < ARRAY_SIZE(pll_state->pll); i++)
182751390cc0SRadhakrishna Sripada 		pll_state->pll[i] = intel_cx0_read(i915, encoder->port, lane,
182851390cc0SRadhakrishna Sripada 						   PHY_C10_VDR_PLL(i));
182951390cc0SRadhakrishna Sripada 
183051390cc0SRadhakrishna Sripada 	pll_state->cmn = intel_cx0_read(i915, encoder->port, lane, PHY_C10_VDR_CMN(0));
183151390cc0SRadhakrishna Sripada 	pll_state->tx = intel_cx0_read(i915, encoder->port, lane, PHY_C10_VDR_TX(0));
183251390cc0SRadhakrishna Sripada 
183351390cc0SRadhakrishna Sripada 	intel_cx0_phy_transaction_end(encoder, wakeref);
183451390cc0SRadhakrishna Sripada }
183551390cc0SRadhakrishna Sripada 
intel_c10_pll_program(struct drm_i915_private * i915,const struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)183651390cc0SRadhakrishna Sripada static void intel_c10_pll_program(struct drm_i915_private *i915,
183751390cc0SRadhakrishna Sripada 				  const struct intel_crtc_state *crtc_state,
183851390cc0SRadhakrishna Sripada 				  struct intel_encoder *encoder)
183951390cc0SRadhakrishna Sripada {
184051390cc0SRadhakrishna Sripada 	const struct intel_c10pll_state *pll_state = &crtc_state->cx0pll_state.c10;
184151390cc0SRadhakrishna Sripada 	int i;
184251390cc0SRadhakrishna Sripada 
184351390cc0SRadhakrishna Sripada 	intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1),
184451390cc0SRadhakrishna Sripada 		      0, C10_VDR_CTRL_MSGBUS_ACCESS,
184551390cc0SRadhakrishna Sripada 		      MB_WRITE_COMMITTED);
18465836bc5fSRadhakrishna Sripada 
184751390cc0SRadhakrishna Sripada 	/* Custom width needs to be programmed to 0 for both the phy lanes */
184851390cc0SRadhakrishna Sripada 	intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CUSTOM_WIDTH,
184951390cc0SRadhakrishna Sripada 		      C10_VDR_CUSTOM_WIDTH_MASK, C10_VDR_CUSTOM_WIDTH_8_10,
185051390cc0SRadhakrishna Sripada 		      MB_WRITE_COMMITTED);
185151390cc0SRadhakrishna Sripada 	intel_cx0_rmw(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1),
185251390cc0SRadhakrishna Sripada 		      0, C10_VDR_CTRL_UPDATE_CFG,
185351390cc0SRadhakrishna Sripada 		      MB_WRITE_COMMITTED);
185451390cc0SRadhakrishna Sripada 
185551390cc0SRadhakrishna Sripada 	/* Program the pll values only for the master lane */
185651390cc0SRadhakrishna Sripada 	for (i = 0; i < ARRAY_SIZE(pll_state->pll); i++)
185751390cc0SRadhakrishna Sripada 		intel_cx0_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C10_VDR_PLL(i),
185851390cc0SRadhakrishna Sripada 				pll_state->pll[i],
185951390cc0SRadhakrishna Sripada 				(i % 4) ? MB_WRITE_UNCOMMITTED : MB_WRITE_COMMITTED);
186051390cc0SRadhakrishna Sripada 
186151390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C10_VDR_CMN(0), pll_state->cmn, MB_WRITE_COMMITTED);
186251390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C10_VDR_TX(0), pll_state->tx, MB_WRITE_COMMITTED);
186351390cc0SRadhakrishna Sripada 
186451390cc0SRadhakrishna Sripada 	intel_cx0_rmw(i915, encoder->port, INTEL_CX0_LANE0, PHY_C10_VDR_CONTROL(1),
186551390cc0SRadhakrishna Sripada 		      0, C10_VDR_CTRL_MASTER_LANE | C10_VDR_CTRL_UPDATE_CFG,
186651390cc0SRadhakrishna Sripada 		      MB_WRITE_COMMITTED);
186751390cc0SRadhakrishna Sripada }
186851390cc0SRadhakrishna Sripada 
intel_c10pll_dump_hw_state(struct drm_i915_private * i915,const struct intel_c10pll_state * hw_state)186951390cc0SRadhakrishna Sripada void intel_c10pll_dump_hw_state(struct drm_i915_private *i915,
187051390cc0SRadhakrishna Sripada 				const struct intel_c10pll_state *hw_state)
187151390cc0SRadhakrishna Sripada {
187251390cc0SRadhakrishna Sripada 	bool fracen;
187351390cc0SRadhakrishna Sripada 	int i;
187451390cc0SRadhakrishna Sripada 	unsigned int frac_quot = 0, frac_rem = 0, frac_den = 1;
187551390cc0SRadhakrishna Sripada 	unsigned int multiplier, tx_clk_div;
187651390cc0SRadhakrishna Sripada 
187751390cc0SRadhakrishna Sripada 	fracen = hw_state->pll[0] & C10_PLL0_FRACEN;
187851390cc0SRadhakrishna Sripada 	drm_dbg_kms(&i915->drm, "c10pll_hw_state: fracen: %s, ",
187951390cc0SRadhakrishna Sripada 		    str_yes_no(fracen));
188051390cc0SRadhakrishna Sripada 
188151390cc0SRadhakrishna Sripada 	if (fracen) {
188251390cc0SRadhakrishna Sripada 		frac_quot = hw_state->pll[12] << 8 | hw_state->pll[11];
188351390cc0SRadhakrishna Sripada 		frac_rem =  hw_state->pll[14] << 8 | hw_state->pll[13];
188451390cc0SRadhakrishna Sripada 		frac_den =  hw_state->pll[10] << 8 | hw_state->pll[9];
188551390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm, "quot: %u, rem: %u, den: %u,\n",
188651390cc0SRadhakrishna Sripada 			    frac_quot, frac_rem, frac_den);
188751390cc0SRadhakrishna Sripada 	}
188851390cc0SRadhakrishna Sripada 
188951390cc0SRadhakrishna Sripada 	multiplier = (REG_FIELD_GET8(C10_PLL3_MULTIPLIERH_MASK, hw_state->pll[3]) << 8 |
189051390cc0SRadhakrishna Sripada 		      hw_state->pll[2]) / 2 + 16;
189151390cc0SRadhakrishna Sripada 	tx_clk_div = REG_FIELD_GET8(C10_PLL15_TXCLKDIV_MASK, hw_state->pll[15]);
189251390cc0SRadhakrishna Sripada 	drm_dbg_kms(&i915->drm,
189351390cc0SRadhakrishna Sripada 		    "multiplier: %u, tx_clk_div: %u.\n", multiplier, tx_clk_div);
189451390cc0SRadhakrishna Sripada 
189551390cc0SRadhakrishna Sripada 	drm_dbg_kms(&i915->drm, "c10pll_rawhw_state:");
189651390cc0SRadhakrishna Sripada 	drm_dbg_kms(&i915->drm, "tx: 0x%x, cmn: 0x%x\n", hw_state->tx, hw_state->cmn);
189751390cc0SRadhakrishna Sripada 
189851390cc0SRadhakrishna Sripada 	BUILD_BUG_ON(ARRAY_SIZE(hw_state->pll) % 4);
189951390cc0SRadhakrishna Sripada 	for (i = 0; i < ARRAY_SIZE(hw_state->pll); i = i + 4)
190051390cc0SRadhakrishna Sripada 		drm_dbg_kms(&i915->drm, "pll[%d] = 0x%x, pll[%d] = 0x%x, pll[%d] = 0x%x, pll[%d] = 0x%x\n",
190151390cc0SRadhakrishna Sripada 			    i, hw_state->pll[i], i + 1, hw_state->pll[i + 1],
190251390cc0SRadhakrishna Sripada 			    i + 2, hw_state->pll[i + 2], i + 3, hw_state->pll[i + 3]);
190351390cc0SRadhakrishna Sripada }
190451390cc0SRadhakrishna Sripada 
intel_c20_compute_hdmi_tmds_pll(u64 pixel_clock,struct intel_c20pll_state * pll_state)1905234fcb97SClint Taylor static int intel_c20_compute_hdmi_tmds_pll(u64 pixel_clock, struct intel_c20pll_state *pll_state)
1906234fcb97SClint Taylor {
1907234fcb97SClint Taylor 	u64 datarate;
1908234fcb97SClint Taylor 	u64 mpll_tx_clk_div;
1909234fcb97SClint Taylor 	u64 vco_freq_shift;
1910234fcb97SClint Taylor 	u64 vco_freq;
1911234fcb97SClint Taylor 	u64 multiplier;
1912234fcb97SClint Taylor 	u64 mpll_multiplier;
1913234fcb97SClint Taylor 	u64 mpll_fracn_quot;
1914234fcb97SClint Taylor 	u64 mpll_fracn_rem;
1915234fcb97SClint Taylor 	u8  mpllb_ana_freq_vco;
1916234fcb97SClint Taylor 	u8  mpll_div_multiplier;
1917234fcb97SClint Taylor 
1918234fcb97SClint Taylor 	if (pixel_clock < 25175 || pixel_clock > 600000)
1919234fcb97SClint Taylor 		return -EINVAL;
1920234fcb97SClint Taylor 
1921234fcb97SClint Taylor 	datarate = ((u64)pixel_clock * 1000) * 10;
1922234fcb97SClint Taylor 	mpll_tx_clk_div = ilog2(div64_u64((u64)CLOCK_9999MHZ, (u64)datarate));
1923234fcb97SClint Taylor 	vco_freq_shift = ilog2(div64_u64((u64)CLOCK_4999MHZ * (u64)256, (u64)datarate));
1924234fcb97SClint Taylor 	vco_freq = (datarate << vco_freq_shift) >> 8;
1925234fcb97SClint Taylor 	multiplier = div64_u64((vco_freq << 28), (REFCLK_38_4_MHZ >> 4));
1926234fcb97SClint Taylor 	mpll_multiplier = 2 * (multiplier >> 32);
1927234fcb97SClint Taylor 
1928234fcb97SClint Taylor 	mpll_fracn_quot = (multiplier >> 16) & 0xFFFF;
1929234fcb97SClint Taylor 	mpll_fracn_rem  = multiplier & 0xFFFF;
1930234fcb97SClint Taylor 
1931234fcb97SClint Taylor 	mpll_div_multiplier = min_t(u8, div64_u64((vco_freq * 16 + (datarate >> 1)),
1932234fcb97SClint Taylor 						  datarate), 255);
1933234fcb97SClint Taylor 
1934234fcb97SClint Taylor 	if (vco_freq <= DATARATE_3000000000)
1935234fcb97SClint Taylor 		mpllb_ana_freq_vco = MPLLB_ANA_FREQ_VCO_3;
1936234fcb97SClint Taylor 	else if (vco_freq <= DATARATE_3500000000)
1937234fcb97SClint Taylor 		mpllb_ana_freq_vco = MPLLB_ANA_FREQ_VCO_2;
1938234fcb97SClint Taylor 	else if (vco_freq <= DATARATE_4000000000)
1939234fcb97SClint Taylor 		mpllb_ana_freq_vco = MPLLB_ANA_FREQ_VCO_1;
1940234fcb97SClint Taylor 	else
1941234fcb97SClint Taylor 		mpllb_ana_freq_vco = MPLLB_ANA_FREQ_VCO_0;
1942234fcb97SClint Taylor 
1943234fcb97SClint Taylor 	pll_state->link_bit_rate	= pixel_clock;
1944234fcb97SClint Taylor 	pll_state->clock	= pixel_clock;
1945234fcb97SClint Taylor 	pll_state->tx[0]	= 0xbe88;
1946234fcb97SClint Taylor 	pll_state->tx[1]	= 0x9800;
1947234fcb97SClint Taylor 	pll_state->tx[2]	= 0x0000;
1948234fcb97SClint Taylor 	pll_state->cmn[0]	= 0x0500;
1949234fcb97SClint Taylor 	pll_state->cmn[1]	= 0x0005;
1950234fcb97SClint Taylor 	pll_state->cmn[2]	= 0x0000;
1951234fcb97SClint Taylor 	pll_state->cmn[3]	= 0x0000;
1952234fcb97SClint Taylor 	pll_state->mpllb[0]	= (MPLL_TX_CLK_DIV(mpll_tx_clk_div) |
1953234fcb97SClint Taylor 				   MPLL_MULTIPLIER(mpll_multiplier));
1954234fcb97SClint Taylor 	pll_state->mpllb[1]	= (CAL_DAC_CODE(CAL_DAC_CODE_31) |
1955234fcb97SClint Taylor 				   WORD_CLK_DIV |
1956234fcb97SClint Taylor 				   MPLL_DIV_MULTIPLIER(mpll_div_multiplier));
1957234fcb97SClint Taylor 	pll_state->mpllb[2]	= (MPLLB_ANA_FREQ_VCO(mpllb_ana_freq_vco) |
1958234fcb97SClint Taylor 				   CP_PROP(CP_PROP_20) |
1959234fcb97SClint Taylor 				   CP_INT(CP_INT_6));
1960234fcb97SClint Taylor 	pll_state->mpllb[3]	= (V2I(V2I_2) |
1961234fcb97SClint Taylor 				   CP_PROP_GS(CP_PROP_GS_30) |
1962234fcb97SClint Taylor 				   CP_INT_GS(CP_INT_GS_28));
1963234fcb97SClint Taylor 	pll_state->mpllb[4]	= 0x0000;
1964234fcb97SClint Taylor 	pll_state->mpllb[5]	= 0x0000;
1965234fcb97SClint Taylor 	pll_state->mpllb[6]	= (C20_MPLLB_FRACEN | SSC_UP_SPREAD);
1966234fcb97SClint Taylor 	pll_state->mpllb[7]	= MPLL_FRACN_DEN;
1967234fcb97SClint Taylor 	pll_state->mpllb[8]	= mpll_fracn_quot;
1968234fcb97SClint Taylor 	pll_state->mpllb[9]	= mpll_fracn_rem;
1969234fcb97SClint Taylor 	pll_state->mpllb[10]	= HDMI_DIV(HDMI_DIV_1);
1970234fcb97SClint Taylor 
1971234fcb97SClint Taylor 	return 0;
1972234fcb97SClint Taylor }
1973234fcb97SClint Taylor 
intel_c20_phy_check_hdmi_link_rate(int clock)1974929f527aSMika Kahola static int intel_c20_phy_check_hdmi_link_rate(int clock)
1975929f527aSMika Kahola {
1976929f527aSMika Kahola 	const struct intel_c20pll_state * const *tables = mtl_c20_hdmi_tables;
1977929f527aSMika Kahola 	int i;
1978929f527aSMika Kahola 
1979929f527aSMika Kahola 	for (i = 0; tables[i]; i++) {
1980929f527aSMika Kahola 		if (clock == tables[i]->link_bit_rate)
1981929f527aSMika Kahola 			return MODE_OK;
1982929f527aSMika Kahola 	}
1983929f527aSMika Kahola 
1984234fcb97SClint Taylor 	if (clock >= 25175 && clock <= 594000)
1985234fcb97SClint Taylor 		return MODE_OK;
1986234fcb97SClint Taylor 
1987929f527aSMika Kahola 	return MODE_CLOCK_RANGE;
1988929f527aSMika Kahola }
1989929f527aSMika Kahola 
intel_cx0_phy_check_hdmi_link_rate(struct intel_hdmi * hdmi,int clock)1990929f527aSMika Kahola int intel_cx0_phy_check_hdmi_link_rate(struct intel_hdmi *hdmi, int clock)
1991929f527aSMika Kahola {
1992929f527aSMika Kahola 	struct intel_digital_port *dig_port = hdmi_to_dig_port(hdmi);
1993929f527aSMika Kahola 	struct drm_i915_private *i915 = intel_hdmi_to_i915(hdmi);
1994929f527aSMika Kahola 	enum phy phy = intel_port_to_phy(i915, dig_port->base.port);
1995929f527aSMika Kahola 
1996929f527aSMika Kahola 	if (intel_is_c10phy(i915, phy))
1997929f527aSMika Kahola 		return intel_c10_phy_check_hdmi_link_rate(clock);
1998929f527aSMika Kahola 	return intel_c20_phy_check_hdmi_link_rate(clock);
1999929f527aSMika Kahola }
2000929f527aSMika Kahola 
2001929f527aSMika Kahola static const struct intel_c20pll_state * const *
intel_c20_pll_tables_get(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2002929f527aSMika Kahola intel_c20_pll_tables_get(struct intel_crtc_state *crtc_state,
2003929f527aSMika Kahola 			 struct intel_encoder *encoder)
2004929f527aSMika Kahola {
2005929f527aSMika Kahola 	if (intel_crtc_has_dp_encoder(crtc_state))
2006929f527aSMika Kahola 		return mtl_c20_dp_tables;
2007929f527aSMika Kahola 	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
2008929f527aSMika Kahola 		return mtl_c20_hdmi_tables;
2009929f527aSMika Kahola 
2010929f527aSMika Kahola 	MISSING_CASE(encoder->type);
2011929f527aSMika Kahola 	return NULL;
2012929f527aSMika Kahola }
2013929f527aSMika Kahola 
intel_c20pll_calc_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2014929f527aSMika Kahola static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
2015929f527aSMika Kahola 				   struct intel_encoder *encoder)
2016929f527aSMika Kahola {
2017929f527aSMika Kahola 	const struct intel_c20pll_state * const *tables;
2018929f527aSMika Kahola 	int i;
2019929f527aSMika Kahola 
2020234fcb97SClint Taylor 	/* try computed C20 HDMI tables before using consolidated tables */
2021234fcb97SClint Taylor 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2022234fcb97SClint Taylor 		if (intel_c20_compute_hdmi_tmds_pll(crtc_state->port_clock,
2023234fcb97SClint Taylor 						    &crtc_state->cx0pll_state.c20) == 0)
2024234fcb97SClint Taylor 			return 0;
2025234fcb97SClint Taylor 	}
2026234fcb97SClint Taylor 
2027929f527aSMika Kahola 	tables = intel_c20_pll_tables_get(crtc_state, encoder);
2028929f527aSMika Kahola 	if (!tables)
2029929f527aSMika Kahola 		return -EINVAL;
2030929f527aSMika Kahola 
2031929f527aSMika Kahola 	for (i = 0; tables[i]; i++) {
2032929f527aSMika Kahola 		if (crtc_state->port_clock == tables[i]->link_bit_rate) {
2033929f527aSMika Kahola 			crtc_state->cx0pll_state.c20 = *tables[i];
2034929f527aSMika Kahola 			return 0;
2035929f527aSMika Kahola 		}
2036929f527aSMika Kahola 	}
2037929f527aSMika Kahola 
2038929f527aSMika Kahola 	return -EINVAL;
2039929f527aSMika Kahola }
2040929f527aSMika Kahola 
intel_cx0pll_calc_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2041929f527aSMika Kahola int intel_cx0pll_calc_state(struct intel_crtc_state *crtc_state,
2042929f527aSMika Kahola 			    struct intel_encoder *encoder)
2043929f527aSMika Kahola {
2044929f527aSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2045929f527aSMika Kahola 	enum phy phy = intel_port_to_phy(i915, encoder->port);
2046929f527aSMika Kahola 
2047929f527aSMika Kahola 	if (intel_is_c10phy(i915, phy))
2048929f527aSMika Kahola 		return intel_c10pll_calc_state(crtc_state, encoder);
2049929f527aSMika Kahola 	return intel_c20pll_calc_state(crtc_state, encoder);
2050929f527aSMika Kahola }
2051929f527aSMika Kahola 
intel_c20_use_mplla(u32 clock)205262618c7fSMika Kahola static bool intel_c20_use_mplla(u32 clock)
205362618c7fSMika Kahola {
205462618c7fSMika Kahola 	/* 10G and 20G rates use MPLLA */
205562618c7fSMika Kahola 	if (clock == 312500 || clock == 625000)
205662618c7fSMika Kahola 		return true;
205762618c7fSMika Kahola 
205862618c7fSMika Kahola 	return false;
205962618c7fSMika Kahola }
206062618c7fSMika Kahola 
intel_c20pll_readout_hw_state(struct intel_encoder * encoder,struct intel_c20pll_state * pll_state)2061929f527aSMika Kahola void intel_c20pll_readout_hw_state(struct intel_encoder *encoder,
2062929f527aSMika Kahola 				   struct intel_c20pll_state *pll_state)
2063929f527aSMika Kahola {
2064929f527aSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2065929f527aSMika Kahola 	bool cntx;
2066929f527aSMika Kahola 	intel_wakeref_t wakeref;
2067929f527aSMika Kahola 	int i;
2068929f527aSMika Kahola 
2069929f527aSMika Kahola 	wakeref = intel_cx0_phy_transaction_begin(encoder);
2070929f527aSMika Kahola 
2071929f527aSMika Kahola 	/* 1. Read current context selection */
2072929f527aSMika Kahola 	cntx = intel_cx0_read(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_VDR_CUSTOM_SERDES_RATE) & PHY_C20_CONTEXT_TOGGLE;
2073929f527aSMika Kahola 
2074929f527aSMika Kahola 	/* Read Tx configuration */
2075929f527aSMika Kahola 	for (i = 0; i < ARRAY_SIZE(pll_state->tx); i++) {
2076929f527aSMika Kahola 		if (cntx)
2077929f527aSMika Kahola 			pll_state->tx[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2078929f527aSMika Kahola 							       PHY_C20_B_TX_CNTX_CFG(i));
2079929f527aSMika Kahola 		else
2080929f527aSMika Kahola 			pll_state->tx[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2081929f527aSMika Kahola 							       PHY_C20_A_TX_CNTX_CFG(i));
2082929f527aSMika Kahola 	}
2083929f527aSMika Kahola 
2084929f527aSMika Kahola 	/* Read common configuration */
2085929f527aSMika Kahola 	for (i = 0; i < ARRAY_SIZE(pll_state->cmn); i++) {
2086929f527aSMika Kahola 		if (cntx)
2087929f527aSMika Kahola 			pll_state->cmn[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2088929f527aSMika Kahola 								PHY_C20_B_CMN_CNTX_CFG(i));
2089929f527aSMika Kahola 		else
2090929f527aSMika Kahola 			pll_state->cmn[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2091929f527aSMika Kahola 								PHY_C20_A_CMN_CNTX_CFG(i));
2092929f527aSMika Kahola 	}
2093929f527aSMika Kahola 
2094929f527aSMika Kahola 	if (pll_state->tx[0] & C20_PHY_USE_MPLLB) {
2095929f527aSMika Kahola 		/* MPLLB configuration */
2096929f527aSMika Kahola 		for (i = 0; i < ARRAY_SIZE(pll_state->mpllb); i++) {
2097929f527aSMika Kahola 			if (cntx)
2098929f527aSMika Kahola 				pll_state->mpllb[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2099929f527aSMika Kahola 									  PHY_C20_B_MPLLB_CNTX_CFG(i));
2100929f527aSMika Kahola 			else
2101929f527aSMika Kahola 				pll_state->mpllb[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2102929f527aSMika Kahola 									  PHY_C20_A_MPLLB_CNTX_CFG(i));
2103929f527aSMika Kahola 		}
2104929f527aSMika Kahola 	} else {
2105929f527aSMika Kahola 		/* MPLLA configuration */
2106929f527aSMika Kahola 		for (i = 0; i < ARRAY_SIZE(pll_state->mplla); i++) {
2107929f527aSMika Kahola 			if (cntx)
2108929f527aSMika Kahola 				pll_state->mplla[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2109929f527aSMika Kahola 									  PHY_C20_B_MPLLA_CNTX_CFG(i));
2110929f527aSMika Kahola 			else
2111929f527aSMika Kahola 				pll_state->mplla[i] = intel_c20_sram_read(i915, encoder->port, INTEL_CX0_LANE0,
2112929f527aSMika Kahola 									  PHY_C20_A_MPLLA_CNTX_CFG(i));
2113929f527aSMika Kahola 		}
2114929f527aSMika Kahola 	}
2115929f527aSMika Kahola 
2116929f527aSMika Kahola 	intel_cx0_phy_transaction_end(encoder, wakeref);
2117929f527aSMika Kahola }
2118929f527aSMika Kahola 
intel_c20pll_dump_hw_state(struct drm_i915_private * i915,const struct intel_c20pll_state * hw_state)2119f968a253SMika Kahola void intel_c20pll_dump_hw_state(struct drm_i915_private *i915,
2120f968a253SMika Kahola 				const struct intel_c20pll_state *hw_state)
2121f968a253SMika Kahola {
2122f968a253SMika Kahola 	int i;
2123f968a253SMika Kahola 
2124f968a253SMika Kahola 	drm_dbg_kms(&i915->drm, "c20pll_hw_state:\n");
2125f968a253SMika Kahola 	drm_dbg_kms(&i915->drm, "tx[0] = 0x%.4x, tx[1] = 0x%.4x, tx[2] = 0x%.4x\n",
2126f968a253SMika Kahola 		    hw_state->tx[0], hw_state->tx[1], hw_state->tx[2]);
2127f968a253SMika Kahola 	drm_dbg_kms(&i915->drm, "cmn[0] = 0x%.4x, cmn[1] = 0x%.4x, cmn[2] = 0x%.4x, cmn[3] = 0x%.4x\n",
2128f968a253SMika Kahola 		    hw_state->cmn[0], hw_state->cmn[1], hw_state->cmn[2], hw_state->cmn[3]);
2129f968a253SMika Kahola 
2130f968a253SMika Kahola 	if (intel_c20_use_mplla(hw_state->clock)) {
2131f968a253SMika Kahola 		for (i = 0; i < ARRAY_SIZE(hw_state->mplla); i++)
2132f968a253SMika Kahola 			drm_dbg_kms(&i915->drm, "mplla[%d] = 0x%.4x\n", i, hw_state->mplla[i]);
2133f968a253SMika Kahola 	} else {
2134f968a253SMika Kahola 		for (i = 0; i < ARRAY_SIZE(hw_state->mpllb); i++)
2135f968a253SMika Kahola 			drm_dbg_kms(&i915->drm, "mpllb[%d] = 0x%.4x\n", i, hw_state->mpllb[i]);
2136f968a253SMika Kahola 	}
2137f968a253SMika Kahola }
2138f968a253SMika Kahola 
intel_c20_get_dp_rate(u32 clock)213962618c7fSMika Kahola static u8 intel_c20_get_dp_rate(u32 clock)
214062618c7fSMika Kahola {
214162618c7fSMika Kahola 	switch (clock) {
214262618c7fSMika Kahola 	case 162000: /* 1.62 Gbps DP1.4 */
214362618c7fSMika Kahola 		return 0;
214462618c7fSMika Kahola 	case 270000: /* 2.7 Gbps DP1.4 */
214562618c7fSMika Kahola 		return 1;
214662618c7fSMika Kahola 	case 540000: /* 5.4 Gbps DP 1.4 */
214762618c7fSMika Kahola 		return 2;
214862618c7fSMika Kahola 	case 810000: /* 8.1 Gbps DP1.4 */
214962618c7fSMika Kahola 		return 3;
215062618c7fSMika Kahola 	case 216000: /* 2.16 Gbps eDP */
215162618c7fSMika Kahola 		return 4;
215262618c7fSMika Kahola 	case 243000: /* 2.43 Gbps eDP */
215362618c7fSMika Kahola 		return 5;
215462618c7fSMika Kahola 	case 324000: /* 3.24 Gbps eDP */
215562618c7fSMika Kahola 		return 6;
215662618c7fSMika Kahola 	case 432000: /* 4.32 Gbps eDP */
215762618c7fSMika Kahola 		return 7;
215862618c7fSMika Kahola 	case 312500: /* 10 Gbps DP2.0 */
215962618c7fSMika Kahola 		return 8;
216062618c7fSMika Kahola 	case 421875: /* 13.5 Gbps DP2.0 */
216162618c7fSMika Kahola 		return 9;
216262618c7fSMika Kahola 	case 625000: /* 20 Gbps DP2.0*/
216362618c7fSMika Kahola 		return 10;
216462618c7fSMika Kahola 	case 648000: /* 6.48 Gbps eDP*/
216562618c7fSMika Kahola 		return 11;
216662618c7fSMika Kahola 	case 675000: /* 6.75 Gbps eDP*/
216762618c7fSMika Kahola 		return 12;
216862618c7fSMika Kahola 	default:
216962618c7fSMika Kahola 		MISSING_CASE(clock);
217062618c7fSMika Kahola 		return 0;
217162618c7fSMika Kahola 	}
217262618c7fSMika Kahola }
217362618c7fSMika Kahola 
intel_c20_get_hdmi_rate(u32 clock)217462618c7fSMika Kahola static u8 intel_c20_get_hdmi_rate(u32 clock)
217562618c7fSMika Kahola {
2176234fcb97SClint Taylor 	if (clock >= 25175 && clock <= 600000)
217762618c7fSMika Kahola 		return 0;
2178234fcb97SClint Taylor 
2179234fcb97SClint Taylor 	switch (clock) {
218062618c7fSMika Kahola 	case 166670: /* 3 Gbps */
218162618c7fSMika Kahola 	case 333330: /* 6 Gbps */
218262618c7fSMika Kahola 	case 666670: /* 12 Gbps */
218362618c7fSMika Kahola 		return 1;
218462618c7fSMika Kahola 	case 444440: /* 8 Gbps */
218562618c7fSMika Kahola 		return 2;
218662618c7fSMika Kahola 	case 555560: /* 10 Gbps */
218762618c7fSMika Kahola 		return 3;
218862618c7fSMika Kahola 	default:
218962618c7fSMika Kahola 		MISSING_CASE(clock);
219062618c7fSMika Kahola 		return 0;
219162618c7fSMika Kahola 	}
219262618c7fSMika Kahola }
219362618c7fSMika Kahola 
is_dp2(u32 clock)219462618c7fSMika Kahola static bool is_dp2(u32 clock)
219562618c7fSMika Kahola {
219662618c7fSMika Kahola 	/* DP2.0 clock rates */
219762618c7fSMika Kahola 	if (clock == 312500 || clock == 421875 || clock  == 625000)
219862618c7fSMika Kahola 		return true;
219962618c7fSMika Kahola 
220062618c7fSMika Kahola 	return false;
220162618c7fSMika Kahola }
220262618c7fSMika Kahola 
is_hdmi_frl(u32 clock)220362618c7fSMika Kahola static bool is_hdmi_frl(u32 clock)
220462618c7fSMika Kahola {
220562618c7fSMika Kahola 	switch (clock) {
220662618c7fSMika Kahola 	case 166670: /* 3 Gbps */
220762618c7fSMika Kahola 	case 333330: /* 6 Gbps */
220862618c7fSMika Kahola 	case 444440: /* 8 Gbps */
220962618c7fSMika Kahola 	case 555560: /* 10 Gbps */
221062618c7fSMika Kahola 	case 666670: /* 12 Gbps */
221162618c7fSMika Kahola 		return true;
221262618c7fSMika Kahola 	default:
221362618c7fSMika Kahola 		return false;
221462618c7fSMika Kahola 	}
221562618c7fSMika Kahola }
221662618c7fSMika Kahola 
intel_c20_protocol_switch_valid(struct intel_encoder * encoder)221762618c7fSMika Kahola static bool intel_c20_protocol_switch_valid(struct intel_encoder *encoder)
221862618c7fSMika Kahola {
221962618c7fSMika Kahola 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
222062618c7fSMika Kahola 
222162618c7fSMika Kahola 	/* banks should not be cleared for DPALT/USB4/TBT modes */
222262618c7fSMika Kahola 	/* TODO: optimize re-calibration in legacy mode */
222362618c7fSMika Kahola 	return intel_tc_port_in_legacy_mode(intel_dig_port);
222462618c7fSMika Kahola }
222562618c7fSMika Kahola 
intel_get_c20_custom_width(u32 clock,bool dp)222662618c7fSMika Kahola static int intel_get_c20_custom_width(u32 clock, bool dp)
222762618c7fSMika Kahola {
222862618c7fSMika Kahola 	if (dp && is_dp2(clock))
222962618c7fSMika Kahola 		return 2;
223062618c7fSMika Kahola 	else if (is_hdmi_frl(clock))
223162618c7fSMika Kahola 		return 1;
223262618c7fSMika Kahola 	else
223362618c7fSMika Kahola 		return 0;
223462618c7fSMika Kahola }
223562618c7fSMika Kahola 
intel_c20_pll_program(struct drm_i915_private * i915,const struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)223662618c7fSMika Kahola static void intel_c20_pll_program(struct drm_i915_private *i915,
223762618c7fSMika Kahola 				  const struct intel_crtc_state *crtc_state,
223862618c7fSMika Kahola 				  struct intel_encoder *encoder)
223962618c7fSMika Kahola {
224062618c7fSMika Kahola 	const struct intel_c20pll_state *pll_state = &crtc_state->cx0pll_state.c20;
224162618c7fSMika Kahola 	bool dp = false;
224262618c7fSMika Kahola 	int lane = crtc_state->lane_count > 2 ? INTEL_CX0_BOTH_LANES : INTEL_CX0_LANE0;
224362618c7fSMika Kahola 	bool cntx;
224462618c7fSMika Kahola 	int i;
224562618c7fSMika Kahola 
224662618c7fSMika Kahola 	if (intel_crtc_has_dp_encoder(crtc_state))
224762618c7fSMika Kahola 		dp = true;
224862618c7fSMika Kahola 
224962618c7fSMika Kahola 	/* 1. Read current context selection */
225062618c7fSMika Kahola 	cntx = intel_cx0_read(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_VDR_CUSTOM_SERDES_RATE) & BIT(0);
225162618c7fSMika Kahola 
225262618c7fSMika Kahola 	/*
225362618c7fSMika Kahola 	 * 2. If there is a protocol switch from HDMI to DP or vice versa, clear
225462618c7fSMika Kahola 	 * the lane #0 MPLLB CAL_DONE_BANK DP2.0 10G and 20G rates enable MPLLA.
225562618c7fSMika Kahola 	 * Protocol switch is only applicable for MPLLA
225662618c7fSMika Kahola 	 */
225762618c7fSMika Kahola 	if (intel_c20_protocol_switch_valid(encoder)) {
225862618c7fSMika Kahola 		for (i = 0; i < 4; i++)
225962618c7fSMika Kahola 			intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0, RAWLANEAONX_DIG_TX_MPLLB_CAL_DONE_BANK(i), 0);
226062618c7fSMika Kahola 		usleep_range(4000, 4100);
226162618c7fSMika Kahola 	}
226262618c7fSMika Kahola 
226362618c7fSMika Kahola 	/* 3. Write SRAM configuration context. If A in use, write configuration to B context */
226462618c7fSMika Kahola 	/* 3.1 Tx configuration */
226562618c7fSMika Kahola 	for (i = 0; i < ARRAY_SIZE(pll_state->tx); i++) {
226662618c7fSMika Kahola 		if (cntx)
226762618c7fSMika Kahola 			intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_A_TX_CNTX_CFG(i), pll_state->tx[i]);
226862618c7fSMika Kahola 		else
226962618c7fSMika Kahola 			intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_B_TX_CNTX_CFG(i), pll_state->tx[i]);
227062618c7fSMika Kahola 	}
227162618c7fSMika Kahola 
227262618c7fSMika Kahola 	/* 3.2 common configuration */
227362618c7fSMika Kahola 	for (i = 0; i < ARRAY_SIZE(pll_state->cmn); i++) {
227462618c7fSMika Kahola 		if (cntx)
227562618c7fSMika Kahola 			intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_A_CMN_CNTX_CFG(i), pll_state->cmn[i]);
227662618c7fSMika Kahola 		else
227762618c7fSMika Kahola 			intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0, PHY_C20_B_CMN_CNTX_CFG(i), pll_state->cmn[i]);
227862618c7fSMika Kahola 	}
227962618c7fSMika Kahola 
228062618c7fSMika Kahola 	/* 3.3 mpllb or mplla configuration */
228162618c7fSMika Kahola 	if (intel_c20_use_mplla(pll_state->clock)) {
228262618c7fSMika Kahola 		for (i = 0; i < ARRAY_SIZE(pll_state->mplla); i++) {
228362618c7fSMika Kahola 			if (cntx)
228462618c7fSMika Kahola 				intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0,
228562618c7fSMika Kahola 						     PHY_C20_A_MPLLA_CNTX_CFG(i),
228662618c7fSMika Kahola 						     pll_state->mplla[i]);
228762618c7fSMika Kahola 			else
228862618c7fSMika Kahola 				intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0,
228962618c7fSMika Kahola 						     PHY_C20_B_MPLLA_CNTX_CFG(i),
229062618c7fSMika Kahola 						     pll_state->mplla[i]);
229162618c7fSMika Kahola 		}
229262618c7fSMika Kahola 	} else {
229362618c7fSMika Kahola 		for (i = 0; i < ARRAY_SIZE(pll_state->mpllb); i++) {
229462618c7fSMika Kahola 			if (cntx)
229562618c7fSMika Kahola 				intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0,
229662618c7fSMika Kahola 						     PHY_C20_A_MPLLB_CNTX_CFG(i),
229762618c7fSMika Kahola 						     pll_state->mpllb[i]);
229862618c7fSMika Kahola 			else
229962618c7fSMika Kahola 				intel_c20_sram_write(i915, encoder->port, INTEL_CX0_LANE0,
230062618c7fSMika Kahola 						     PHY_C20_B_MPLLB_CNTX_CFG(i),
230162618c7fSMika Kahola 						     pll_state->mpllb[i]);
230262618c7fSMika Kahola 		}
230362618c7fSMika Kahola 	}
230462618c7fSMika Kahola 
230562618c7fSMika Kahola 	/* 4. Program custom width to match the link protocol */
230662618c7fSMika Kahola 	intel_cx0_rmw(i915, encoder->port, lane, PHY_C20_VDR_CUSTOM_WIDTH,
230762618c7fSMika Kahola 		      PHY_C20_CUSTOM_WIDTH_MASK,
230862618c7fSMika Kahola 		      PHY_C20_CUSTOM_WIDTH(intel_get_c20_custom_width(pll_state->clock, dp)),
230962618c7fSMika Kahola 		      MB_WRITE_COMMITTED);
231062618c7fSMika Kahola 
231162618c7fSMika Kahola 	/* 5. For DP or 6. For HDMI */
231262618c7fSMika Kahola 	if (dp) {
231362618c7fSMika Kahola 		intel_cx0_rmw(i915, encoder->port, lane, PHY_C20_VDR_CUSTOM_SERDES_RATE,
231462618c7fSMika Kahola 			      BIT(6) | PHY_C20_CUSTOM_SERDES_MASK,
231562618c7fSMika Kahola 			      BIT(6) | PHY_C20_CUSTOM_SERDES(intel_c20_get_dp_rate(pll_state->clock)),
231662618c7fSMika Kahola 			      MB_WRITE_COMMITTED);
231762618c7fSMika Kahola 	} else {
231862618c7fSMika Kahola 		intel_cx0_rmw(i915, encoder->port, lane, PHY_C20_VDR_CUSTOM_SERDES_RATE,
231962618c7fSMika Kahola 			      BIT(7) | PHY_C20_CUSTOM_SERDES_MASK,
232062618c7fSMika Kahola 			      is_hdmi_frl(pll_state->clock) ? BIT(7) : 0,
232162618c7fSMika Kahola 			      MB_WRITE_COMMITTED);
232262618c7fSMika Kahola 
232362618c7fSMika Kahola 		intel_cx0_write(i915, encoder->port, INTEL_CX0_BOTH_LANES, PHY_C20_VDR_HDMI_RATE,
232462618c7fSMika Kahola 				intel_c20_get_hdmi_rate(pll_state->clock),
232562618c7fSMika Kahola 				MB_WRITE_COMMITTED);
232662618c7fSMika Kahola 	}
232762618c7fSMika Kahola 
232862618c7fSMika Kahola 	/*
232962618c7fSMika Kahola 	 * 7. Write Vendor specific registers to toggle context setting to load
233062618c7fSMika Kahola 	 * the updated programming toggle context bit
233162618c7fSMika Kahola 	 */
233262618c7fSMika Kahola 	intel_cx0_rmw(i915, encoder->port, lane, PHY_C20_VDR_CUSTOM_SERDES_RATE,
233362618c7fSMika Kahola 		      BIT(0), cntx ? 0 : 1, MB_WRITE_COMMITTED);
233462618c7fSMika Kahola }
233562618c7fSMika Kahola 
intel_c10pll_calc_port_clock(struct intel_encoder * encoder,const struct intel_c10pll_state * pll_state)233651390cc0SRadhakrishna Sripada int intel_c10pll_calc_port_clock(struct intel_encoder *encoder,
233751390cc0SRadhakrishna Sripada 				 const struct intel_c10pll_state *pll_state)
233851390cc0SRadhakrishna Sripada {
233951390cc0SRadhakrishna Sripada 	unsigned int frac_quot = 0, frac_rem = 0, frac_den = 1;
23405836bc5fSRadhakrishna Sripada 	unsigned int multiplier, tx_clk_div, hdmi_div, refclk = 38400;
23415836bc5fSRadhakrishna Sripada 	int tmpclk = 0;
234251390cc0SRadhakrishna Sripada 
234351390cc0SRadhakrishna Sripada 	if (pll_state->pll[0] & C10_PLL0_FRACEN) {
234451390cc0SRadhakrishna Sripada 		frac_quot = pll_state->pll[12] << 8 | pll_state->pll[11];
234551390cc0SRadhakrishna Sripada 		frac_rem =  pll_state->pll[14] << 8 | pll_state->pll[13];
234651390cc0SRadhakrishna Sripada 		frac_den =  pll_state->pll[10] << 8 | pll_state->pll[9];
234751390cc0SRadhakrishna Sripada 	}
234851390cc0SRadhakrishna Sripada 
234951390cc0SRadhakrishna Sripada 	multiplier = (REG_FIELD_GET8(C10_PLL3_MULTIPLIERH_MASK, pll_state->pll[3]) << 8 |
235051390cc0SRadhakrishna Sripada 		      pll_state->pll[2]) / 2 + 16;
235151390cc0SRadhakrishna Sripada 
235251390cc0SRadhakrishna Sripada 	tx_clk_div = REG_FIELD_GET8(C10_PLL15_TXCLKDIV_MASK, pll_state->pll[15]);
23535836bc5fSRadhakrishna Sripada 	hdmi_div = REG_FIELD_GET8(C10_PLL15_HDMIDIV_MASK, pll_state->pll[15]);
235451390cc0SRadhakrishna Sripada 
23555836bc5fSRadhakrishna Sripada 	tmpclk = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, (multiplier << 16) + frac_quot) +
235651390cc0SRadhakrishna Sripada 				     DIV_ROUND_CLOSEST(refclk * frac_rem, frac_den),
235751390cc0SRadhakrishna Sripada 				     10 << (tx_clk_div + 16));
23585836bc5fSRadhakrishna Sripada 	tmpclk *= (hdmi_div ? 2 : 1);
23595836bc5fSRadhakrishna Sripada 
23605836bc5fSRadhakrishna Sripada 	return tmpclk;
236151390cc0SRadhakrishna Sripada }
236251390cc0SRadhakrishna Sripada 
intel_c20pll_calc_port_clock(struct intel_encoder * encoder,const struct intel_c20pll_state * pll_state)2363f1f9e627SMika Kahola int intel_c20pll_calc_port_clock(struct intel_encoder *encoder,
2364f1f9e627SMika Kahola 				 const struct intel_c20pll_state *pll_state)
2365f1f9e627SMika Kahola {
2366f1f9e627SMika Kahola 	unsigned int frac, frac_en, frac_quot, frac_rem, frac_den;
2367f1f9e627SMika Kahola 	unsigned int multiplier, refclk = 38400;
2368f1f9e627SMika Kahola 	unsigned int tx_clk_div;
2369f1f9e627SMika Kahola 	unsigned int ref_clk_mpllb_div;
2370f1f9e627SMika Kahola 	unsigned int fb_clk_div4_en;
2371f1f9e627SMika Kahola 	unsigned int ref, vco;
2372f1f9e627SMika Kahola 	unsigned int tx_rate_mult;
2373f1f9e627SMika Kahola 	unsigned int tx_rate = REG_FIELD_GET(C20_PHY_TX_RATE, pll_state->tx[0]);
2374f1f9e627SMika Kahola 
2375f1f9e627SMika Kahola 	if (pll_state->tx[0] & C20_PHY_USE_MPLLB) {
2376f1f9e627SMika Kahola 		tx_rate_mult = 1;
2377f1f9e627SMika Kahola 		frac_en = REG_FIELD_GET(C20_MPLLB_FRACEN, pll_state->mpllb[6]);
2378f1f9e627SMika Kahola 		frac_quot = pll_state->mpllb[8];
2379f1f9e627SMika Kahola 		frac_rem =  pll_state->mpllb[9];
2380f1f9e627SMika Kahola 		frac_den =  pll_state->mpllb[7];
2381f1f9e627SMika Kahola 		multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state->mpllb[0]);
2382f1f9e627SMika Kahola 		tx_clk_div = REG_FIELD_GET(C20_MPLLB_TX_CLK_DIV_MASK, pll_state->mpllb[0]);
2383f1f9e627SMika Kahola 		ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK, pll_state->mpllb[6]);
2384f1f9e627SMika Kahola 		fb_clk_div4_en = 0;
2385f1f9e627SMika Kahola 	} else {
2386f1f9e627SMika Kahola 		tx_rate_mult = 2;
2387f1f9e627SMika Kahola 		frac_en = REG_FIELD_GET(C20_MPLLA_FRACEN, pll_state->mplla[6]);
2388f1f9e627SMika Kahola 		frac_quot = pll_state->mplla[8];
2389f1f9e627SMika Kahola 		frac_rem =  pll_state->mplla[9];
2390f1f9e627SMika Kahola 		frac_den =  pll_state->mplla[7];
2391f1f9e627SMika Kahola 		multiplier = REG_FIELD_GET(C20_MULTIPLIER_MASK, pll_state->mplla[0]);
2392f1f9e627SMika Kahola 		tx_clk_div = REG_FIELD_GET(C20_MPLLA_TX_CLK_DIV_MASK, pll_state->mplla[1]);
2393f1f9e627SMika Kahola 		ref_clk_mpllb_div = REG_FIELD_GET(C20_REF_CLK_MPLLB_DIV_MASK, pll_state->mplla[6]);
2394f1f9e627SMika Kahola 		fb_clk_div4_en = REG_FIELD_GET(C20_FB_CLK_DIV4_EN, pll_state->mplla[0]);
2395f1f9e627SMika Kahola 	}
2396f1f9e627SMika Kahola 
2397f1f9e627SMika Kahola 	if (frac_en)
2398f1f9e627SMika Kahola 		frac = frac_quot + DIV_ROUND_CLOSEST(frac_rem, frac_den);
2399f1f9e627SMika Kahola 	else
2400f1f9e627SMika Kahola 		frac = 0;
2401f1f9e627SMika Kahola 
2402f1f9e627SMika Kahola 	ref = DIV_ROUND_CLOSEST(refclk * (1 << (1 + fb_clk_div4_en)), 1 << ref_clk_mpllb_div);
2403f1f9e627SMika Kahola 	vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(ref, (multiplier << (17 - 2)) + frac) >> 17, 10);
2404f1f9e627SMika Kahola 
2405f1f9e627SMika Kahola 	return vco << tx_rate_mult >> tx_clk_div >> tx_rate;
2406f1f9e627SMika Kahola }
2407f1f9e627SMika Kahola 
intel_program_port_clock_ctl(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,bool lane_reversal)240851390cc0SRadhakrishna Sripada static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
240951390cc0SRadhakrishna Sripada 					 const struct intel_crtc_state *crtc_state,
241051390cc0SRadhakrishna Sripada 					 bool lane_reversal)
241151390cc0SRadhakrishna Sripada {
241251390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
241351390cc0SRadhakrishna Sripada 	u32 val = 0;
241451390cc0SRadhakrishna Sripada 
241551390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL1(encoder->port), XELPDP_PORT_REVERSAL,
241651390cc0SRadhakrishna Sripada 		     lane_reversal ? XELPDP_PORT_REVERSAL : 0);
241751390cc0SRadhakrishna Sripada 
241851390cc0SRadhakrishna Sripada 	if (lane_reversal)
241951390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE1_PHY_CLOCK_SELECT;
242051390cc0SRadhakrishna Sripada 
242151390cc0SRadhakrishna Sripada 	val |= XELPDP_FORWARD_CLOCK_UNGATE;
242262618c7fSMika Kahola 
2423*6472e321SImre Deak 	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
2424*6472e321SImre Deak 	    is_hdmi_frl(crtc_state->port_clock))
242562618c7fSMika Kahola 		val |= XELPDP_DDI_CLOCK_SELECT(XELPDP_DDI_CLOCK_SELECT_DIV18CLK);
242662618c7fSMika Kahola 	else
242751390cc0SRadhakrishna Sripada 		val |= XELPDP_DDI_CLOCK_SELECT(XELPDP_DDI_CLOCK_SELECT_MAXPCLK);
242851390cc0SRadhakrishna Sripada 
242951390cc0SRadhakrishna Sripada 	/* TODO: HDMI FRL */
2430237e7be0SMika Kahola 	/* DP2.0 10G and 20G rates enable MPLLA*/
2431237e7be0SMika Kahola 	if (crtc_state->port_clock == 1000000 || crtc_state->port_clock == 2000000)
2432237e7be0SMika Kahola 		val |= crtc_state->cx0pll_state.ssc_enabled ? XELPDP_SSC_ENABLE_PLLA : 0;
2433237e7be0SMika Kahola 	else
243451390cc0SRadhakrishna Sripada 		val |= crtc_state->cx0pll_state.ssc_enabled ? XELPDP_SSC_ENABLE_PLLB : 0;
243551390cc0SRadhakrishna Sripada 
243651390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
2437ea8af87aSMika Kahola 		     XELPDP_LANE1_PHY_CLOCK_SELECT | XELPDP_FORWARD_CLOCK_UNGATE |
24387e8d87e2SRadhakrishna Sripada 		     XELPDP_DDI_CLOCK_SELECT_MASK | XELPDP_SSC_ENABLE_PLLA |
24397e8d87e2SRadhakrishna Sripada 		     XELPDP_SSC_ENABLE_PLLB, val);
244051390cc0SRadhakrishna Sripada }
244151390cc0SRadhakrishna Sripada 
intel_cx0_get_powerdown_update(u8 lane_mask)244251390cc0SRadhakrishna Sripada static u32 intel_cx0_get_powerdown_update(u8 lane_mask)
244351390cc0SRadhakrishna Sripada {
244451390cc0SRadhakrishna Sripada 	u32 val = 0;
244551390cc0SRadhakrishna Sripada 	int lane = 0;
244651390cc0SRadhakrishna Sripada 
244751390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
244851390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_POWERDOWN_UPDATE(lane);
244951390cc0SRadhakrishna Sripada 
245051390cc0SRadhakrishna Sripada 	return val;
245151390cc0SRadhakrishna Sripada }
245251390cc0SRadhakrishna Sripada 
intel_cx0_get_powerdown_state(u8 lane_mask,u8 state)245351390cc0SRadhakrishna Sripada static u32 intel_cx0_get_powerdown_state(u8 lane_mask, u8 state)
245451390cc0SRadhakrishna Sripada {
245551390cc0SRadhakrishna Sripada 	u32 val = 0;
245651390cc0SRadhakrishna Sripada 	int lane = 0;
245751390cc0SRadhakrishna Sripada 
245851390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
245951390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_POWERDOWN_NEW_STATE(lane, state);
246051390cc0SRadhakrishna Sripada 
246151390cc0SRadhakrishna Sripada 	return val;
246251390cc0SRadhakrishna Sripada }
246351390cc0SRadhakrishna Sripada 
intel_cx0_powerdown_change_sequence(struct drm_i915_private * i915,enum port port,u8 lane_mask,u8 state)246451390cc0SRadhakrishna Sripada static void intel_cx0_powerdown_change_sequence(struct drm_i915_private *i915,
246551390cc0SRadhakrishna Sripada 						enum port port,
246651390cc0SRadhakrishna Sripada 						u8 lane_mask, u8 state)
246751390cc0SRadhakrishna Sripada {
246851390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
246951390cc0SRadhakrishna Sripada 	int lane;
247051390cc0SRadhakrishna Sripada 
247151390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port),
247251390cc0SRadhakrishna Sripada 		     intel_cx0_get_powerdown_state(INTEL_CX0_BOTH_LANES, XELPDP_LANE_POWERDOWN_NEW_STATE_MASK),
247351390cc0SRadhakrishna Sripada 		     intel_cx0_get_powerdown_state(lane_mask, state));
247451390cc0SRadhakrishna Sripada 
247551390cc0SRadhakrishna Sripada 	/* Wait for pending transactions.*/
247651390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
247751390cc0SRadhakrishna Sripada 		if (intel_de_wait_for_clear(i915, XELPDP_PORT_M2P_MSGBUS_CTL(port, lane),
247851390cc0SRadhakrishna Sripada 					    XELPDP_PORT_M2P_TRANSACTION_PENDING,
247951390cc0SRadhakrishna Sripada 					    XELPDP_MSGBUS_TIMEOUT_SLOW)) {
248051390cc0SRadhakrishna Sripada 			drm_dbg_kms(&i915->drm,
248151390cc0SRadhakrishna Sripada 				    "PHY %c Timeout waiting for previous transaction to complete. Reset the bus.\n",
248251390cc0SRadhakrishna Sripada 				    phy_name(phy));
248351390cc0SRadhakrishna Sripada 			intel_cx0_bus_reset(i915, port, lane);
248451390cc0SRadhakrishna Sripada 		}
248551390cc0SRadhakrishna Sripada 
248651390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port),
248751390cc0SRadhakrishna Sripada 		     intel_cx0_get_powerdown_update(INTEL_CX0_BOTH_LANES),
248851390cc0SRadhakrishna Sripada 		     intel_cx0_get_powerdown_update(lane_mask));
248951390cc0SRadhakrishna Sripada 
249051390cc0SRadhakrishna Sripada 	/* Update Timeout Value */
249151390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_BUF_CTL2(port),
249251390cc0SRadhakrishna Sripada 					 intel_cx0_get_powerdown_update(lane_mask), 0,
249351390cc0SRadhakrishna Sripada 					 XELPDP_PORT_POWERDOWN_UPDATE_TIMEOUT_US, 0, NULL))
249451390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "PHY %c failed to bring out of Lane reset after %dus.\n",
249551390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PORT_RESET_START_TIMEOUT_US);
249651390cc0SRadhakrishna Sripada }
249751390cc0SRadhakrishna Sripada 
intel_cx0_setup_powerdown(struct drm_i915_private * i915,enum port port)249851390cc0SRadhakrishna Sripada static void intel_cx0_setup_powerdown(struct drm_i915_private *i915, enum port port)
249951390cc0SRadhakrishna Sripada {
250051390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port),
250151390cc0SRadhakrishna Sripada 		     XELPDP_POWER_STATE_READY_MASK,
250251390cc0SRadhakrishna Sripada 		     XELPDP_POWER_STATE_READY(CX0_P2_STATE_READY));
250351390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL3(port),
250451390cc0SRadhakrishna Sripada 		     XELPDP_POWER_STATE_ACTIVE_MASK |
250551390cc0SRadhakrishna Sripada 		     XELPDP_PLL_LANE_STAGGERING_DELAY_MASK,
250651390cc0SRadhakrishna Sripada 		     XELPDP_POWER_STATE_ACTIVE(CX0_P0_STATE_ACTIVE) |
250751390cc0SRadhakrishna Sripada 		     XELPDP_PLL_LANE_STAGGERING_DELAY(0));
250851390cc0SRadhakrishna Sripada }
250951390cc0SRadhakrishna Sripada 
intel_cx0_get_pclk_refclk_request(u8 lane_mask)251051390cc0SRadhakrishna Sripada static u32 intel_cx0_get_pclk_refclk_request(u8 lane_mask)
251151390cc0SRadhakrishna Sripada {
251251390cc0SRadhakrishna Sripada 	u32 val = 0;
251351390cc0SRadhakrishna Sripada 	int lane = 0;
251451390cc0SRadhakrishna Sripada 
251551390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
251651390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_PCLK_REFCLK_REQUEST(lane);
251751390cc0SRadhakrishna Sripada 
251851390cc0SRadhakrishna Sripada 	return val;
251951390cc0SRadhakrishna Sripada }
252051390cc0SRadhakrishna Sripada 
intel_cx0_get_pclk_refclk_ack(u8 lane_mask)252151390cc0SRadhakrishna Sripada static u32 intel_cx0_get_pclk_refclk_ack(u8 lane_mask)
252251390cc0SRadhakrishna Sripada {
252351390cc0SRadhakrishna Sripada 	u32 val = 0;
252451390cc0SRadhakrishna Sripada 	int lane = 0;
252551390cc0SRadhakrishna Sripada 
252651390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
252751390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_PCLK_REFCLK_ACK(lane);
252851390cc0SRadhakrishna Sripada 
252951390cc0SRadhakrishna Sripada 	return val;
253051390cc0SRadhakrishna Sripada }
253151390cc0SRadhakrishna Sripada 
intel_cx0_phy_lane_reset(struct drm_i915_private * i915,struct intel_encoder * encoder,bool lane_reversal)2532619a06dbSMika Kahola static void intel_cx0_phy_lane_reset(struct drm_i915_private *i915,
2533619a06dbSMika Kahola 				     struct intel_encoder *encoder,
253451390cc0SRadhakrishna Sripada 				     bool lane_reversal)
253551390cc0SRadhakrishna Sripada {
2536619a06dbSMika Kahola 	enum port port = encoder->port;
253751390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, port);
2538619a06dbSMika Kahola 	bool both_lanes =  intel_tc_port_fia_max_lane_count(enc_to_dig_port(encoder)) > 2;
253951390cc0SRadhakrishna Sripada 	u8 lane_mask = lane_reversal ? INTEL_CX0_LANE1 :
254051390cc0SRadhakrishna Sripada 				  INTEL_CX0_LANE0;
2541619a06dbSMika Kahola 	u32 lane_pipe_reset = both_lanes ?
2542619a06dbSMika Kahola 			      XELPDP_LANE_PIPE_RESET(0) |
2543619a06dbSMika Kahola 			      XELPDP_LANE_PIPE_RESET(1) :
2544619a06dbSMika Kahola 			      XELPDP_LANE_PIPE_RESET(0);
2545619a06dbSMika Kahola 	u32 lane_phy_current_status = both_lanes ?
2546619a06dbSMika Kahola 				      XELPDP_LANE_PHY_CURRENT_STATUS(0) |
2547619a06dbSMika Kahola 				      XELPDP_LANE_PHY_CURRENT_STATUS(1) :
2548619a06dbSMika Kahola 				      XELPDP_LANE_PHY_CURRENT_STATUS(0);
254951390cc0SRadhakrishna Sripada 
255051390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_BUF_CTL1(port),
255151390cc0SRadhakrishna Sripada 					 XELPDP_PORT_BUF_SOC_PHY_READY,
255251390cc0SRadhakrishna Sripada 					 XELPDP_PORT_BUF_SOC_PHY_READY,
255351390cc0SRadhakrishna Sripada 					 XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US, 0, NULL))
255451390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "PHY %c failed to bring out of SOC reset after %dus.\n",
255551390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US);
255651390cc0SRadhakrishna Sripada 
25575e4c16feSKhaled Almahallawy 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port), lane_pipe_reset,
2558619a06dbSMika Kahola 		     lane_pipe_reset);
255951390cc0SRadhakrishna Sripada 
256051390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_BUF_CTL2(port),
2561619a06dbSMika Kahola 					 lane_phy_current_status, lane_phy_current_status,
256251390cc0SRadhakrishna Sripada 					 XELPDP_PORT_RESET_START_TIMEOUT_US, 0, NULL))
256351390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "PHY %c failed to bring out of Lane reset after %dus.\n",
256451390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PORT_RESET_START_TIMEOUT_US);
256551390cc0SRadhakrishna Sripada 
256651390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(port),
2567619a06dbSMika Kahola 		     intel_cx0_get_pclk_refclk_request(both_lanes ?
2568619a06dbSMika Kahola 						       INTEL_CX0_BOTH_LANES :
2569619a06dbSMika Kahola 						       INTEL_CX0_LANE0),
257051390cc0SRadhakrishna Sripada 		     intel_cx0_get_pclk_refclk_request(lane_mask));
257151390cc0SRadhakrishna Sripada 
257251390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_CLOCK_CTL(port),
2573619a06dbSMika Kahola 					 intel_cx0_get_pclk_refclk_ack(both_lanes ?
2574619a06dbSMika Kahola 								       INTEL_CX0_BOTH_LANES :
2575619a06dbSMika Kahola 								       INTEL_CX0_LANE0),
257651390cc0SRadhakrishna Sripada 					 intel_cx0_get_pclk_refclk_ack(lane_mask),
257751390cc0SRadhakrishna Sripada 					 XELPDP_REFCLK_ENABLE_TIMEOUT_US, 0, NULL))
257851390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "PHY %c failed to request refclk after %dus.\n",
257951390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_REFCLK_ENABLE_TIMEOUT_US);
258051390cc0SRadhakrishna Sripada 
258151390cc0SRadhakrishna Sripada 	intel_cx0_powerdown_change_sequence(i915, port, INTEL_CX0_BOTH_LANES,
258251390cc0SRadhakrishna Sripada 					    CX0_P2_STATE_RESET);
258351390cc0SRadhakrishna Sripada 	intel_cx0_setup_powerdown(i915, port);
258451390cc0SRadhakrishna Sripada 
2585619a06dbSMika Kahola 	intel_de_rmw(i915, XELPDP_PORT_BUF_CTL2(port), lane_pipe_reset, 0);
258651390cc0SRadhakrishna Sripada 
2587619a06dbSMika Kahola 	if (intel_de_wait_for_clear(i915, XELPDP_PORT_BUF_CTL2(port), lane_phy_current_status,
258851390cc0SRadhakrishna Sripada 				    XELPDP_PORT_RESET_END_TIMEOUT))
258951390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "PHY %c failed to bring out of Lane reset after %dms.\n",
259051390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PORT_RESET_END_TIMEOUT);
259151390cc0SRadhakrishna Sripada }
259251390cc0SRadhakrishna Sripada 
intel_cx0_program_phy_lane(struct drm_i915_private * i915,struct intel_encoder * encoder,int lane_count,bool lane_reversal)259362618c7fSMika Kahola static void intel_cx0_program_phy_lane(struct drm_i915_private *i915,
259451390cc0SRadhakrishna Sripada 				       struct intel_encoder *encoder, int lane_count,
259551390cc0SRadhakrishna Sripada 				       bool lane_reversal)
259651390cc0SRadhakrishna Sripada {
259751390cc0SRadhakrishna Sripada 	u8 l0t1, l0t2, l1t1, l1t2;
259851390cc0SRadhakrishna Sripada 	bool dp_alt_mode = intel_tc_port_in_dp_alt_mode(enc_to_dig_port(encoder));
259951390cc0SRadhakrishna Sripada 	enum port port = encoder->port;
260051390cc0SRadhakrishna Sripada 
260162618c7fSMika Kahola 	if (intel_is_c10phy(i915, intel_port_to_phy(i915, port)))
260262618c7fSMika Kahola 		intel_cx0_rmw(i915, port, INTEL_CX0_BOTH_LANES,
260362618c7fSMika Kahola 			      PHY_C10_VDR_CONTROL(1), 0,
260462618c7fSMika Kahola 			      C10_VDR_CTRL_MSGBUS_ACCESS,
260551390cc0SRadhakrishna Sripada 			      MB_WRITE_COMMITTED);
260651390cc0SRadhakrishna Sripada 
260751390cc0SRadhakrishna Sripada 	/* TODO: DP-alt MFD case where only one PHY lane should be programmed. */
260851390cc0SRadhakrishna Sripada 	l0t1 = intel_cx0_read(i915, port, INTEL_CX0_LANE0, PHY_CX0_TX_CONTROL(1, 2));
260951390cc0SRadhakrishna Sripada 	l0t2 = intel_cx0_read(i915, port, INTEL_CX0_LANE0, PHY_CX0_TX_CONTROL(2, 2));
261051390cc0SRadhakrishna Sripada 	l1t1 = intel_cx0_read(i915, port, INTEL_CX0_LANE1, PHY_CX0_TX_CONTROL(1, 2));
261151390cc0SRadhakrishna Sripada 	l1t2 = intel_cx0_read(i915, port, INTEL_CX0_LANE1, PHY_CX0_TX_CONTROL(2, 2));
261251390cc0SRadhakrishna Sripada 
261351390cc0SRadhakrishna Sripada 	l0t1 |= CONTROL2_DISABLE_SINGLE_TX;
261451390cc0SRadhakrishna Sripada 	l0t2 |= CONTROL2_DISABLE_SINGLE_TX;
261551390cc0SRadhakrishna Sripada 	l1t1 |= CONTROL2_DISABLE_SINGLE_TX;
261651390cc0SRadhakrishna Sripada 	l1t2 |= CONTROL2_DISABLE_SINGLE_TX;
261751390cc0SRadhakrishna Sripada 
261851390cc0SRadhakrishna Sripada 	if (lane_reversal) {
261951390cc0SRadhakrishna Sripada 		switch (lane_count) {
262051390cc0SRadhakrishna Sripada 		case 4:
262151390cc0SRadhakrishna Sripada 			l0t1 &= ~CONTROL2_DISABLE_SINGLE_TX;
262251390cc0SRadhakrishna Sripada 			fallthrough;
262351390cc0SRadhakrishna Sripada 		case 3:
262451390cc0SRadhakrishna Sripada 			l0t2 &= ~CONTROL2_DISABLE_SINGLE_TX;
262551390cc0SRadhakrishna Sripada 			fallthrough;
262651390cc0SRadhakrishna Sripada 		case 2:
262751390cc0SRadhakrishna Sripada 			l1t1 &= ~CONTROL2_DISABLE_SINGLE_TX;
262851390cc0SRadhakrishna Sripada 			fallthrough;
262951390cc0SRadhakrishna Sripada 		case 1:
263051390cc0SRadhakrishna Sripada 			l1t2 &= ~CONTROL2_DISABLE_SINGLE_TX;
263151390cc0SRadhakrishna Sripada 			break;
263251390cc0SRadhakrishna Sripada 		default:
263351390cc0SRadhakrishna Sripada 			MISSING_CASE(lane_count);
263451390cc0SRadhakrishna Sripada 		}
263551390cc0SRadhakrishna Sripada 	} else {
263651390cc0SRadhakrishna Sripada 		switch (lane_count) {
263751390cc0SRadhakrishna Sripada 		case 4:
263851390cc0SRadhakrishna Sripada 			l1t2 &= ~CONTROL2_DISABLE_SINGLE_TX;
263951390cc0SRadhakrishna Sripada 			fallthrough;
264051390cc0SRadhakrishna Sripada 		case 3:
264151390cc0SRadhakrishna Sripada 			l1t1 &= ~CONTROL2_DISABLE_SINGLE_TX;
264251390cc0SRadhakrishna Sripada 			fallthrough;
264351390cc0SRadhakrishna Sripada 		case 2:
264451390cc0SRadhakrishna Sripada 			l0t2 &= ~CONTROL2_DISABLE_SINGLE_TX;
264551390cc0SRadhakrishna Sripada 			l0t1 &= ~CONTROL2_DISABLE_SINGLE_TX;
264651390cc0SRadhakrishna Sripada 			break;
264751390cc0SRadhakrishna Sripada 		case 1:
264851390cc0SRadhakrishna Sripada 			if (dp_alt_mode)
264951390cc0SRadhakrishna Sripada 				l0t2 &= ~CONTROL2_DISABLE_SINGLE_TX;
265051390cc0SRadhakrishna Sripada 			else
265151390cc0SRadhakrishna Sripada 				l0t1 &= ~CONTROL2_DISABLE_SINGLE_TX;
265251390cc0SRadhakrishna Sripada 			break;
265351390cc0SRadhakrishna Sripada 		default:
265451390cc0SRadhakrishna Sripada 			MISSING_CASE(lane_count);
265551390cc0SRadhakrishna Sripada 		}
265651390cc0SRadhakrishna Sripada 	}
265751390cc0SRadhakrishna Sripada 
265851390cc0SRadhakrishna Sripada 	/* disable MLs */
265951390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, port, INTEL_CX0_LANE0, PHY_CX0_TX_CONTROL(1, 2),
266051390cc0SRadhakrishna Sripada 			l0t1, MB_WRITE_COMMITTED);
266151390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, port, INTEL_CX0_LANE0, PHY_CX0_TX_CONTROL(2, 2),
266251390cc0SRadhakrishna Sripada 			l0t2, MB_WRITE_COMMITTED);
266351390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, port, INTEL_CX0_LANE1, PHY_CX0_TX_CONTROL(1, 2),
266451390cc0SRadhakrishna Sripada 			l1t1, MB_WRITE_COMMITTED);
266551390cc0SRadhakrishna Sripada 	intel_cx0_write(i915, port, INTEL_CX0_LANE1, PHY_CX0_TX_CONTROL(2, 2),
266651390cc0SRadhakrishna Sripada 			l1t2, MB_WRITE_COMMITTED);
266751390cc0SRadhakrishna Sripada 
266862618c7fSMika Kahola 	if (intel_is_c10phy(i915, intel_port_to_phy(i915, port)))
266962618c7fSMika Kahola 		intel_cx0_rmw(i915, port, INTEL_CX0_BOTH_LANES,
267062618c7fSMika Kahola 			      PHY_C10_VDR_CONTROL(1), 0,
267162618c7fSMika Kahola 			      C10_VDR_CTRL_UPDATE_CFG,
267251390cc0SRadhakrishna Sripada 			      MB_WRITE_COMMITTED);
267351390cc0SRadhakrishna Sripada }
267451390cc0SRadhakrishna Sripada 
intel_cx0_get_pclk_pll_request(u8 lane_mask)267551390cc0SRadhakrishna Sripada static u32 intel_cx0_get_pclk_pll_request(u8 lane_mask)
267651390cc0SRadhakrishna Sripada {
267751390cc0SRadhakrishna Sripada 	u32 val = 0;
267851390cc0SRadhakrishna Sripada 	int lane = 0;
267951390cc0SRadhakrishna Sripada 
268051390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
268151390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_PCLK_PLL_REQUEST(lane);
268251390cc0SRadhakrishna Sripada 
268351390cc0SRadhakrishna Sripada 	return val;
268451390cc0SRadhakrishna Sripada }
268551390cc0SRadhakrishna Sripada 
intel_cx0_get_pclk_pll_ack(u8 lane_mask)268651390cc0SRadhakrishna Sripada static u32 intel_cx0_get_pclk_pll_ack(u8 lane_mask)
268751390cc0SRadhakrishna Sripada {
268851390cc0SRadhakrishna Sripada 	u32 val = 0;
268951390cc0SRadhakrishna Sripada 	int lane = 0;
269051390cc0SRadhakrishna Sripada 
269151390cc0SRadhakrishna Sripada 	for_each_cx0_lane_in_mask(lane_mask, lane)
269251390cc0SRadhakrishna Sripada 		val |= XELPDP_LANE_PCLK_PLL_ACK(lane);
269351390cc0SRadhakrishna Sripada 
269451390cc0SRadhakrishna Sripada 	return val;
269551390cc0SRadhakrishna Sripada }
269651390cc0SRadhakrishna Sripada 
intel_cx0pll_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)269773fc3abcSMika Kahola static void intel_cx0pll_enable(struct intel_encoder *encoder,
269851390cc0SRadhakrishna Sripada 				const struct intel_crtc_state *crtc_state)
269951390cc0SRadhakrishna Sripada {
270051390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
270151390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, encoder->port);
270251390cc0SRadhakrishna Sripada 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
270351390cc0SRadhakrishna Sripada 	bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
270451390cc0SRadhakrishna Sripada 	u8 maxpclk_lane = lane_reversal ? INTEL_CX0_LANE1 :
270551390cc0SRadhakrishna Sripada 					  INTEL_CX0_LANE0;
270662618c7fSMika Kahola 	intel_wakeref_t wakeref = intel_cx0_phy_transaction_begin(encoder);
270751390cc0SRadhakrishna Sripada 
270851390cc0SRadhakrishna Sripada 	/*
270951390cc0SRadhakrishna Sripada 	 * 1. Program PORT_CLOCK_CTL REGISTER to configure
271051390cc0SRadhakrishna Sripada 	 * clock muxes, gating and SSC
271151390cc0SRadhakrishna Sripada 	 */
271251390cc0SRadhakrishna Sripada 	intel_program_port_clock_ctl(encoder, crtc_state, lane_reversal);
271351390cc0SRadhakrishna Sripada 
271451390cc0SRadhakrishna Sripada 	/* 2. Bring PHY out of reset. */
2715619a06dbSMika Kahola 	intel_cx0_phy_lane_reset(i915, encoder, lane_reversal);
271651390cc0SRadhakrishna Sripada 
271751390cc0SRadhakrishna Sripada 	/*
271851390cc0SRadhakrishna Sripada 	 * 3. Change Phy power state to Ready.
271951390cc0SRadhakrishna Sripada 	 * TODO: For DP alt mode use only one lane.
272051390cc0SRadhakrishna Sripada 	 */
272151390cc0SRadhakrishna Sripada 	intel_cx0_powerdown_change_sequence(i915, encoder->port, INTEL_CX0_BOTH_LANES,
272251390cc0SRadhakrishna Sripada 					    CX0_P2_STATE_READY);
272351390cc0SRadhakrishna Sripada 
272451390cc0SRadhakrishna Sripada 	/* 4. Program PHY internal PLL internal registers. */
272562618c7fSMika Kahola 	if (intel_is_c10phy(i915, phy))
272651390cc0SRadhakrishna Sripada 		intel_c10_pll_program(i915, crtc_state, encoder);
272762618c7fSMika Kahola 	else
272862618c7fSMika Kahola 		intel_c20_pll_program(i915, crtc_state, encoder);
272951390cc0SRadhakrishna Sripada 
273051390cc0SRadhakrishna Sripada 	/*
273151390cc0SRadhakrishna Sripada 	 * 5. Program the enabled and disabled owned PHY lane
273251390cc0SRadhakrishna Sripada 	 * transmitters over message bus
273351390cc0SRadhakrishna Sripada 	 */
273462618c7fSMika Kahola 	intel_cx0_program_phy_lane(i915, encoder, crtc_state->lane_count, lane_reversal);
273551390cc0SRadhakrishna Sripada 
273651390cc0SRadhakrishna Sripada 	/*
273751390cc0SRadhakrishna Sripada 	 * 6. Follow the Display Voltage Frequency Switching - Sequence
273851390cc0SRadhakrishna Sripada 	 * Before Frequency Change. We handle this step in bxt_set_cdclk().
273951390cc0SRadhakrishna Sripada 	 */
274051390cc0SRadhakrishna Sripada 
274151390cc0SRadhakrishna Sripada 	/*
274251390cc0SRadhakrishna Sripada 	 * 7. Program DDI_CLK_VALFREQ to match intended DDI
274351390cc0SRadhakrishna Sripada 	 * clock frequency.
274451390cc0SRadhakrishna Sripada 	 */
274551390cc0SRadhakrishna Sripada 	intel_de_write(i915, DDI_CLK_VALFREQ(encoder->port),
274651390cc0SRadhakrishna Sripada 		       crtc_state->port_clock);
274751390cc0SRadhakrishna Sripada 
274851390cc0SRadhakrishna Sripada 	/*
274951390cc0SRadhakrishna Sripada 	 * 8. Set PORT_CLOCK_CTL register PCLK PLL Request
275051390cc0SRadhakrishna Sripada 	 * LN<Lane for maxPCLK> to "1" to enable PLL.
275151390cc0SRadhakrishna Sripada 	 */
275251390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
275351390cc0SRadhakrishna Sripada 		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES),
275451390cc0SRadhakrishna Sripada 		     intel_cx0_get_pclk_pll_request(maxpclk_lane));
275551390cc0SRadhakrishna Sripada 
275651390cc0SRadhakrishna Sripada 	/* 9. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */
275751390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
275851390cc0SRadhakrishna Sripada 					 intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES),
275951390cc0SRadhakrishna Sripada 					 intel_cx0_get_pclk_pll_ack(maxpclk_lane),
276051390cc0SRadhakrishna Sripada 					 XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, 0, NULL))
276151390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "Port %c PLL not locked after %dus.\n",
276251390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US);
276351390cc0SRadhakrishna Sripada 
276451390cc0SRadhakrishna Sripada 	/*
276551390cc0SRadhakrishna Sripada 	 * 10. Follow the Display Voltage Frequency Switching Sequence After
276651390cc0SRadhakrishna Sripada 	 * Frequency Change. We handle this step in bxt_set_cdclk().
276751390cc0SRadhakrishna Sripada 	 */
276851390cc0SRadhakrishna Sripada 
276951390cc0SRadhakrishna Sripada 	/* TODO: enable TBT-ALT mode */
277051390cc0SRadhakrishna Sripada 	intel_cx0_phy_transaction_end(encoder, wakeref);
277151390cc0SRadhakrishna Sripada }
277251390cc0SRadhakrishna Sripada 
intel_mtl_tbt_calc_port_clock(struct intel_encoder * encoder)27737dee06bcSMika Kahola int intel_mtl_tbt_calc_port_clock(struct intel_encoder *encoder)
27747dee06bcSMika Kahola {
27757dee06bcSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
27767dee06bcSMika Kahola 	u32 clock;
27777dee06bcSMika Kahola 	u32 val = intel_de_read(i915, XELPDP_PORT_CLOCK_CTL(encoder->port));
27787dee06bcSMika Kahola 
27797dee06bcSMika Kahola 	clock = REG_FIELD_GET(XELPDP_DDI_CLOCK_SELECT_MASK, val);
27807dee06bcSMika Kahola 
27817dee06bcSMika Kahola 	drm_WARN_ON(&i915->drm, !(val & XELPDP_FORWARD_CLOCK_UNGATE));
27827dee06bcSMika Kahola 	drm_WARN_ON(&i915->drm, !(val & XELPDP_TBT_CLOCK_REQUEST));
27837dee06bcSMika Kahola 	drm_WARN_ON(&i915->drm, !(val & XELPDP_TBT_CLOCK_ACK));
27847dee06bcSMika Kahola 
27857dee06bcSMika Kahola 	switch (clock) {
27867dee06bcSMika Kahola 	case XELPDP_DDI_CLOCK_SELECT_TBT_162:
27877dee06bcSMika Kahola 		return 162000;
27887dee06bcSMika Kahola 	case XELPDP_DDI_CLOCK_SELECT_TBT_270:
27897dee06bcSMika Kahola 		return 270000;
27907dee06bcSMika Kahola 	case XELPDP_DDI_CLOCK_SELECT_TBT_540:
27917dee06bcSMika Kahola 		return 540000;
27927dee06bcSMika Kahola 	case XELPDP_DDI_CLOCK_SELECT_TBT_810:
27937dee06bcSMika Kahola 		return 810000;
27947dee06bcSMika Kahola 	default:
27957dee06bcSMika Kahola 		MISSING_CASE(clock);
27967dee06bcSMika Kahola 		return 162000;
27977dee06bcSMika Kahola 	}
27987dee06bcSMika Kahola }
27997dee06bcSMika Kahola 
intel_mtl_tbt_clock_select(struct drm_i915_private * i915,int clock)280073fc3abcSMika Kahola static int intel_mtl_tbt_clock_select(struct drm_i915_private *i915, int clock)
280173fc3abcSMika Kahola {
280273fc3abcSMika Kahola 	switch (clock) {
280373fc3abcSMika Kahola 	case 162000:
280473fc3abcSMika Kahola 		return XELPDP_DDI_CLOCK_SELECT_TBT_162;
280573fc3abcSMika Kahola 	case 270000:
280673fc3abcSMika Kahola 		return XELPDP_DDI_CLOCK_SELECT_TBT_270;
280773fc3abcSMika Kahola 	case 540000:
280873fc3abcSMika Kahola 		return XELPDP_DDI_CLOCK_SELECT_TBT_540;
280973fc3abcSMika Kahola 	case 810000:
281073fc3abcSMika Kahola 		return XELPDP_DDI_CLOCK_SELECT_TBT_810;
281173fc3abcSMika Kahola 	default:
281273fc3abcSMika Kahola 		MISSING_CASE(clock);
281373fc3abcSMika Kahola 		return XELPDP_DDI_CLOCK_SELECT_TBT_162;
281473fc3abcSMika Kahola 	}
281573fc3abcSMika Kahola }
281673fc3abcSMika Kahola 
intel_mtl_tbt_pll_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)281773fc3abcSMika Kahola static void intel_mtl_tbt_pll_enable(struct intel_encoder *encoder,
281873fc3abcSMika Kahola 				     const struct intel_crtc_state *crtc_state)
281973fc3abcSMika Kahola {
282073fc3abcSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
282173fc3abcSMika Kahola 	enum phy phy = intel_port_to_phy(i915, encoder->port);
282273fc3abcSMika Kahola 	u32 val = 0;
282373fc3abcSMika Kahola 
282473fc3abcSMika Kahola 	/*
282573fc3abcSMika Kahola 	 * 1. Program PORT_CLOCK_CTL REGISTER to configure
282673fc3abcSMika Kahola 	 * clock muxes, gating and SSC
282773fc3abcSMika Kahola 	 */
282873fc3abcSMika Kahola 	val |= XELPDP_DDI_CLOCK_SELECT(intel_mtl_tbt_clock_select(i915, crtc_state->port_clock));
282973fc3abcSMika Kahola 	val |= XELPDP_FORWARD_CLOCK_UNGATE;
283073fc3abcSMika Kahola 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
283173fc3abcSMika Kahola 		     XELPDP_DDI_CLOCK_SELECT_MASK | XELPDP_FORWARD_CLOCK_UNGATE, val);
283273fc3abcSMika Kahola 
283373fc3abcSMika Kahola 	/* 2. Read back PORT_CLOCK_CTL REGISTER */
283473fc3abcSMika Kahola 	val = intel_de_read(i915, XELPDP_PORT_CLOCK_CTL(encoder->port));
283573fc3abcSMika Kahola 
283673fc3abcSMika Kahola 	/*
283773fc3abcSMika Kahola 	 * 3. Follow the Display Voltage Frequency Switching - Sequence
283873fc3abcSMika Kahola 	 * Before Frequency Change. We handle this step in bxt_set_cdclk().
283973fc3abcSMika Kahola 	 */
284073fc3abcSMika Kahola 
284173fc3abcSMika Kahola 	/*
284273fc3abcSMika Kahola 	 * 4. Set PORT_CLOCK_CTL register TBT CLOCK Request to "1" to enable PLL.
284373fc3abcSMika Kahola 	 */
284473fc3abcSMika Kahola 	val |= XELPDP_TBT_CLOCK_REQUEST;
284573fc3abcSMika Kahola 	intel_de_write(i915, XELPDP_PORT_CLOCK_CTL(encoder->port), val);
284673fc3abcSMika Kahola 
284773fc3abcSMika Kahola 	/* 5. Poll on PORT_CLOCK_CTL TBT CLOCK Ack == "1". */
284873fc3abcSMika Kahola 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
284973fc3abcSMika Kahola 					 XELPDP_TBT_CLOCK_ACK,
285073fc3abcSMika Kahola 					 XELPDP_TBT_CLOCK_ACK,
285173fc3abcSMika Kahola 					 100, 0, NULL))
285273fc3abcSMika Kahola 		drm_warn(&i915->drm, "[ENCODER:%d:%s][%c] PHY PLL not locked after 100us.\n",
285373fc3abcSMika Kahola 			 encoder->base.base.id, encoder->base.name, phy_name(phy));
285473fc3abcSMika Kahola 
285573fc3abcSMika Kahola 	/*
285673fc3abcSMika Kahola 	 * 6. Follow the Display Voltage Frequency Switching Sequence After
285773fc3abcSMika Kahola 	 * Frequency Change. We handle this step in bxt_set_cdclk().
285873fc3abcSMika Kahola 	 */
285973fc3abcSMika Kahola 
286073fc3abcSMika Kahola 	/*
286173fc3abcSMika Kahola 	 * 7. Program DDI_CLK_VALFREQ to match intended DDI
286273fc3abcSMika Kahola 	 * clock frequency.
286373fc3abcSMika Kahola 	 */
286473fc3abcSMika Kahola 	intel_de_write(i915, DDI_CLK_VALFREQ(encoder->port),
286573fc3abcSMika Kahola 		       crtc_state->port_clock);
286673fc3abcSMika Kahola }
286773fc3abcSMika Kahola 
intel_mtl_pll_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)286873fc3abcSMika Kahola void intel_mtl_pll_enable(struct intel_encoder *encoder,
286973fc3abcSMika Kahola 			  const struct intel_crtc_state *crtc_state)
287073fc3abcSMika Kahola {
287173fc3abcSMika Kahola 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
287273fc3abcSMika Kahola 
287373fc3abcSMika Kahola 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
287473fc3abcSMika Kahola 		intel_mtl_tbt_pll_enable(encoder, crtc_state);
287573fc3abcSMika Kahola 	else
287673fc3abcSMika Kahola 		intel_cx0pll_enable(encoder, crtc_state);
287773fc3abcSMika Kahola }
287873fc3abcSMika Kahola 
intel_cx0pll_disable(struct intel_encoder * encoder)287973fc3abcSMika Kahola static void intel_cx0pll_disable(struct intel_encoder *encoder)
288051390cc0SRadhakrishna Sripada {
288151390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
288251390cc0SRadhakrishna Sripada 	enum phy phy = intel_port_to_phy(i915, encoder->port);
288362618c7fSMika Kahola 	bool is_c10 = intel_is_c10phy(i915, phy);
288462618c7fSMika Kahola 	intel_wakeref_t wakeref = intel_cx0_phy_transaction_begin(encoder);
288551390cc0SRadhakrishna Sripada 
288651390cc0SRadhakrishna Sripada 	/* 1. Change owned PHY lane power to Disable state. */
288751390cc0SRadhakrishna Sripada 	intel_cx0_powerdown_change_sequence(i915, encoder->port, INTEL_CX0_BOTH_LANES,
288862618c7fSMika Kahola 					    is_c10 ? CX0_P2PG_STATE_DISABLE :
288962618c7fSMika Kahola 					    CX0_P4PG_STATE_DISABLE);
289051390cc0SRadhakrishna Sripada 
289151390cc0SRadhakrishna Sripada 	/*
289251390cc0SRadhakrishna Sripada 	 * 2. Follow the Display Voltage Frequency Switching Sequence Before
289351390cc0SRadhakrishna Sripada 	 * Frequency Change. We handle this step in bxt_set_cdclk().
289451390cc0SRadhakrishna Sripada 	 */
289551390cc0SRadhakrishna Sripada 
289651390cc0SRadhakrishna Sripada 	/*
289751390cc0SRadhakrishna Sripada 	 * 3. Set PORT_CLOCK_CTL register PCLK PLL Request LN<Lane for maxPCLK>
289851390cc0SRadhakrishna Sripada 	 * to "0" to disable PLL.
289951390cc0SRadhakrishna Sripada 	 */
290051390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
290151390cc0SRadhakrishna Sripada 		     intel_cx0_get_pclk_pll_request(INTEL_CX0_BOTH_LANES) |
290251390cc0SRadhakrishna Sripada 		     intel_cx0_get_pclk_refclk_request(INTEL_CX0_BOTH_LANES), 0);
290351390cc0SRadhakrishna Sripada 
290451390cc0SRadhakrishna Sripada 	/* 4. Program DDI_CLK_VALFREQ to 0. */
290551390cc0SRadhakrishna Sripada 	intel_de_write(i915, DDI_CLK_VALFREQ(encoder->port), 0);
290651390cc0SRadhakrishna Sripada 
290751390cc0SRadhakrishna Sripada 	/*
290851390cc0SRadhakrishna Sripada 	 * 5. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK**> == "0".
290951390cc0SRadhakrishna Sripada 	 */
291051390cc0SRadhakrishna Sripada 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
291151390cc0SRadhakrishna Sripada 					 intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES) |
291251390cc0SRadhakrishna Sripada 					 intel_cx0_get_pclk_refclk_ack(INTEL_CX0_BOTH_LANES), 0,
291351390cc0SRadhakrishna Sripada 					 XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US, 0, NULL))
291451390cc0SRadhakrishna Sripada 		drm_warn(&i915->drm, "Port %c PLL not unlocked after %dus.\n",
291551390cc0SRadhakrishna Sripada 			 phy_name(phy), XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US);
291651390cc0SRadhakrishna Sripada 
291751390cc0SRadhakrishna Sripada 	/*
291851390cc0SRadhakrishna Sripada 	 * 6. Follow the Display Voltage Frequency Switching Sequence After
291951390cc0SRadhakrishna Sripada 	 * Frequency Change. We handle this step in bxt_set_cdclk().
292051390cc0SRadhakrishna Sripada 	 */
292151390cc0SRadhakrishna Sripada 
292251390cc0SRadhakrishna Sripada 	/* 7. Program PORT_CLOCK_CTL register to disable and gate clocks. */
292351390cc0SRadhakrishna Sripada 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
2924ea8af87aSMika Kahola 		     XELPDP_DDI_CLOCK_SELECT_MASK, 0);
2925ea8af87aSMika Kahola 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
292651390cc0SRadhakrishna Sripada 		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
292751390cc0SRadhakrishna Sripada 
292851390cc0SRadhakrishna Sripada 	intel_cx0_phy_transaction_end(encoder, wakeref);
292951390cc0SRadhakrishna Sripada }
293051390cc0SRadhakrishna Sripada 
intel_mtl_tbt_pll_disable(struct intel_encoder * encoder)293173fc3abcSMika Kahola static void intel_mtl_tbt_pll_disable(struct intel_encoder *encoder)
293273fc3abcSMika Kahola {
293373fc3abcSMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
293473fc3abcSMika Kahola 	enum phy phy = intel_port_to_phy(i915, encoder->port);
293573fc3abcSMika Kahola 
293673fc3abcSMika Kahola 	/*
293773fc3abcSMika Kahola 	 * 1. Follow the Display Voltage Frequency Switching Sequence Before
293873fc3abcSMika Kahola 	 * Frequency Change. We handle this step in bxt_set_cdclk().
293973fc3abcSMika Kahola 	 */
294073fc3abcSMika Kahola 
294173fc3abcSMika Kahola 	/*
294273fc3abcSMika Kahola 	 * 2. Set PORT_CLOCK_CTL register TBT CLOCK Request to "0" to disable PLL.
294373fc3abcSMika Kahola 	 */
294473fc3abcSMika Kahola 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
294573fc3abcSMika Kahola 		     XELPDP_TBT_CLOCK_REQUEST, 0);
294673fc3abcSMika Kahola 
294773fc3abcSMika Kahola 	/* 3. Poll on PORT_CLOCK_CTL TBT CLOCK Ack == "0". */
294873fc3abcSMika Kahola 	if (__intel_de_wait_for_register(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
2949615ed9ecSMika Kahola 					 XELPDP_TBT_CLOCK_ACK, 0, 10, 0, NULL))
295073fc3abcSMika Kahola 		drm_warn(&i915->drm, "[ENCODER:%d:%s][%c] PHY PLL not unlocked after 10us.\n",
295173fc3abcSMika Kahola 			 encoder->base.base.id, encoder->base.name, phy_name(phy));
295273fc3abcSMika Kahola 
295373fc3abcSMika Kahola 	/*
295473fc3abcSMika Kahola 	 * 4. Follow the Display Voltage Frequency Switching Sequence After
295573fc3abcSMika Kahola 	 * Frequency Change. We handle this step in bxt_set_cdclk().
295673fc3abcSMika Kahola 	 */
295773fc3abcSMika Kahola 
295873fc3abcSMika Kahola 	/*
295973fc3abcSMika Kahola 	 * 5. Program PORT CLOCK CTRL register to disable and gate clocks
296073fc3abcSMika Kahola 	 */
296173fc3abcSMika Kahola 	intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(encoder->port),
296273fc3abcSMika Kahola 		     XELPDP_DDI_CLOCK_SELECT_MASK |
296373fc3abcSMika Kahola 		     XELPDP_FORWARD_CLOCK_UNGATE, 0);
296473fc3abcSMika Kahola 
296573fc3abcSMika Kahola 	/* 6. Program DDI_CLK_VALFREQ to 0. */
296673fc3abcSMika Kahola 	intel_de_write(i915, DDI_CLK_VALFREQ(encoder->port), 0);
296773fc3abcSMika Kahola }
296873fc3abcSMika Kahola 
intel_mtl_pll_disable(struct intel_encoder * encoder)296973fc3abcSMika Kahola void intel_mtl_pll_disable(struct intel_encoder *encoder)
297073fc3abcSMika Kahola {
297173fc3abcSMika Kahola 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
297273fc3abcSMika Kahola 
297373fc3abcSMika Kahola 	if (intel_tc_port_in_tbt_alt_mode(dig_port))
297473fc3abcSMika Kahola 		intel_mtl_tbt_pll_disable(encoder);
297573fc3abcSMika Kahola 	else
297673fc3abcSMika Kahola 		intel_cx0pll_disable(encoder);
297773fc3abcSMika Kahola }
297873fc3abcSMika Kahola 
29796f0423b0SMika Kahola enum icl_port_dpll_id
intel_mtl_port_pll_type(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)29806f0423b0SMika Kahola intel_mtl_port_pll_type(struct intel_encoder *encoder,
29816f0423b0SMika Kahola 			const struct intel_crtc_state *crtc_state)
29826f0423b0SMika Kahola {
29836f0423b0SMika Kahola 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
29846f0423b0SMika Kahola 	/*
29856f0423b0SMika Kahola 	 * TODO: Determine the PLL type from the SW state, once MTL PLL
29866f0423b0SMika Kahola 	 * handling is done via the standard shared DPLL framework.
29876f0423b0SMika Kahola 	 */
29886f0423b0SMika Kahola 	u32 val = intel_de_read(i915, XELPDP_PORT_CLOCK_CTL(encoder->port));
29896f0423b0SMika Kahola 	u32 clock = REG_FIELD_GET(XELPDP_DDI_CLOCK_SELECT_MASK, val);
29906f0423b0SMika Kahola 
29916f0423b0SMika Kahola 	if (clock == XELPDP_DDI_CLOCK_SELECT_MAXPCLK ||
29926f0423b0SMika Kahola 	    clock == XELPDP_DDI_CLOCK_SELECT_DIV18CLK)
29936f0423b0SMika Kahola 		return ICL_PORT_DPLL_MG_PHY;
29946f0423b0SMika Kahola 	else
29956f0423b0SMika Kahola 		return ICL_PORT_DPLL_DEFAULT;
29966f0423b0SMika Kahola }
29976f0423b0SMika Kahola 
intel_c10pll_state_verify(struct intel_atomic_state * state,struct intel_crtc_state * new_crtc_state)299851390cc0SRadhakrishna Sripada void intel_c10pll_state_verify(struct intel_atomic_state *state,
299951390cc0SRadhakrishna Sripada 			       struct intel_crtc_state *new_crtc_state)
300051390cc0SRadhakrishna Sripada {
300151390cc0SRadhakrishna Sripada 	struct drm_i915_private *i915 = to_i915(state->base.dev);
300251390cc0SRadhakrishna Sripada 	struct intel_c10pll_state mpllb_hw_state = { 0 };
300351390cc0SRadhakrishna Sripada 	struct intel_c10pll_state *mpllb_sw_state = &new_crtc_state->cx0pll_state.c10;
300451390cc0SRadhakrishna Sripada 	struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc);
300551390cc0SRadhakrishna Sripada 	struct intel_encoder *encoder;
300651390cc0SRadhakrishna Sripada 	enum phy phy;
300751390cc0SRadhakrishna Sripada 	int i;
300851390cc0SRadhakrishna Sripada 
300951390cc0SRadhakrishna Sripada 	if (DISPLAY_VER(i915) < 14)
301051390cc0SRadhakrishna Sripada 		return;
301151390cc0SRadhakrishna Sripada 
301251390cc0SRadhakrishna Sripada 	if (!new_crtc_state->hw.active)
301351390cc0SRadhakrishna Sripada 		return;
301451390cc0SRadhakrishna Sripada 
3015e920aabfSVille Syrjälä 	/* intel_get_crtc_new_encoder() only works for modeset/fastset commits */
3016e920aabfSVille Syrjälä 	if (!intel_crtc_needs_modeset(new_crtc_state) &&
3017e920aabfSVille Syrjälä 	    !intel_crtc_needs_fastset(new_crtc_state))
3018e920aabfSVille Syrjälä 		return;
3019e920aabfSVille Syrjälä 
302051390cc0SRadhakrishna Sripada 	encoder = intel_get_crtc_new_encoder(state, new_crtc_state);
302151390cc0SRadhakrishna Sripada 	phy = intel_port_to_phy(i915, encoder->port);
302251390cc0SRadhakrishna Sripada 
302351390cc0SRadhakrishna Sripada 	if (!intel_is_c10phy(i915, phy))
302451390cc0SRadhakrishna Sripada 		return;
302551390cc0SRadhakrishna Sripada 
302651390cc0SRadhakrishna Sripada 	intel_c10pll_readout_hw_state(encoder, &mpllb_hw_state);
302751390cc0SRadhakrishna Sripada 
302851390cc0SRadhakrishna Sripada 	for (i = 0; i < ARRAY_SIZE(mpllb_sw_state->pll); i++) {
302951390cc0SRadhakrishna Sripada 		u8 expected = mpllb_sw_state->pll[i];
303051390cc0SRadhakrishna Sripada 
30316b9bd7c3SJani Nikula 		I915_STATE_WARN(i915, mpllb_hw_state.pll[i] != expected,
303251390cc0SRadhakrishna Sripada 				"[CRTC:%d:%s] mismatch in C10MPLLB: Register[%d] (expected 0x%02x, found 0x%02x)",
30336b9bd7c3SJani Nikula 				crtc->base.base.id, crtc->base.name, i,
30346b9bd7c3SJani Nikula 				expected, mpllb_hw_state.pll[i]);
303551390cc0SRadhakrishna Sripada 	}
303651390cc0SRadhakrishna Sripada 
30376b9bd7c3SJani Nikula 	I915_STATE_WARN(i915, mpllb_hw_state.tx != mpllb_sw_state->tx,
303851390cc0SRadhakrishna Sripada 			"[CRTC:%d:%s] mismatch in C10MPLLB: Register TX0 (expected 0x%02x, found 0x%02x)",
303951390cc0SRadhakrishna Sripada 			crtc->base.base.id, crtc->base.name,
304051390cc0SRadhakrishna Sripada 			mpllb_sw_state->tx, mpllb_hw_state.tx);
304151390cc0SRadhakrishna Sripada 
30426b9bd7c3SJani Nikula 	I915_STATE_WARN(i915, mpllb_hw_state.cmn != mpllb_sw_state->cmn,
304351390cc0SRadhakrishna Sripada 			"[CRTC:%d:%s] mismatch in C10MPLLB: Register CMN0 (expected 0x%02x, found 0x%02x)",
304451390cc0SRadhakrishna Sripada 			crtc->base.base.id, crtc->base.name,
304551390cc0SRadhakrishna Sripada 			mpllb_sw_state->cmn, mpllb_hw_state.cmn);
304651390cc0SRadhakrishna Sripada }
3047