Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Add missing encoder setup to DACnEncoderControl

Apparently the DAC encoder needs to be set up before use.
The BIOS parser in DC did not support this so I assumed it was
not necessary, but the DAC doesn't work without it on some GPUs.

Fixes: 69b29b894660 ("drm/amd/display: Hook up DAC to bios_parser_encoder_control")
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit bb5dfe2f5630ce344c654c705d28b4e20cb9d334)

authored by

Timur Kristóf and committed by
Alex Deucher
e0d20a76 fd40c146

+15 -12
+2 -2
drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
··· 763 763 return BP_RESULT_FAILURE; 764 764 765 765 return bp->cmd_tbl.dac1_encoder_control( 766 - bp, cntl->action == ENCODER_CONTROL_ENABLE, 766 + bp, cntl->action, 767 767 cntl->pixel_clock, ATOM_DAC1_PS2); 768 768 } else if (cntl->engine_id == ENGINE_ID_DACB) { 769 769 if (!bp->cmd_tbl.dac2_encoder_control) 770 770 return BP_RESULT_FAILURE; 771 771 772 772 return bp->cmd_tbl.dac2_encoder_control( 773 - bp, cntl->action == ENCODER_CONTROL_ENABLE, 773 + bp, cntl->action, 774 774 cntl->pixel_clock, ATOM_DAC1_PS2); 775 775 } 776 776
+11 -8
drivers/gpu/drm/amd/display/dc/bios/command_table.c
··· 1838 1838 1839 1839 static enum bp_result dac1_encoder_control_v1( 1840 1840 struct bios_parser *bp, 1841 - bool enable, 1841 + enum bp_encoder_control_action action, 1842 1842 uint32_t pixel_clock, 1843 1843 uint8_t dac_standard); 1844 1844 static enum bp_result dac2_encoder_control_v1( 1845 1845 struct bios_parser *bp, 1846 - bool enable, 1846 + enum bp_encoder_control_action action, 1847 1847 uint32_t pixel_clock, 1848 1848 uint8_t dac_standard); 1849 1849 ··· 1869 1869 1870 1870 static void dac_encoder_control_prepare_params( 1871 1871 DAC_ENCODER_CONTROL_PS_ALLOCATION *params, 1872 - bool enable, 1872 + enum bp_encoder_control_action action, 1873 1873 uint32_t pixel_clock, 1874 1874 uint8_t dac_standard) 1875 1875 { 1876 1876 params->ucDacStandard = dac_standard; 1877 - if (enable) 1877 + if (action == ENCODER_CONTROL_SETUP || 1878 + action == ENCODER_CONTROL_INIT) 1879 + params->ucAction = ATOM_ENCODER_INIT; 1880 + else if (action == ENCODER_CONTROL_ENABLE) 1878 1881 params->ucAction = ATOM_ENABLE; 1879 1882 else 1880 1883 params->ucAction = ATOM_DISABLE; ··· 1890 1887 1891 1888 static enum bp_result dac1_encoder_control_v1( 1892 1889 struct bios_parser *bp, 1893 - bool enable, 1890 + enum bp_encoder_control_action action, 1894 1891 uint32_t pixel_clock, 1895 1892 uint8_t dac_standard) 1896 1893 { ··· 1899 1896 1900 1897 dac_encoder_control_prepare_params( 1901 1898 &params, 1902 - enable, 1899 + action, 1903 1900 pixel_clock, 1904 1901 dac_standard); 1905 1902 ··· 1911 1908 1912 1909 static enum bp_result dac2_encoder_control_v1( 1913 1910 struct bios_parser *bp, 1914 - bool enable, 1911 + enum bp_encoder_control_action action, 1915 1912 uint32_t pixel_clock, 1916 1913 uint8_t dac_standard) 1917 1914 { ··· 1920 1917 1921 1918 dac_encoder_control_prepare_params( 1922 1919 &params, 1923 - enable, 1920 + action, 1924 1921 pixel_clock, 1925 1922 dac_standard); 1926 1923
+2 -2
drivers/gpu/drm/amd/display/dc/bios/command_table.h
··· 57 57 struct bp_crtc_source_select *bp_params); 58 58 enum bp_result (*dac1_encoder_control)( 59 59 struct bios_parser *bp, 60 - bool enable, 60 + enum bp_encoder_control_action action, 61 61 uint32_t pixel_clock, 62 62 uint8_t dac_standard); 63 63 enum bp_result (*dac2_encoder_control)( 64 64 struct bios_parser *bp, 65 - bool enable, 65 + enum bp_encoder_control_action action, 66 66 uint32_t pixel_clock, 67 67 uint8_t dac_standard); 68 68 enum bp_result (*dac1_output_control)(