@@ -434,6 +434,48 @@ display_crc_ctl_parse_source(const char *buf, enum intel_pipe_crc_source *s)
434434 return 0 ;
435435}
436436
437+ static int intel_crtc_change_crc_region (struct drm_i915_private * dev_priv ,
438+ struct intel_crtc * crtc ,
439+ enum pipe pipe ,
440+ enum intel_pipe_crc_source * source , u32 * val )
441+ {
442+ struct display_region * region ;/* = &dev_priv->regions[dev_priv->next_region++];*/
443+ struct drm_checksum_region * region_data =
444+ (struct drm_checksum_region * )crtc -> config -> hw .region_blob -> data ;
445+ u32 reg_val = 0 ;
446+
447+ region -> x = region_data -> x_start ;
448+ region -> y = region_data -> y_start ;
449+ region -> width = region_data -> x_end - region_data -> x_start ;
450+ region -> height = region_data -> y_end - region_data -> y_start ;
451+ #if 0
452+ intel_de_write (dev_priv , PIPE_CRC_CTL (pipe ), val );
453+ intel_de_posting_read (dev_priv , PIPE_CRC_CTL (pipe ));
454+ #endif
455+ reg_val = intel_de_read (dev_priv , PIPE_CRC_REGIONAL_SIZE (pipe ));
456+ reg_val &= ~PIPE_CRC_REGIONAL_SIZE_Y_MASK ;
457+ reg_val |= (region -> height << PIPE_CRC_REGIONAL_SIZE_Y_SHIFT ) & PIPE_CRC_REGIONAL_SIZE_Y_MASK ;
458+ reg_val &= ~PIPE_CRC_REGIONAL_SIZE_X_MASK ;
459+ reg_val |= (region -> width << PIPE_CRC_REGIONAL_SIZE_X_SHIFT ) & PIPE_CRC_REGIONAL_SIZE_X_MASK ;
460+ intel_de_write (dev_priv , PIPE_CRC_REGIONAL_SIZE (pipe ), reg_val );
461+ intel_de_posting_read (dev_priv , PIPE_CRC_REGIONAL_SIZE (pipe ));
462+
463+ reg_val = intel_de_read (dev_priv , PIPE_CRC_REGIONAL_POS (pipe ));
464+ reg_val &= ~PIPE_CRC_REGIONAL_POS_Y_MASK ;
465+ reg_val |= (region -> y << PIPE_CRC_REGIONAL_POS_Y_SHIFT ) & PIPE_CRC_REGIONAL_POS_Y_MASK ;
466+ reg_val &= ~PIPE_CRC_REGIONAL_POS_X_MASK ;
467+ reg_val |= (region -> x << PIPE_CRC_REGIONAL_POS_X_SHIFT ) & PIPE_CRC_REGIONAL_POS_X_MASK ;
468+ intel_de_write (dev_priv , PIPE_CRC_REGIONAL_POS (pipe ), reg_val );
469+ intel_de_posting_read (dev_priv , PIPE_CRC_REGIONAL_POS (pipe ));
470+ #if 0
471+ if (dev_priv -> next_region == dev_priv -> region_cnt ) {
472+ dev_priv -> next_region = 0 ;
473+ }
474+ #endif
475+ return 0 ;
476+ }
477+
478+
437479void intel_crtc_crc_init (struct intel_crtc * crtc )
438480{
439481 struct intel_pipe_crc * pipe_crc = & crtc -> pipe_crc ;
@@ -608,6 +650,8 @@ int intel_crtc_set_crc_source(struct drm_crtc *_crtc, const char *source_name)
608650 goto out ;
609651
610652 pipe_crc -> source = source ;
653+
654+ intel_crtc_change_crc_region (dev_priv , crtc , pipe , & source , & val );
611655 intel_de_write (dev_priv , PIPE_CRC_CTL (pipe ), val );
612656 intel_de_posting_read (dev_priv , PIPE_CRC_CTL (pipe ));
613657
0 commit comments