@@ -2127,65 +2127,126 @@ bool dce110_configure_crc(struct timing_generator *tg,
2127
2127
2128
2128
cntl_addr = CRTC_REG (mmCRTC_CRC_CNTL );
2129
2129
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 );
2132
2133
2133
2134
if (!params -> enable )
2134
2135
return true;
2135
2136
2136
2137
/* 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
+ }
2189
2250
2190
2251
return true;
2191
2252
}
0 commit comments