--- a/drivers/gpu/drm/radeon/cik.c 2014-05-26 15:00:23.668202048 +0800 +++ b/drivers/gpu/drm/radeon/cik.c 2014-05-26 15:03:01.280196776 +0800 @@ -7953,11 +7953,22 @@ struct radeon_connector *radeon_connector = to_radeon_connector(connector); bpc = radeon_get_monitor_bpc(connector); dither = radeon_connector->dither; + //dither found to be 0 in lvds laptop,don't know why dither is 0, + //it's value is read from BIOS, BIOS supposed know that dither should be 1 if in use of laptop LVDS panel + //just set dither to 1 if bpc is not equal to depth + dither = ((bpc*3) != encoder->crtc->fb->depth )?RADEON_FMT_DITHER_ENABLE:dither; + radeon_connector->dither = dither; } /* LVDS/eDP FMT is set up by atom */ - if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT) - return; + if (radeon_encoder->devices & ATOM_DEVICE_LCD_SUPPORT){ + //radeon driver suppose BIOS already set the "fmt_bit_depth_control" register well (0xa100,dithering enabled,6bpc panel) + //but function "atombios_set_encoder_crtc_source()" call bios with command "selectCRTC_Source" and set this register to 0, + //which causes color banding bug(see bugzilla[73911]) + //not sure whether command "selectCRTC_Source" hardcoded to clear the register or parameters radeon passed to bios + //indicts BIOS to clear the register. + //Anyway,just let driver set the register to a correct value is no harm. + } /* not needed for analog */ if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1) ||