{
        if (phy == PHY_NONE)
                return false;
+       else if (IS_DG2(dev_priv))
+               /*
+                * DG2 outputs labelled as "combo PHY" in the bspec use
+                * SNPS PHYs with completely different programming,
+                * hence we always return false here.
+                */
+               return false;
        else if (IS_ALDERLAKE_S(dev_priv))
                return phy <= PHY_E;
        else if (IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv))
 
 bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
 {
-       if (IS_ALDERLAKE_P(dev_priv))
+       if (IS_DG2(dev_priv))
+               /* DG2's "TC1" output uses a SNPS PHY */
+               return false;
+       else if (IS_ALDERLAKE_P(dev_priv))
                return phy >= PHY_F && phy <= PHY_I;
        else if (IS_TIGERLAKE(dev_priv))
                return phy >= PHY_D && phy <= PHY_I;
                return false;
 }
 
+bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy)
+{
+       if (phy == PHY_NONE)
+               return false;
+       else if (IS_DG2(dev_priv))
+               /*
+                * All four "combo" ports and the TC1 port (PHY E) use
+                * Synopsis PHYs.
+                */
+               return phy <= PHY_E;
+
+       return false;
+}
+
 enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)
 {
        if (DISPLAY_VER(i915) >= 13 && port >= PORT_D_XELPD)
 
 intel_encoder_current_mode(struct intel_encoder *encoder);
 bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy);
 bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy);
+bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy);
 enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv,
                              enum port port);
 int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,