@@ -2127,65 +2127,126 @@ bool dce110_configure_crc(struct timing_generator *tg,
21272127
21282128 cntl_addr = CRTC_REG (mmCRTC_CRC_CNTL );
21292129
2130- /* First, disable CRC before we configure it. */
2131- dm_write_reg (tg -> ctx , cntl_addr , 0 );
2130+ if (!params -> enable || params -> reset )
2131+ /* First, disable CRC before we configure it. */
2132+ dm_write_reg (tg -> ctx , cntl_addr , 0 );
21322133
21332134 if (!params -> enable )
21342135 return true;
21352136
21362137 /* Program frame boundaries */
2137- /* Window A x axis start and end. */
2138- value = 0 ;
2139- addr = CRTC_REG (mmCRTC_CRC0_WINDOWA_X_CONTROL );
2140- set_reg_field_value (value , params -> windowa_x_start ,
2141- CRTC_CRC0_WINDOWA_X_CONTROL ,
2142- CRTC_CRC0_WINDOWA_X_START );
2143- set_reg_field_value (value , params -> windowa_x_end ,
2144- CRTC_CRC0_WINDOWA_X_CONTROL ,
2145- CRTC_CRC0_WINDOWA_X_END );
2146- dm_write_reg (tg -> ctx , addr , value );
2147-
2148- /* Window A y axis start and end. */
2149- value = 0 ;
2150- addr = CRTC_REG (mmCRTC_CRC0_WINDOWA_Y_CONTROL );
2151- set_reg_field_value (value , params -> windowa_y_start ,
2152- CRTC_CRC0_WINDOWA_Y_CONTROL ,
2153- CRTC_CRC0_WINDOWA_Y_START );
2154- set_reg_field_value (value , params -> windowa_y_end ,
2155- CRTC_CRC0_WINDOWA_Y_CONTROL ,
2156- CRTC_CRC0_WINDOWA_Y_END );
2157- dm_write_reg (tg -> ctx , addr , value );
2158-
2159- /* Window B x axis start and end. */
2160- value = 0 ;
2161- addr = CRTC_REG (mmCRTC_CRC0_WINDOWB_X_CONTROL );
2162- set_reg_field_value (value , params -> windowb_x_start ,
2163- CRTC_CRC0_WINDOWB_X_CONTROL ,
2164- CRTC_CRC0_WINDOWB_X_START );
2165- set_reg_field_value (value , params -> windowb_x_end ,
2166- CRTC_CRC0_WINDOWB_X_CONTROL ,
2167- CRTC_CRC0_WINDOWB_X_END );
2168- dm_write_reg (tg -> ctx , addr , value );
2169-
2170- /* Window B y axis start and end. */
2171- value = 0 ;
2172- addr = CRTC_REG (mmCRTC_CRC0_WINDOWB_Y_CONTROL );
2173- set_reg_field_value (value , params -> windowb_y_start ,
2174- CRTC_CRC0_WINDOWB_Y_CONTROL ,
2175- CRTC_CRC0_WINDOWB_Y_START );
2176- set_reg_field_value (value , params -> windowb_y_end ,
2177- CRTC_CRC0_WINDOWB_Y_CONTROL ,
2178- CRTC_CRC0_WINDOWB_Y_END );
2179- dm_write_reg (tg -> ctx , addr , value );
2180-
2181- /* Set crc mode and selection, and enable. Only using CRC0*/
2182- value = 0 ;
2183- set_reg_field_value (value , params -> continuous_mode ? 1 : 0 ,
2184- CRTC_CRC_CNTL , CRTC_CRC_CONT_EN );
2185- set_reg_field_value (value , params -> selection ,
2186- CRTC_CRC_CNTL , CRTC_CRC0_SELECT );
2187- set_reg_field_value (value , 1 , CRTC_CRC_CNTL , CRTC_CRC_EN );
2188- dm_write_reg (tg -> ctx , cntl_addr , value );
2138+ switch (params -> crc_eng_inst ) {
2139+ case 0 :
2140+ /* Window A x axis start and end. */
2141+ value = 0 ;
2142+ addr = CRTC_REG (mmCRTC_CRC0_WINDOWA_X_CONTROL );
2143+ set_reg_field_value (value , params -> windowa_x_start ,
2144+ CRTC_CRC0_WINDOWA_X_CONTROL ,
2145+ CRTC_CRC0_WINDOWA_X_START );
2146+ set_reg_field_value (value , params -> windowa_x_end ,
2147+ CRTC_CRC0_WINDOWA_X_CONTROL ,
2148+ CRTC_CRC0_WINDOWA_X_END );
2149+ dm_write_reg (tg -> ctx , addr , value );
2150+
2151+ /* Window A y axis start and end. */
2152+ value = 0 ;
2153+ addr = CRTC_REG (mmCRTC_CRC0_WINDOWA_Y_CONTROL );
2154+ set_reg_field_value (value , params -> windowa_y_start ,
2155+ CRTC_CRC0_WINDOWA_Y_CONTROL ,
2156+ CRTC_CRC0_WINDOWA_Y_START );
2157+ set_reg_field_value (value , params -> windowa_y_end ,
2158+ CRTC_CRC0_WINDOWA_Y_CONTROL ,
2159+ CRTC_CRC0_WINDOWA_Y_END );
2160+ dm_write_reg (tg -> ctx , addr , value );
2161+
2162+ /* Window B x axis start and end. */
2163+ value = 0 ;
2164+ addr = CRTC_REG (mmCRTC_CRC0_WINDOWB_X_CONTROL );
2165+ set_reg_field_value (value , params -> windowb_x_start ,
2166+ CRTC_CRC0_WINDOWB_X_CONTROL ,
2167+ CRTC_CRC0_WINDOWB_X_START );
2168+ set_reg_field_value (value , params -> windowb_x_end ,
2169+ CRTC_CRC0_WINDOWB_X_CONTROL ,
2170+ CRTC_CRC0_WINDOWB_X_END );
2171+ dm_write_reg (tg -> ctx , addr , value );
2172+
2173+ /* Window B y axis start and end. */
2174+ value = 0 ;
2175+ addr = CRTC_REG (mmCRTC_CRC0_WINDOWB_Y_CONTROL );
2176+ set_reg_field_value (value , params -> windowb_y_start ,
2177+ CRTC_CRC0_WINDOWB_Y_CONTROL ,
2178+ CRTC_CRC0_WINDOWB_Y_START );
2179+ set_reg_field_value (value , params -> windowb_y_end ,
2180+ CRTC_CRC0_WINDOWB_Y_CONTROL ,
2181+ CRTC_CRC0_WINDOWB_Y_END );
2182+ dm_write_reg (tg -> ctx , addr , value );
2183+
2184+ /* Set crc mode and selection, and enable.*/
2185+ value = 0 ;
2186+ set_reg_field_value (value , params -> continuous_mode ? 1 : 0 ,
2187+ CRTC_CRC_CNTL , CRTC_CRC_CONT_EN );
2188+ set_reg_field_value (value , params -> selection ,
2189+ CRTC_CRC_CNTL , CRTC_CRC0_SELECT );
2190+ set_reg_field_value (value , 1 , CRTC_CRC_CNTL , CRTC_CRC_EN );
2191+ dm_write_reg (tg -> ctx , cntl_addr , value );
2192+ break ;
2193+ case 1 :
2194+ /* Window A x axis start and end. */
2195+ value = 0 ;
2196+ addr = CRTC_REG (mmCRTC_CRC1_WINDOWA_X_CONTROL );
2197+ set_reg_field_value (value , params -> windowa_x_start ,
2198+ CRTC_CRC1_WINDOWA_X_CONTROL ,
2199+ CRTC_CRC1_WINDOWA_X_START );
2200+ set_reg_field_value (value , params -> windowa_x_end ,
2201+ CRTC_CRC1_WINDOWA_X_CONTROL ,
2202+ CRTC_CRC1_WINDOWA_X_END );
2203+ dm_write_reg (tg -> ctx , addr , value );
2204+
2205+ /* Window A y axis start and end. */
2206+ value = 0 ;
2207+ addr = CRTC_REG (mmCRTC_CRC1_WINDOWA_Y_CONTROL );
2208+ set_reg_field_value (value , params -> windowa_y_start ,
2209+ CRTC_CRC1_WINDOWA_Y_CONTROL ,
2210+ CRTC_CRC1_WINDOWA_Y_START );
2211+ set_reg_field_value (value , params -> windowa_y_end ,
2212+ CRTC_CRC1_WINDOWA_Y_CONTROL ,
2213+ CRTC_CRC1_WINDOWA_Y_END );
2214+ dm_write_reg (tg -> ctx , addr , value );
2215+
2216+ /* Window B x axis start and end. */
2217+ value = 0 ;
2218+ addr = CRTC_REG (mmCRTC_CRC1_WINDOWB_X_CONTROL );
2219+ set_reg_field_value (value , params -> windowb_x_start ,
2220+ CRTC_CRC1_WINDOWB_X_CONTROL ,
2221+ CRTC_CRC1_WINDOWB_X_START );
2222+ set_reg_field_value (value , params -> windowb_x_end ,
2223+ CRTC_CRC1_WINDOWB_X_CONTROL ,
2224+ CRTC_CRC1_WINDOWB_X_END );
2225+ dm_write_reg (tg -> ctx , addr , value );
2226+
2227+ /* Window B y axis start and end. */
2228+ value = 0 ;
2229+ addr = CRTC_REG (mmCRTC_CRC1_WINDOWB_Y_CONTROL );
2230+ set_reg_field_value (value , params -> windowb_y_start ,
2231+ CRTC_CRC1_WINDOWB_Y_CONTROL ,
2232+ CRTC_CRC1_WINDOWB_Y_START );
2233+ set_reg_field_value (value , params -> windowb_y_end ,
2234+ CRTC_CRC1_WINDOWB_Y_CONTROL ,
2235+ CRTC_CRC1_WINDOWB_Y_END );
2236+ dm_write_reg (tg -> ctx , addr , value );
2237+
2238+ /* Set crc mode and selection, and enable.*/
2239+ value = 0 ;
2240+ set_reg_field_value (value , params -> continuous_mode ? 1 : 0 ,
2241+ CRTC_CRC_CNTL , CRTC_CRC_CONT_EN );
2242+ set_reg_field_value (value , params -> selection ,
2243+ CRTC_CRC_CNTL , CRTC_CRC1_SELECT );
2244+ set_reg_field_value (value , 1 , CRTC_CRC_CNTL , CRTC_CRC_EN );
2245+ dm_write_reg (tg -> ctx , cntl_addr , value );
2246+ break ;
2247+ default :
2248+ return false;
2249+ }
21892250
21902251 return true;
21912252}
0 commit comments