mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 15:11:50 +00:00
drm/radeon/kms: display watermark updates (v2)
- Add module option to force the display priority 0 = auto, 1 = normal, 2 = high - Default to high on r3xx/r4xx/rv515 chips Fixes flickering problems during heavy acceleration due to underflow to the display controllers - Fill in minimal support for RS600 v2 - update display priority when bandwidth is updated so the user can change the parameter at runtime and it will take affect on the next modeset. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
3b01a1191f
commit
f46c01208d
@ -2389,6 +2389,8 @@ void r100_bandwidth_update(struct radeon_device *rdev)
|
|||||||
uint32_t pixel_bytes1 = 0;
|
uint32_t pixel_bytes1 = 0;
|
||||||
uint32_t pixel_bytes2 = 0;
|
uint32_t pixel_bytes2 = 0;
|
||||||
|
|
||||||
|
radeon_update_display_priority(rdev);
|
||||||
|
|
||||||
if (rdev->mode_info.crtcs[0]->base.enabled) {
|
if (rdev->mode_info.crtcs[0]->base.enabled) {
|
||||||
mode1 = &rdev->mode_info.crtcs[0]->base.mode;
|
mode1 = &rdev->mode_info.crtcs[0]->base.mode;
|
||||||
pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8;
|
pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8;
|
||||||
|
@ -91,6 +91,7 @@ extern int radeon_tv;
|
|||||||
extern int radeon_new_pll;
|
extern int radeon_new_pll;
|
||||||
extern int radeon_dynpm;
|
extern int radeon_dynpm;
|
||||||
extern int radeon_audio;
|
extern int radeon_audio;
|
||||||
|
extern int radeon_disp_priority;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy from radeon_drv.h so we don't have to include both and have conflicting
|
* Copy from radeon_drv.h so we don't have to include both and have conflicting
|
||||||
@ -1181,6 +1182,7 @@ extern int radeon_modeset_init(struct radeon_device *rdev);
|
|||||||
extern void radeon_modeset_fini(struct radeon_device *rdev);
|
extern void radeon_modeset_fini(struct radeon_device *rdev);
|
||||||
extern bool radeon_card_posted(struct radeon_device *rdev);
|
extern bool radeon_card_posted(struct radeon_device *rdev);
|
||||||
extern void radeon_update_bandwidth_info(struct radeon_device *rdev);
|
extern void radeon_update_bandwidth_info(struct radeon_device *rdev);
|
||||||
|
extern void radeon_update_display_priority(struct radeon_device *rdev);
|
||||||
extern bool radeon_boot_test_post_card(struct radeon_device *rdev);
|
extern bool radeon_boot_test_post_card(struct radeon_device *rdev);
|
||||||
extern int radeon_clocks_init(struct radeon_device *rdev);
|
extern int radeon_clocks_init(struct radeon_device *rdev);
|
||||||
extern void radeon_clocks_fini(struct radeon_device *rdev);
|
extern void radeon_clocks_fini(struct radeon_device *rdev);
|
||||||
|
@ -971,6 +971,23 @@ static int radeon_modeset_create_props(struct radeon_device *rdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void radeon_update_display_priority(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
/* adjustment options for the display watermarks */
|
||||||
|
if ((radeon_disp_priority == 0) || (radeon_disp_priority > 2)) {
|
||||||
|
/* set display priority to high for r3xx, rv515 chips
|
||||||
|
* this avoids flickering due to underflow to the
|
||||||
|
* display controllers during heavy acceleration.
|
||||||
|
*/
|
||||||
|
if (ASIC_IS_R300(rdev) || (rdev->family == CHIP_RV515))
|
||||||
|
rdev->disp_priority = 2;
|
||||||
|
else
|
||||||
|
rdev->disp_priority = 0;
|
||||||
|
} else
|
||||||
|
rdev->disp_priority = radeon_disp_priority;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int radeon_modeset_init(struct radeon_device *rdev)
|
int radeon_modeset_init(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -92,6 +92,7 @@ int radeon_tv = 1;
|
|||||||
int radeon_new_pll = -1;
|
int radeon_new_pll = -1;
|
||||||
int radeon_dynpm = -1;
|
int radeon_dynpm = -1;
|
||||||
int radeon_audio = 1;
|
int radeon_audio = 1;
|
||||||
|
int radeon_disp_priority = 0;
|
||||||
|
|
||||||
MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
|
MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
|
||||||
module_param_named(no_wb, radeon_no_wb, int, 0444);
|
module_param_named(no_wb, radeon_no_wb, int, 0444);
|
||||||
@ -135,6 +136,9 @@ module_param_named(dynpm, radeon_dynpm, int, 0444);
|
|||||||
MODULE_PARM_DESC(audio, "Audio enable (0 = disable)");
|
MODULE_PARM_DESC(audio, "Audio enable (0 = disable)");
|
||||||
module_param_named(audio, radeon_audio, int, 0444);
|
module_param_named(audio, radeon_audio, int, 0444);
|
||||||
|
|
||||||
|
MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)");
|
||||||
|
module_param_named(disp_priority, radeon_disp_priority, int, 0444);
|
||||||
|
|
||||||
static int radeon_suspend(struct drm_device *dev, pm_message_t state)
|
static int radeon_suspend(struct drm_device *dev, pm_message_t state)
|
||||||
{
|
{
|
||||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||||
|
@ -483,7 +483,30 @@ void rs600_mc_init(struct radeon_device *rdev)
|
|||||||
|
|
||||||
void rs600_bandwidth_update(struct radeon_device *rdev)
|
void rs600_bandwidth_update(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
/* FIXME: implement, should this be like rs690 ? */
|
struct drm_display_mode *mode0 = NULL;
|
||||||
|
struct drm_display_mode *mode1 = NULL;
|
||||||
|
u32 d1mode_priority_a_cnt, d2mode_priority_a_cnt;
|
||||||
|
/* FIXME: implement full support */
|
||||||
|
|
||||||
|
radeon_update_display_priority(rdev);
|
||||||
|
|
||||||
|
if (rdev->mode_info.crtcs[0]->base.enabled)
|
||||||
|
mode0 = &rdev->mode_info.crtcs[0]->base.mode;
|
||||||
|
if (rdev->mode_info.crtcs[1]->base.enabled)
|
||||||
|
mode1 = &rdev->mode_info.crtcs[1]->base.mode;
|
||||||
|
|
||||||
|
rs690_line_buffer_adjust(rdev, mode0, mode1);
|
||||||
|
|
||||||
|
if (rdev->disp_priority == 2) {
|
||||||
|
d1mode_priority_a_cnt = RREG32(R_006548_D1MODE_PRIORITY_A_CNT);
|
||||||
|
d2mode_priority_a_cnt = RREG32(R_006D48_D2MODE_PRIORITY_A_CNT);
|
||||||
|
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
|
d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
|
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||||
|
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||||
|
@ -535,4 +535,57 @@
|
|||||||
#define G_00016C_INVALIDATE_L1_TLB(x) (((x) >> 20) & 0x1)
|
#define G_00016C_INVALIDATE_L1_TLB(x) (((x) >> 20) & 0x1)
|
||||||
#define C_00016C_INVALIDATE_L1_TLB 0xFFEFFFFF
|
#define C_00016C_INVALIDATE_L1_TLB 0xFFEFFFFF
|
||||||
|
|
||||||
|
#define R_006548_D1MODE_PRIORITY_A_CNT 0x006548
|
||||||
|
#define S_006548_D1MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0)
|
||||||
|
#define G_006548_D1MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF)
|
||||||
|
#define C_006548_D1MODE_PRIORITY_MARK_A 0xFFFF8000
|
||||||
|
#define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
||||||
|
#define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
||||||
|
#define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
||||||
|
#define S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||||
|
#define G_006548_D1MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||||
|
#define C_006548_D1MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF
|
||||||
|
#define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||||
|
#define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||||
|
#define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
||||||
|
#define R_00654C_D1MODE_PRIORITY_B_CNT 0x00654C
|
||||||
|
#define S_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0)
|
||||||
|
#define G_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF)
|
||||||
|
#define C_00654C_D1MODE_PRIORITY_MARK_B 0xFFFF8000
|
||||||
|
#define S_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16)
|
||||||
|
#define G_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1)
|
||||||
|
#define C_00654C_D1MODE_PRIORITY_B_OFF 0xFFFEFFFF
|
||||||
|
#define S_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||||
|
#define G_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||||
|
#define C_00654C_D1MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF
|
||||||
|
#define S_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||||
|
#define G_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||||
|
#define C_00654C_D1MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF
|
||||||
|
#define R_006D48_D2MODE_PRIORITY_A_CNT 0x006D48
|
||||||
|
#define S_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0)
|
||||||
|
#define G_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF)
|
||||||
|
#define C_006D48_D2MODE_PRIORITY_MARK_A 0xFFFF8000
|
||||||
|
#define S_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
||||||
|
#define G_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
||||||
|
#define C_006D48_D2MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
||||||
|
#define S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||||
|
#define G_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||||
|
#define C_006D48_D2MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF
|
||||||
|
#define S_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||||
|
#define G_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||||
|
#define C_006D48_D2MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
||||||
|
#define R_006D4C_D2MODE_PRIORITY_B_CNT 0x006D4C
|
||||||
|
#define S_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0)
|
||||||
|
#define G_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF)
|
||||||
|
#define C_006D4C_D2MODE_PRIORITY_MARK_B 0xFFFF8000
|
||||||
|
#define S_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16)
|
||||||
|
#define G_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1)
|
||||||
|
#define C_006D4C_D2MODE_PRIORITY_B_OFF 0xFFFEFFFF
|
||||||
|
#define S_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||||
|
#define G_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||||
|
#define C_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF
|
||||||
|
#define S_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||||
|
#define G_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||||
|
#define C_006D4C_D2MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -400,10 +400,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||||||
struct drm_display_mode *mode1 = NULL;
|
struct drm_display_mode *mode1 = NULL;
|
||||||
struct rs690_watermark wm0;
|
struct rs690_watermark wm0;
|
||||||
struct rs690_watermark wm1;
|
struct rs690_watermark wm1;
|
||||||
u32 tmp;
|
u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt;
|
||||||
fixed20_12 priority_mark02, priority_mark12, fill_rate;
|
fixed20_12 priority_mark02, priority_mark12, fill_rate;
|
||||||
fixed20_12 a, b;
|
fixed20_12 a, b;
|
||||||
|
|
||||||
|
radeon_update_display_priority(rdev);
|
||||||
|
|
||||||
if (rdev->mode_info.crtcs[0]->base.enabled)
|
if (rdev->mode_info.crtcs[0]->base.enabled)
|
||||||
mode0 = &rdev->mode_info.crtcs[0]->base.mode;
|
mode0 = &rdev->mode_info.crtcs[0]->base.mode;
|
||||||
if (rdev->mode_info.crtcs[1]->base.enabled)
|
if (rdev->mode_info.crtcs[1]->base.enabled)
|
||||||
@ -413,7 +415,8 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||||||
* modes if the user specifies HIGH for displaypriority
|
* modes if the user specifies HIGH for displaypriority
|
||||||
* option.
|
* option.
|
||||||
*/
|
*/
|
||||||
if (rdev->disp_priority == 2) {
|
if ((rdev->disp_priority == 2) &&
|
||||||
|
((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740))) {
|
||||||
tmp = RREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER);
|
tmp = RREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER);
|
||||||
tmp &= C_000104_MC_DISP0R_INIT_LAT;
|
tmp &= C_000104_MC_DISP0R_INIT_LAT;
|
||||||
tmp &= C_000104_MC_DISP1R_INIT_LAT;
|
tmp &= C_000104_MC_DISP1R_INIT_LAT;
|
||||||
@ -488,10 +491,16 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||||||
priority_mark12.full = 0;
|
priority_mark12.full = 0;
|
||||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||||
priority_mark12.full = wm1.priority_mark_max.full;
|
priority_mark12.full = wm1.priority_mark_max.full;
|
||||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
d1mode_priority_a_cnt = rfixed_trunc(priority_mark02);
|
||||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
d2mode_priority_a_cnt = rfixed_trunc(priority_mark12);
|
||||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
if (rdev->disp_priority == 2) {
|
||||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
|
d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
|
}
|
||||||
|
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||||
|
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||||
} else if (mode0) {
|
} else if (mode0) {
|
||||||
if (rfixed_trunc(wm0.dbpp) > 64)
|
if (rfixed_trunc(wm0.dbpp) > 64)
|
||||||
a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair);
|
a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair);
|
||||||
@ -518,8 +527,11 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||||||
priority_mark02.full = 0;
|
priority_mark02.full = 0;
|
||||||
if (wm0.priority_mark_max.full > priority_mark02.full)
|
if (wm0.priority_mark_max.full > priority_mark02.full)
|
||||||
priority_mark02.full = wm0.priority_mark_max.full;
|
priority_mark02.full = wm0.priority_mark_max.full;
|
||||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
d1mode_priority_a_cnt = rfixed_trunc(priority_mark02);
|
||||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
if (rdev->disp_priority == 2)
|
||||||
|
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
|
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);
|
||||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT,
|
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT,
|
||||||
S_006D48_D2MODE_PRIORITY_A_OFF(1));
|
S_006D48_D2MODE_PRIORITY_A_OFF(1));
|
||||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT,
|
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT,
|
||||||
@ -550,12 +562,15 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||||||
priority_mark12.full = 0;
|
priority_mark12.full = 0;
|
||||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||||
priority_mark12.full = wm1.priority_mark_max.full;
|
priority_mark12.full = wm1.priority_mark_max.full;
|
||||||
|
d2mode_priority_a_cnt = rfixed_trunc(priority_mark12);
|
||||||
|
if (rdev->disp_priority == 2)
|
||||||
|
d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT,
|
WREG32(R_006548_D1MODE_PRIORITY_A_CNT,
|
||||||
S_006548_D1MODE_PRIORITY_A_OFF(1));
|
S_006548_D1MODE_PRIORITY_A_OFF(1));
|
||||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT,
|
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT,
|
||||||
S_00654C_D1MODE_PRIORITY_B_OFF(1));
|
S_00654C_D1MODE_PRIORITY_B_OFF(1));
|
||||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,6 +182,9 @@
|
|||||||
#define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
#define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
||||||
#define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
#define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
||||||
#define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
#define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
||||||
|
#define S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||||
|
#define G_006548_D1MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||||
|
#define C_006548_D1MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF
|
||||||
#define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
#define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||||
#define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
#define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||||
#define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
#define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
||||||
|
@ -1016,7 +1016,7 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
|||||||
struct drm_display_mode *mode1 = NULL;
|
struct drm_display_mode *mode1 = NULL;
|
||||||
struct rv515_watermark wm0;
|
struct rv515_watermark wm0;
|
||||||
struct rv515_watermark wm1;
|
struct rv515_watermark wm1;
|
||||||
u32 tmp;
|
u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt;
|
||||||
fixed20_12 priority_mark02, priority_mark12, fill_rate;
|
fixed20_12 priority_mark02, priority_mark12, fill_rate;
|
||||||
fixed20_12 a, b;
|
fixed20_12 a, b;
|
||||||
|
|
||||||
@ -1084,10 +1084,16 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
|||||||
priority_mark12.full = 0;
|
priority_mark12.full = 0;
|
||||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||||
priority_mark12.full = wm1.priority_mark_max.full;
|
priority_mark12.full = wm1.priority_mark_max.full;
|
||||||
WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
d1mode_priority_a_cnt = rfixed_trunc(priority_mark02);
|
||||||
WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
d2mode_priority_a_cnt = rfixed_trunc(priority_mark12);
|
||||||
WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
if (rdev->disp_priority == 2) {
|
||||||
WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||||
|
d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||||
|
}
|
||||||
|
WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||||
|
WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||||
} else if (mode0) {
|
} else if (mode0) {
|
||||||
if (rfixed_trunc(wm0.dbpp) > 64)
|
if (rfixed_trunc(wm0.dbpp) > 64)
|
||||||
a.full = rfixed_div(wm0.dbpp, wm0.num_line_pair);
|
a.full = rfixed_div(wm0.dbpp, wm0.num_line_pair);
|
||||||
@ -1114,8 +1120,11 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
|||||||
priority_mark02.full = 0;
|
priority_mark02.full = 0;
|
||||||
if (wm0.priority_mark_max.full > priority_mark02.full)
|
if (wm0.priority_mark_max.full > priority_mark02.full)
|
||||||
priority_mark02.full = wm0.priority_mark_max.full;
|
priority_mark02.full = wm0.priority_mark_max.full;
|
||||||
WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
d1mode_priority_a_cnt = rfixed_trunc(priority_mark02);
|
||||||
WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
if (rdev->disp_priority == 2)
|
||||||
|
d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||||
|
WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||||
|
WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt);
|
||||||
WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
||||||
WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
||||||
} else {
|
} else {
|
||||||
@ -1144,10 +1153,13 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
|||||||
priority_mark12.full = 0;
|
priority_mark12.full = 0;
|
||||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||||
priority_mark12.full = wm1.priority_mark_max.full;
|
priority_mark12.full = wm1.priority_mark_max.full;
|
||||||
|
d2mode_priority_a_cnt = rfixed_trunc(priority_mark12);
|
||||||
|
if (rdev->disp_priority == 2)
|
||||||
|
d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||||
WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
||||||
WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
||||||
WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||||
WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,6 +1169,8 @@ void rv515_bandwidth_update(struct radeon_device *rdev)
|
|||||||
struct drm_display_mode *mode0 = NULL;
|
struct drm_display_mode *mode0 = NULL;
|
||||||
struct drm_display_mode *mode1 = NULL;
|
struct drm_display_mode *mode1 = NULL;
|
||||||
|
|
||||||
|
radeon_update_display_priority(rdev);
|
||||||
|
|
||||||
if (rdev->mode_info.crtcs[0]->base.enabled)
|
if (rdev->mode_info.crtcs[0]->base.enabled)
|
||||||
mode0 = &rdev->mode_info.crtcs[0]->base.mode;
|
mode0 = &rdev->mode_info.crtcs[0]->base.mode;
|
||||||
if (rdev->mode_info.crtcs[1]->base.enabled)
|
if (rdev->mode_info.crtcs[1]->base.enabled)
|
||||||
@ -1166,7 +1180,8 @@ void rv515_bandwidth_update(struct radeon_device *rdev)
|
|||||||
* modes if the user specifies HIGH for displaypriority
|
* modes if the user specifies HIGH for displaypriority
|
||||||
* option.
|
* option.
|
||||||
*/
|
*/
|
||||||
if (rdev->disp_priority == 2) {
|
if ((rdev->disp_priority == 2) &&
|
||||||
|
(rdev->family == CHIP_RV515)) {
|
||||||
tmp = RREG32_MC(MC_MISC_LAT_TIMER);
|
tmp = RREG32_MC(MC_MISC_LAT_TIMER);
|
||||||
tmp &= ~MC_DISP1R_INIT_LAT_MASK;
|
tmp &= ~MC_DISP1R_INIT_LAT_MASK;
|
||||||
tmp &= ~MC_DISP0R_INIT_LAT_MASK;
|
tmp &= ~MC_DISP0R_INIT_LAT_MASK;
|
||||||
|
Loading…
Reference in New Issue
Block a user