|
@@ -50,23 +50,22 @@ intel_pch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
struct intel_crtc_config *pipe_config,
|
|
|
int fitting_mode)
|
|
|
{
|
|
|
- struct drm_display_mode *mode, *adjusted_mode;
|
|
|
+ struct drm_display_mode *adjusted_mode;
|
|
|
int x, y, width, height;
|
|
|
|
|
|
- mode = &pipe_config->requested_mode;
|
|
|
adjusted_mode = &pipe_config->adjusted_mode;
|
|
|
|
|
|
x = y = width = height = 0;
|
|
|
|
|
|
/* Native modes don't need fitting */
|
|
|
- if (adjusted_mode->hdisplay == mode->hdisplay &&
|
|
|
- adjusted_mode->vdisplay == mode->vdisplay)
|
|
|
+ if (adjusted_mode->hdisplay == pipe_config->pipe_src_w &&
|
|
|
+ adjusted_mode->vdisplay == pipe_config->pipe_src_h)
|
|
|
goto done;
|
|
|
|
|
|
switch (fitting_mode) {
|
|
|
case DRM_MODE_SCALE_CENTER:
|
|
|
- width = mode->hdisplay;
|
|
|
- height = mode->vdisplay;
|
|
|
+ width = pipe_config->pipe_src_w;
|
|
|
+ height = pipe_config->pipe_src_h;
|
|
|
x = (adjusted_mode->hdisplay - width + 1)/2;
|
|
|
y = (adjusted_mode->vdisplay - height + 1)/2;
|
|
|
break;
|
|
@@ -74,17 +73,17 @@ intel_pch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
case DRM_MODE_SCALE_ASPECT:
|
|
|
/* Scale but preserve the aspect ratio */
|
|
|
{
|
|
|
- u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay;
|
|
|
- u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay;
|
|
|
+ u32 scaled_width = adjusted_mode->hdisplay * pipe_config->pipe_src_h;
|
|
|
+ u32 scaled_height = pipe_config->pipe_src_w * adjusted_mode->vdisplay;
|
|
|
if (scaled_width > scaled_height) { /* pillar */
|
|
|
- width = scaled_height / mode->vdisplay;
|
|
|
+ width = scaled_height / pipe_config->pipe_src_h;
|
|
|
if (width & 1)
|
|
|
width++;
|
|
|
x = (adjusted_mode->hdisplay - width + 1) / 2;
|
|
|
y = 0;
|
|
|
height = adjusted_mode->vdisplay;
|
|
|
} else if (scaled_width < scaled_height) { /* letter */
|
|
|
- height = scaled_width / mode->hdisplay;
|
|
|
+ height = scaled_width / pipe_config->pipe_src_w;
|
|
|
if (height & 1)
|
|
|
height++;
|
|
|
y = (adjusted_mode->vdisplay - height + 1) / 2;
|
|
@@ -176,14 +175,13 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
{
|
|
|
struct drm_device *dev = intel_crtc->base.dev;
|
|
|
u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
|
|
|
- struct drm_display_mode *mode, *adjusted_mode;
|
|
|
+ struct drm_display_mode *adjusted_mode;
|
|
|
|
|
|
- mode = &pipe_config->requested_mode;
|
|
|
adjusted_mode = &pipe_config->adjusted_mode;
|
|
|
|
|
|
/* Native modes don't need fitting */
|
|
|
- if (adjusted_mode->hdisplay == mode->hdisplay &&
|
|
|
- adjusted_mode->vdisplay == mode->vdisplay)
|
|
|
+ if (adjusted_mode->hdisplay == pipe_config->pipe_src_w &&
|
|
|
+ adjusted_mode->vdisplay == pipe_config->pipe_src_h)
|
|
|
goto out;
|
|
|
|
|
|
switch (fitting_mode) {
|
|
@@ -192,16 +190,16 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
* For centered modes, we have to calculate border widths &
|
|
|
* heights and modify the values programmed into the CRTC.
|
|
|
*/
|
|
|
- centre_horizontally(adjusted_mode, mode->hdisplay);
|
|
|
- centre_vertically(adjusted_mode, mode->vdisplay);
|
|
|
+ centre_horizontally(adjusted_mode, pipe_config->pipe_src_w);
|
|
|
+ centre_vertically(adjusted_mode, pipe_config->pipe_src_h);
|
|
|
border = LVDS_BORDER_ENABLE;
|
|
|
break;
|
|
|
case DRM_MODE_SCALE_ASPECT:
|
|
|
/* Scale but preserve the aspect ratio */
|
|
|
if (INTEL_INFO(dev)->gen >= 4) {
|
|
|
u32 scaled_width = adjusted_mode->hdisplay *
|
|
|
- mode->vdisplay;
|
|
|
- u32 scaled_height = mode->hdisplay *
|
|
|
+ pipe_config->pipe_src_h;
|
|
|
+ u32 scaled_height = pipe_config->pipe_src_w *
|
|
|
adjusted_mode->vdisplay;
|
|
|
|
|
|
/* 965+ is easy, it does everything in hw */
|
|
@@ -211,12 +209,12 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
else if (scaled_width < scaled_height)
|
|
|
pfit_control |= PFIT_ENABLE |
|
|
|
PFIT_SCALING_LETTER;
|
|
|
- else if (adjusted_mode->hdisplay != mode->hdisplay)
|
|
|
+ else if (adjusted_mode->hdisplay != pipe_config->pipe_src_w)
|
|
|
pfit_control |= PFIT_ENABLE | PFIT_SCALING_AUTO;
|
|
|
} else {
|
|
|
u32 scaled_width = adjusted_mode->hdisplay *
|
|
|
- mode->vdisplay;
|
|
|
- u32 scaled_height = mode->hdisplay *
|
|
|
+ pipe_config->pipe_src_h;
|
|
|
+ u32 scaled_height = pipe_config->pipe_src_w *
|
|
|
adjusted_mode->vdisplay;
|
|
|
/*
|
|
|
* For earlier chips we have to calculate the scaling
|
|
@@ -226,11 +224,11 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
if (scaled_width > scaled_height) { /* pillar */
|
|
|
centre_horizontally(adjusted_mode,
|
|
|
scaled_height /
|
|
|
- mode->vdisplay);
|
|
|
+ pipe_config->pipe_src_h);
|
|
|
|
|
|
border = LVDS_BORDER_ENABLE;
|
|
|
- if (mode->vdisplay != adjusted_mode->vdisplay) {
|
|
|
- u32 bits = panel_fitter_scaling(mode->vdisplay, adjusted_mode->vdisplay);
|
|
|
+ if (pipe_config->pipe_src_h != adjusted_mode->vdisplay) {
|
|
|
+ u32 bits = panel_fitter_scaling(pipe_config->pipe_src_h, adjusted_mode->vdisplay);
|
|
|
pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
|
|
|
bits << PFIT_VERT_SCALE_SHIFT);
|
|
|
pfit_control |= (PFIT_ENABLE |
|
|
@@ -240,11 +238,11 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
} else if (scaled_width < scaled_height) { /* letter */
|
|
|
centre_vertically(adjusted_mode,
|
|
|
scaled_width /
|
|
|
- mode->hdisplay);
|
|
|
+ pipe_config->pipe_src_w);
|
|
|
|
|
|
border = LVDS_BORDER_ENABLE;
|
|
|
- if (mode->hdisplay != adjusted_mode->hdisplay) {
|
|
|
- u32 bits = panel_fitter_scaling(mode->hdisplay, adjusted_mode->hdisplay);
|
|
|
+ if (pipe_config->pipe_src_w != adjusted_mode->hdisplay) {
|
|
|
+ u32 bits = panel_fitter_scaling(pipe_config->pipe_src_w, adjusted_mode->hdisplay);
|
|
|
pfit_pgm_ratios |= (bits << PFIT_HORIZ_SCALE_SHIFT |
|
|
|
bits << PFIT_VERT_SCALE_SHIFT);
|
|
|
pfit_control |= (PFIT_ENABLE |
|
|
@@ -265,8 +263,8 @@ void intel_gmch_panel_fitting(struct intel_crtc *intel_crtc,
|
|
|
* Full scaling, even if it changes the aspect ratio.
|
|
|
* Fortunately this is all done for us in hw.
|
|
|
*/
|
|
|
- if (mode->vdisplay != adjusted_mode->vdisplay ||
|
|
|
- mode->hdisplay != adjusted_mode->hdisplay) {
|
|
|
+ if (pipe_config->pipe_src_h != adjusted_mode->vdisplay ||
|
|
|
+ pipe_config->pipe_src_w != adjusted_mode->hdisplay) {
|
|
|
pfit_control |= PFIT_ENABLE;
|
|
|
if (INTEL_INFO(dev)->gen >= 4)
|
|
|
pfit_control |= PFIT_SCALING_AUTO;
|