drm/i915/cnl: Add DDI Buffer translation tables for Cannonlake.
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 9 Jun 2017 22:26:07 +0000 (15:26 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 12 Jun 2017 16:43:41 +0000 (09:43 -0700)
These tables are used on voltage wswing sequence initialization
on Cannonlake.

It is a complete new format now in use by the voltage swing team,
not following any other standard in use by any other platform.
Also the registers are different as well. So let's redefine
the translation table for Cannonlake.

The table is huge. So we minimized with the fields that are
different or might be different anytime soon. The common
values will be hardcoded on the voltage swing sequence.

v2: Merge the lower and the upper bits to match the spec table
    and make review easier. This was possible with the good
    idea for Manasi with a better way to handle it on the bit
    macro definition presented on previous patch.
Credits-to: Manasi
Cc: Manasi Navare <manasi.d.navare@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1497047175-27250-10-git-send-email-rodrigo.vivi@intel.com
drivers/gpu/drm/i915/intel_ddi.c

index 62a623e72fe2d222917f7e370338f0e02d239e07..ee75d3ba89ae0a5cae863aad2a0ca6dce0ae8923 100644 (file)
@@ -353,6 +353,146 @@ static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = {
        { 154, 0x9A, 1, 128, true },    /* 9:   1200            0   */
 };
 
+struct cnl_ddi_buf_trans {
+       u32 dw2_swing_sel;
+       u32 dw7_n_scalar;
+       u32 dw4_cursor_coeff;
+       u32 dw4_post_cursor_2;
+       u32 dw4_post_cursor_1;
+};
+
+/* Voltage Swing Programming for VccIO 0.85V for DP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_85V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x5D, 0x3F, 0x00, 0x00 },        /* 350   350      0.0   */
+       { 0xA, 0x6A, 0x38, 0x00, 0x07 },        /* 350   500      3.1   */
+       { 0xB, 0x7A, 0x32, 0x00, 0x0D },        /* 350   700      6.0   */
+       { 0x6, 0x7C, 0x2D, 0x00, 0x12 },        /* 350   900      8.2   */
+       { 0xA, 0x69, 0x3F, 0x00, 0x00 },        /* 500   500      0.0   */
+       { 0xB, 0x7A, 0x36, 0x00, 0x09 },        /* 500   700      2.9   */
+       { 0x6, 0x7C, 0x30, 0x00, 0x0F },        /* 500   900      5.1   */
+       { 0xB, 0x7D, 0x3C, 0x00, 0x03 },        /* 650   725      0.9   */
+       { 0x6, 0x7C, 0x34, 0x00, 0x0B },        /* 600   900      3.5   */
+       { 0x6, 0x7B, 0x3F, 0x00, 0x00 },        /* 900   900      0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 0.85V for HDMI */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_85V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x60, 0x3F, 0x00, 0x00 },        /* 450   450      0.0   */
+       { 0xB, 0x73, 0x36, 0x00, 0x09 },        /* 450   650      3.2   */
+       { 0x6, 0x7F, 0x31, 0x00, 0x0E },        /* 450   850      5.5   */
+       { 0xB, 0x73, 0x3F, 0x00, 0x00 },        /* 650   650      0.0   */
+       { 0x6, 0x7F, 0x37, 0x00, 0x08 },        /* 650   850      2.3   */
+       { 0x6, 0x7F, 0x3F, 0x00, 0x00 },        /* 850   850      0.0   */
+       { 0x6, 0x7F, 0x35, 0x00, 0x0A },        /* 600   850      3.0   */
+};
+
+/* Voltage Swing Programming for VccIO 0.85V for eDP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_85V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x66, 0x3A, 0x00, 0x05 },        /* 384   500      2.3   */
+       { 0x0, 0x7F, 0x38, 0x00, 0x07 },        /* 153   200      2.3   */
+       { 0x8, 0x7F, 0x38, 0x00, 0x07 },        /* 192   250      2.3   */
+       { 0x1, 0x7F, 0x38, 0x00, 0x07 },        /* 230   300      2.3   */
+       { 0x9, 0x7F, 0x38, 0x00, 0x07 },        /* 269   350      2.3   */
+       { 0xA, 0x66, 0x3C, 0x00, 0x03 },        /* 446   500      1.0   */
+       { 0xB, 0x70, 0x3C, 0x00, 0x03 },        /* 460   600      2.3   */
+       { 0xC, 0x75, 0x3C, 0x00, 0x03 },        /* 537   700      2.3   */
+       { 0x2, 0x7F, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 0.95V for DP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_95V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x5D, 0x3F, 0x00, 0x00 },        /* 350   350      0.0   */
+       { 0xA, 0x6A, 0x38, 0x00, 0x07 },        /* 350   500      3.1   */
+       { 0xB, 0x7A, 0x32, 0x00, 0x0D },        /* 350   700      6.0   */
+       { 0x6, 0x7C, 0x2D, 0x00, 0x12 },        /* 350   900      8.2   */
+       { 0xA, 0x69, 0x3F, 0x00, 0x00 },        /* 500   500      0.0   */
+       { 0xB, 0x7A, 0x36, 0x00, 0x09 },        /* 500   700      2.9   */
+       { 0x6, 0x7C, 0x30, 0x00, 0x0F },        /* 500   900      5.1   */
+       { 0xB, 0x7D, 0x3C, 0x00, 0x03 },        /* 650   725      0.9   */
+       { 0x6, 0x7C, 0x34, 0x00, 0x0B },        /* 600   900      3.5   */
+       { 0x6, 0x7B, 0x3F, 0x00, 0x00 },        /* 900   900      0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 0.95V for HDMI */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_95V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x5C, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+       { 0xB, 0x69, 0x37, 0x00, 0x08 },        /* 400   600      3.5   */
+       { 0x5, 0x76, 0x31, 0x00, 0x0E },        /* 400   800      6.0   */
+       { 0xA, 0x5E, 0x3F, 0x00, 0x00 },        /* 450   450      0.0   */
+       { 0xB, 0x69, 0x3F, 0x00, 0x00 },        /* 600   600      0.0   */
+       { 0xB, 0x79, 0x35, 0x00, 0x0A },        /* 600   850      3.0   */
+       { 0x6, 0x7D, 0x32, 0x00, 0x0D },        /* 600   1000     4.4   */
+       { 0x5, 0x76, 0x3F, 0x00, 0x00 },        /* 800   800      0.0   */
+       { 0x6, 0x7D, 0x39, 0x00, 0x06 },        /* 800   1000     1.9   */
+       { 0x6, 0x7F, 0x39, 0x00, 0x06 },        /* 850   1050     1.8   */
+       { 0x6, 0x7F, 0x3F, 0x00, 0x00 },        /* 1050  1050     0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 0.95V for eDP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_95V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x61, 0x3A, 0x00, 0x05 },        /* 384   500      2.3   */
+       { 0x0, 0x7F, 0x38, 0x00, 0x07 },        /* 153   200      2.3   */
+       { 0x8, 0x7F, 0x38, 0x00, 0x07 },        /* 192   250      2.3   */
+       { 0x1, 0x7F, 0x38, 0x00, 0x07 },        /* 230   300      2.3   */
+       { 0x9, 0x7F, 0x38, 0x00, 0x07 },        /* 269   350      2.3   */
+       { 0xA, 0x61, 0x3C, 0x00, 0x03 },        /* 446   500      1.0   */
+       { 0xB, 0x68, 0x39, 0x00, 0x06 },        /* 460   600      2.3   */
+       { 0xC, 0x6E, 0x39, 0x00, 0x06 },        /* 537   700      2.3   */
+       { 0x4, 0x7F, 0x3A, 0x00, 0x05 },        /* 460   600      2.3   */
+       { 0x2, 0x7F, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 1.05V for DP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_1_05V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x58, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+       { 0xB, 0x64, 0x37, 0x00, 0x08 },        /* 400   600      3.5   */
+       { 0x5, 0x70, 0x31, 0x00, 0x0E },        /* 400   800      6.0   */
+       { 0x6, 0x7F, 0x2C, 0x00, 0x13 },        /* 400   1050     8.4   */
+       { 0xB, 0x64, 0x3F, 0x00, 0x00 },        /* 600   600      0.0   */
+       { 0x5, 0x73, 0x35, 0x00, 0x0A },        /* 600   850      3.0   */
+       { 0x6, 0x7F, 0x30, 0x00, 0x0F },        /* 550   1050     5.6   */
+       { 0x5, 0x76, 0x3E, 0x00, 0x01 },        /* 850   900      0.5   */
+       { 0x6, 0x7F, 0x36, 0x00, 0x09 },        /* 750   1050     2.9   */
+       { 0x6, 0x7F, 0x3F, 0x00, 0x00 },        /* 1050  1050     0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 1.05V for HDMI */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_1_05V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x58, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+       { 0xB, 0x64, 0x37, 0x00, 0x08 },        /* 400   600      3.5   */
+       { 0x5, 0x70, 0x31, 0x00, 0x0E },        /* 400   800      6.0   */
+       { 0xA, 0x5B, 0x3F, 0x00, 0x00 },        /* 450   450      0.0   */
+       { 0xB, 0x64, 0x3F, 0x00, 0x00 },        /* 600   600      0.0   */
+       { 0x5, 0x73, 0x35, 0x00, 0x0A },        /* 600   850      3.0   */
+       { 0x6, 0x7C, 0x32, 0x00, 0x0D },        /* 600   1000     4.4   */
+       { 0x5, 0x70, 0x3F, 0x00, 0x00 },        /* 800   800      0.0   */
+       { 0x6, 0x7C, 0x39, 0x00, 0x06 },        /* 800   1000     1.9   */
+       { 0x6, 0x7F, 0x39, 0x00, 0x06 },        /* 850   1050     1.8   */
+       { 0x6, 0x7F, 0x3F, 0x00, 0x00 },        /* 1050  1050     0.0   */
+};
+
+/* Voltage Swing Programming for VccIO 1.05V for eDP */
+static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_1_05V[] = {
+                                               /* NT mV Trans mV db    */
+       { 0xA, 0x5E, 0x3A, 0x00, 0x05 },        /* 384   500      2.3   */
+       { 0x0, 0x7F, 0x38, 0x00, 0x07 },        /* 153   200      2.3   */
+       { 0x8, 0x7F, 0x38, 0x00, 0x07 },        /* 192   250      2.3   */
+       { 0x1, 0x7F, 0x38, 0x00, 0x07 },        /* 230   300      2.3   */
+       { 0x9, 0x7F, 0x38, 0x00, 0x07 },        /* 269   350      2.3   */
+       { 0xA, 0x5E, 0x3C, 0x00, 0x03 },        /* 446   500      1.0   */
+       { 0xB, 0x64, 0x39, 0x00, 0x06 },        /* 460   600      2.3   */
+       { 0xE, 0x6A, 0x39, 0x00, 0x06 },        /* 537   700      2.3   */
+       { 0x2, 0x7F, 0x3F, 0x00, 0x00 },        /* 400   400      0.0   */
+};
+
 enum port intel_ddi_get_encoder_port(struct intel_encoder *encoder)
 {
        switch (encoder->type) {