Merge tag 'drm-intel-fixes-2016-11-01' of git://anongit.freedesktop.org/drm-intel into drm-fixes
batch of scattered i915 fixes. * tag 'drm-intel-fixes-2016-11-01' of git://anongit.freedesktop.org/drm-intel: drm/i915: Fix SKL+ 90/270 degree rotated plane coordinate computation drm/i915: Remove two invalid warns drm/i915: Rotated view does not need a fence drm/i915/fbc: fix CFB size calculation for gen8+ drm: i915: Wait for fences on new fb, not old drm/i915: Clean up DDI DDC/AUX CH sanitation drm/i915: Respect alternate_aux_channel for all DDI ports drm/i915/gen9: fix watermarks when using the pipe scaler drm/i915: Fix mismatched INIT power domain disabling during suspend drm/i915: fix a read size argument drm/i915: Use fence_write() from rpm resume drm/i915/gen9: fix DDB partitioning for multi-screen cases drm/i915: workaround sparse warning on variable length arrays drm/i915: keep declarations in i915_drv.h
This commit is contained in:
Коммит
7ec30fca2c
|
@ -1447,8 +1447,6 @@ static int i915_drm_suspend(struct drm_device *dev)
|
|||
|
||||
dev_priv->suspend_count++;
|
||||
|
||||
intel_display_set_init_power(dev_priv, false);
|
||||
|
||||
intel_csr_ucode_suspend(dev_priv);
|
||||
|
||||
out:
|
||||
|
@ -1466,6 +1464,8 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
|
|||
|
||||
disable_rpm_wakeref_asserts(dev_priv);
|
||||
|
||||
intel_display_set_init_power(dev_priv, false);
|
||||
|
||||
fw_csr = !IS_BROXTON(dev_priv) &&
|
||||
suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
|
||||
/*
|
||||
|
|
|
@ -2883,6 +2883,11 @@ __i915_printk(struct drm_i915_private *dev_priv, const char *level,
|
|||
extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
#endif
|
||||
extern const struct dev_pm_ops i915_pm_ops;
|
||||
|
||||
extern int i915_driver_load(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent);
|
||||
extern void i915_driver_unload(struct drm_device *dev);
|
||||
extern int intel_gpu_reset(struct drm_i915_private *dev_priv, u32 engine_mask);
|
||||
extern bool intel_has_gpu_reset(struct drm_i915_private *dev_priv);
|
||||
extern void i915_reset(struct drm_i915_private *dev_priv);
|
||||
|
|
|
@ -3550,8 +3550,6 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
|
|||
|
||||
vma->display_alignment = max_t(u64, vma->display_alignment, alignment);
|
||||
|
||||
WARN_ON(obj->pin_display > i915_vma_pin_count(vma));
|
||||
|
||||
i915_gem_object_flush_cpu_write_domain(obj);
|
||||
|
||||
old_write_domain = obj->base.write_domain;
|
||||
|
@ -3588,7 +3586,6 @@ i915_gem_object_unpin_from_display_plane(struct i915_vma *vma)
|
|||
list_move_tail(&vma->vm_link, &vma->vm->inactive_list);
|
||||
|
||||
i915_vma_unpin(vma);
|
||||
WARN_ON(vma->obj->pin_display > i915_vma_pin_count(vma));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3745,7 +3742,12 @@ void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
|
|||
mappable = (vma->node.start + fence_size <=
|
||||
dev_priv->ggtt.mappable_end);
|
||||
|
||||
if (mappable && fenceable)
|
||||
/*
|
||||
* Explicitly disable for rotated VMA since the display does not
|
||||
* need the fence and the VMA is not accessible to other users.
|
||||
*/
|
||||
if (mappable && fenceable &&
|
||||
vma->ggtt_view.type != I915_GGTT_VIEW_ROTATED)
|
||||
vma->flags |= I915_VMA_CAN_FENCE;
|
||||
else
|
||||
vma->flags &= ~I915_VMA_CAN_FENCE;
|
||||
|
|
|
@ -290,6 +290,8 @@ i915_vma_put_fence(struct i915_vma *vma)
|
|||
{
|
||||
struct drm_i915_fence_reg *fence = vma->fence;
|
||||
|
||||
assert_rpm_wakelock_held(to_i915(vma->vm->dev));
|
||||
|
||||
if (!fence)
|
||||
return 0;
|
||||
|
||||
|
@ -341,6 +343,8 @@ i915_vma_get_fence(struct i915_vma *vma)
|
|||
struct drm_i915_fence_reg *fence;
|
||||
struct i915_vma *set = i915_gem_object_is_tiled(vma->obj) ? vma : NULL;
|
||||
|
||||
assert_rpm_wakelock_held(to_i915(vma->vm->dev));
|
||||
|
||||
/* Just update our place in the LRU if our fence is getting reused. */
|
||||
if (vma->fence) {
|
||||
fence = vma->fence;
|
||||
|
@ -371,6 +375,12 @@ void i915_gem_restore_fences(struct drm_device *dev)
|
|||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
int i;
|
||||
|
||||
/* Note that this may be called outside of struct_mutex, by
|
||||
* runtime suspend/resume. The barrier we require is enforced by
|
||||
* rpm itself - all access to fences/GTT are only within an rpm
|
||||
* wakeref, and to acquire that wakeref you must pass through here.
|
||||
*/
|
||||
|
||||
for (i = 0; i < dev_priv->num_fence_regs; i++) {
|
||||
struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
|
||||
struct i915_vma *vma = reg->vma;
|
||||
|
@ -379,10 +389,17 @@ void i915_gem_restore_fences(struct drm_device *dev)
|
|||
* Commit delayed tiling changes if we have an object still
|
||||
* attached to the fence, otherwise just clear the fence.
|
||||
*/
|
||||
if (vma && !i915_gem_object_is_tiled(vma->obj))
|
||||
vma = NULL;
|
||||
if (vma && !i915_gem_object_is_tiled(vma->obj)) {
|
||||
GEM_BUG_ON(!reg->dirty);
|
||||
GEM_BUG_ON(vma->obj->fault_mappable);
|
||||
|
||||
fence_update(reg, vma);
|
||||
list_move(®->link, &dev_priv->mm.fence_list);
|
||||
vma->fence = NULL;
|
||||
vma = NULL;
|
||||
}
|
||||
|
||||
fence_write(reg, vma);
|
||||
reg->vma = vma;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -431,9 +431,6 @@ static const struct pci_device_id pciidlist[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(pci, pciidlist);
|
||||
|
||||
extern int i915_driver_load(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent);
|
||||
|
||||
static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct intel_device_info *intel_info =
|
||||
|
@ -463,8 +460,6 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
return i915_driver_load(pdev, ent);
|
||||
}
|
||||
|
||||
extern void i915_driver_unload(struct drm_device *dev);
|
||||
|
||||
static void i915_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
|
@ -473,8 +468,6 @@ static void i915_pci_remove(struct pci_dev *pdev)
|
|||
drm_dev_unref(dev);
|
||||
}
|
||||
|
||||
extern const struct dev_pm_ops i915_pm_ops;
|
||||
|
||||
static struct pci_driver i915_pci_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.id_table = pciidlist,
|
||||
|
|
|
@ -1031,6 +1031,77 @@ static u8 translate_iboost(u8 val)
|
|||
return mapping[val];
|
||||
}
|
||||
|
||||
static void sanitize_ddc_pin(struct drm_i915_private *dev_priv,
|
||||
enum port port)
|
||||
{
|
||||
const struct ddi_vbt_port_info *info =
|
||||
&dev_priv->vbt.ddi_port_info[port];
|
||||
enum port p;
|
||||
|
||||
if (!info->alternate_ddc_pin)
|
||||
return;
|
||||
|
||||
for_each_port_masked(p, (1 << port) - 1) {
|
||||
struct ddi_vbt_port_info *i = &dev_priv->vbt.ddi_port_info[p];
|
||||
|
||||
if (info->alternate_ddc_pin != i->alternate_ddc_pin)
|
||||
continue;
|
||||
|
||||
DRM_DEBUG_KMS("port %c trying to use the same DDC pin (0x%x) as port %c, "
|
||||
"disabling port %c DVI/HDMI support\n",
|
||||
port_name(p), i->alternate_ddc_pin,
|
||||
port_name(port), port_name(p));
|
||||
|
||||
/*
|
||||
* If we have multiple ports supposedly sharing the
|
||||
* pin, then dvi/hdmi couldn't exist on the shared
|
||||
* port. Otherwise they share the same ddc bin and
|
||||
* system couldn't communicate with them separately.
|
||||
*
|
||||
* Due to parsing the ports in alphabetical order,
|
||||
* a higher port will always clobber a lower one.
|
||||
*/
|
||||
i->supports_dvi = false;
|
||||
i->supports_hdmi = false;
|
||||
i->alternate_ddc_pin = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void sanitize_aux_ch(struct drm_i915_private *dev_priv,
|
||||
enum port port)
|
||||
{
|
||||
const struct ddi_vbt_port_info *info =
|
||||
&dev_priv->vbt.ddi_port_info[port];
|
||||
enum port p;
|
||||
|
||||
if (!info->alternate_aux_channel)
|
||||
return;
|
||||
|
||||
for_each_port_masked(p, (1 << port) - 1) {
|
||||
struct ddi_vbt_port_info *i = &dev_priv->vbt.ddi_port_info[p];
|
||||
|
||||
if (info->alternate_aux_channel != i->alternate_aux_channel)
|
||||
continue;
|
||||
|
||||
DRM_DEBUG_KMS("port %c trying to use the same AUX CH (0x%x) as port %c, "
|
||||
"disabling port %c DP support\n",
|
||||
port_name(p), i->alternate_aux_channel,
|
||||
port_name(port), port_name(p));
|
||||
|
||||
/*
|
||||
* If we have multiple ports supposedlt sharing the
|
||||
* aux channel, then DP couldn't exist on the shared
|
||||
* port. Otherwise they share the same aux channel
|
||||
* and system couldn't communicate with them separately.
|
||||
*
|
||||
* Due to parsing the ports in alphabetical order,
|
||||
* a higher port will always clobber a lower one.
|
||||
*/
|
||||
i->supports_dp = false;
|
||||
i->alternate_aux_channel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
||||
const struct bdb_header *bdb)
|
||||
{
|
||||
|
@ -1105,54 +1176,15 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
|
|||
DRM_DEBUG_KMS("Port %c is internal DP\n", port_name(port));
|
||||
|
||||
if (is_dvi) {
|
||||
if (port == PORT_E) {
|
||||
info->alternate_ddc_pin = ddc_pin;
|
||||
/* if DDIE share ddc pin with other port, then
|
||||
* dvi/hdmi couldn't exist on the shared port.
|
||||
* Otherwise they share the same ddc bin and system
|
||||
* couldn't communicate with them seperately. */
|
||||
if (ddc_pin == DDC_PIN_B) {
|
||||
dev_priv->vbt.ddi_port_info[PORT_B].supports_dvi = 0;
|
||||
dev_priv->vbt.ddi_port_info[PORT_B].supports_hdmi = 0;
|
||||
} else if (ddc_pin == DDC_PIN_C) {
|
||||
dev_priv->vbt.ddi_port_info[PORT_C].supports_dvi = 0;
|
||||
dev_priv->vbt.ddi_port_info[PORT_C].supports_hdmi = 0;
|
||||
} else if (ddc_pin == DDC_PIN_D) {
|
||||
dev_priv->vbt.ddi_port_info[PORT_D].supports_dvi = 0;
|
||||
dev_priv->vbt.ddi_port_info[PORT_D].supports_hdmi = 0;
|
||||
}
|
||||
} else if (ddc_pin == DDC_PIN_B && port != PORT_B)
|
||||
DRM_DEBUG_KMS("Unexpected DDC pin for port B\n");
|
||||
else if (ddc_pin == DDC_PIN_C && port != PORT_C)
|
||||
DRM_DEBUG_KMS("Unexpected DDC pin for port C\n");
|
||||
else if (ddc_pin == DDC_PIN_D && port != PORT_D)
|
||||
DRM_DEBUG_KMS("Unexpected DDC pin for port D\n");
|
||||
info->alternate_ddc_pin = ddc_pin;
|
||||
|
||||
sanitize_ddc_pin(dev_priv, port);
|
||||
}
|
||||
|
||||
if (is_dp) {
|
||||
if (port == PORT_E) {
|
||||
info->alternate_aux_channel = aux_channel;
|
||||
/* if DDIE share aux channel with other port, then
|
||||
* DP couldn't exist on the shared port. Otherwise
|
||||
* they share the same aux channel and system
|
||||
* couldn't communicate with them seperately. */
|
||||
if (aux_channel == DP_AUX_A)
|
||||
dev_priv->vbt.ddi_port_info[PORT_A].supports_dp = 0;
|
||||
else if (aux_channel == DP_AUX_B)
|
||||
dev_priv->vbt.ddi_port_info[PORT_B].supports_dp = 0;
|
||||
else if (aux_channel == DP_AUX_C)
|
||||
dev_priv->vbt.ddi_port_info[PORT_C].supports_dp = 0;
|
||||
else if (aux_channel == DP_AUX_D)
|
||||
dev_priv->vbt.ddi_port_info[PORT_D].supports_dp = 0;
|
||||
}
|
||||
else if (aux_channel == DP_AUX_A && port != PORT_A)
|
||||
DRM_DEBUG_KMS("Unexpected AUX channel for port A\n");
|
||||
else if (aux_channel == DP_AUX_B && port != PORT_B)
|
||||
DRM_DEBUG_KMS("Unexpected AUX channel for port B\n");
|
||||
else if (aux_channel == DP_AUX_C && port != PORT_C)
|
||||
DRM_DEBUG_KMS("Unexpected AUX channel for port C\n");
|
||||
else if (aux_channel == DP_AUX_D && port != PORT_D)
|
||||
DRM_DEBUG_KMS("Unexpected AUX channel for port D\n");
|
||||
info->alternate_aux_channel = aux_channel;
|
||||
|
||||
sanitize_aux_ch(dev_priv, port);
|
||||
}
|
||||
|
||||
if (bdb->version >= 158) {
|
||||
|
|
|
@ -192,7 +192,7 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
|
|||
struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
|
||||
const int s_max = 3, ss_max = 3, eu_max = 8;
|
||||
int s, ss;
|
||||
u32 fuse2, eu_disable[s_max];
|
||||
u32 fuse2, eu_disable[3]; /* s_max */
|
||||
|
||||
fuse2 = I915_READ(GEN8_FUSE2);
|
||||
sseu->slice_mask = (fuse2 & GEN8_F2_S_ENA_MASK) >> GEN8_F2_S_ENA_SHIFT;
|
||||
|
|
|
@ -2978,7 +2978,8 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
|
|||
/* Rotate src coordinates to match rotated GTT view */
|
||||
if (intel_rotation_90_or_270(rotation))
|
||||
drm_rect_rotate(&plane_state->base.src,
|
||||
fb->width, fb->height, DRM_ROTATE_270);
|
||||
fb->width << 16, fb->height << 16,
|
||||
DRM_ROTATE_270);
|
||||
|
||||
/*
|
||||
* Handle the AUX surface first since
|
||||
|
@ -14310,7 +14311,7 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|||
|
||||
for_each_plane_in_state(state, plane, plane_state, i) {
|
||||
struct intel_plane_state *intel_plane_state =
|
||||
to_intel_plane_state(plane_state);
|
||||
to_intel_plane_state(plane->state);
|
||||
|
||||
if (!intel_plane_state->wait_req)
|
||||
continue;
|
||||
|
|
|
@ -1108,6 +1108,44 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static enum port intel_aux_port(struct drm_i915_private *dev_priv,
|
||||
enum port port)
|
||||
{
|
||||
const struct ddi_vbt_port_info *info =
|
||||
&dev_priv->vbt.ddi_port_info[port];
|
||||
enum port aux_port;
|
||||
|
||||
if (!info->alternate_aux_channel) {
|
||||
DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n",
|
||||
port_name(port), port_name(port));
|
||||
return port;
|
||||
}
|
||||
|
||||
switch (info->alternate_aux_channel) {
|
||||
case DP_AUX_A:
|
||||
aux_port = PORT_A;
|
||||
break;
|
||||
case DP_AUX_B:
|
||||
aux_port = PORT_B;
|
||||
break;
|
||||
case DP_AUX_C:
|
||||
aux_port = PORT_C;
|
||||
break;
|
||||
case DP_AUX_D:
|
||||
aux_port = PORT_D;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(info->alternate_aux_channel);
|
||||
aux_port = PORT_A;
|
||||
break;
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
|
||||
port_name(aux_port), port_name(port));
|
||||
|
||||
return aux_port;
|
||||
}
|
||||
|
||||
static i915_reg_t g4x_aux_ctl_reg(struct drm_i915_private *dev_priv,
|
||||
enum port port)
|
||||
{
|
||||
|
@ -1168,36 +1206,9 @@ static i915_reg_t ilk_aux_data_reg(struct drm_i915_private *dev_priv,
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* On SKL we don't have Aux for port E so we rely
|
||||
* on VBT to set a proper alternate aux channel.
|
||||
*/
|
||||
static enum port skl_porte_aux_port(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
const struct ddi_vbt_port_info *info =
|
||||
&dev_priv->vbt.ddi_port_info[PORT_E];
|
||||
|
||||
switch (info->alternate_aux_channel) {
|
||||
case DP_AUX_A:
|
||||
return PORT_A;
|
||||
case DP_AUX_B:
|
||||
return PORT_B;
|
||||
case DP_AUX_C:
|
||||
return PORT_C;
|
||||
case DP_AUX_D:
|
||||
return PORT_D;
|
||||
default:
|
||||
MISSING_CASE(info->alternate_aux_channel);
|
||||
return PORT_A;
|
||||
}
|
||||
}
|
||||
|
||||
static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv,
|
||||
enum port port)
|
||||
{
|
||||
if (port == PORT_E)
|
||||
port = skl_porte_aux_port(dev_priv);
|
||||
|
||||
switch (port) {
|
||||
case PORT_A:
|
||||
case PORT_B:
|
||||
|
@ -1213,9 +1224,6 @@ static i915_reg_t skl_aux_ctl_reg(struct drm_i915_private *dev_priv,
|
|||
static i915_reg_t skl_aux_data_reg(struct drm_i915_private *dev_priv,
|
||||
enum port port, int index)
|
||||
{
|
||||
if (port == PORT_E)
|
||||
port = skl_porte_aux_port(dev_priv);
|
||||
|
||||
switch (port) {
|
||||
case PORT_A:
|
||||
case PORT_B:
|
||||
|
@ -1253,7 +1261,8 @@ static i915_reg_t intel_aux_data_reg(struct drm_i915_private *dev_priv,
|
|||
static void intel_aux_reg_init(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
enum port port = intel_aux_port(dev_priv,
|
||||
dp_to_dig_port(intel_dp)->port);
|
||||
int i;
|
||||
|
||||
intel_dp->aux_ch_ctl_reg = intel_aux_ctl_reg(dev_priv, port);
|
||||
|
@ -3551,8 +3560,8 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
|
|||
/* Read the eDP Display control capabilities registers */
|
||||
if ((intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) &&
|
||||
drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV,
|
||||
intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd) ==
|
||||
sizeof(intel_dp->edp_dpcd)))
|
||||
intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) ==
|
||||
sizeof(intel_dp->edp_dpcd))
|
||||
DRM_DEBUG_KMS("EDP DPCD : %*ph\n", (int) sizeof(intel_dp->edp_dpcd),
|
||||
intel_dp->edp_dpcd);
|
||||
|
||||
|
|
|
@ -104,8 +104,10 @@ static int intel_fbc_calculate_cfb_size(struct drm_i915_private *dev_priv,
|
|||
int lines;
|
||||
|
||||
intel_fbc_get_plane_source_size(cache, NULL, &lines);
|
||||
if (INTEL_INFO(dev_priv)->gen >= 7)
|
||||
if (INTEL_GEN(dev_priv) == 7)
|
||||
lines = min(lines, 2048);
|
||||
else if (INTEL_GEN(dev_priv) >= 8)
|
||||
lines = min(lines, 2560);
|
||||
|
||||
/* Hardware needs the full buffer stride, not just the active area. */
|
||||
return lines * cache->fb.stride;
|
||||
|
|
|
@ -3362,13 +3362,15 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
|
|||
int num_active;
|
||||
int id, i;
|
||||
|
||||
/* Clear the partitioning for disabled planes. */
|
||||
memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
|
||||
memset(ddb->y_plane[pipe], 0, sizeof(ddb->y_plane[pipe]));
|
||||
|
||||
if (WARN_ON(!state))
|
||||
return 0;
|
||||
|
||||
if (!cstate->base.active) {
|
||||
ddb->pipe[pipe].start = ddb->pipe[pipe].end = 0;
|
||||
memset(ddb->plane[pipe], 0, sizeof(ddb->plane[pipe]));
|
||||
memset(ddb->y_plane[pipe], 0, sizeof(ddb->y_plane[pipe]));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3468,12 +3470,6 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static uint32_t skl_pipe_pixel_rate(const struct intel_crtc_state *config)
|
||||
{
|
||||
/* TODO: Take into account the scalers once we support them */
|
||||
return config->base.adjusted_mode.crtc_clock;
|
||||
}
|
||||
|
||||
/*
|
||||
* The max latency should be 257 (max the punit can code is 255 and we add 2us
|
||||
* for the read latency) and cpp should always be <= 8, so that
|
||||
|
@ -3524,7 +3520,7 @@ static uint32_t skl_adjusted_plane_pixel_rate(const struct intel_crtc_state *cst
|
|||
* Adjusted plane pixel rate is just the pipe's adjusted pixel rate
|
||||
* with additional adjustments for plane-specific scaling.
|
||||
*/
|
||||
adjusted_pixel_rate = skl_pipe_pixel_rate(cstate);
|
||||
adjusted_pixel_rate = ilk_pipe_pixel_rate(cstate);
|
||||
downscale_amount = skl_plane_downscale_amount(pstate);
|
||||
|
||||
pixel_rate = adjusted_pixel_rate * downscale_amount >> 16;
|
||||
|
@ -3736,11 +3732,11 @@ skl_compute_linetime_wm(struct intel_crtc_state *cstate)
|
|||
if (!cstate->base.active)
|
||||
return 0;
|
||||
|
||||
if (WARN_ON(skl_pipe_pixel_rate(cstate) == 0))
|
||||
if (WARN_ON(ilk_pipe_pixel_rate(cstate) == 0))
|
||||
return 0;
|
||||
|
||||
return DIV_ROUND_UP(8 * cstate->base.adjusted_mode.crtc_htotal * 1000,
|
||||
skl_pipe_pixel_rate(cstate));
|
||||
ilk_pipe_pixel_rate(cstate));
|
||||
}
|
||||
|
||||
static void skl_compute_transition_wm(struct intel_crtc_state *cstate,
|
||||
|
@ -4050,6 +4046,12 @@ skl_compute_ddb(struct drm_atomic_state *state)
|
|||
intel_state->wm_results.dirty_pipes = ~0;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're not recomputing for the pipes not included in the commit, so
|
||||
* make sure we start with the current state.
|
||||
*/
|
||||
memcpy(ddb, &dev_priv->wm.skl_hw.ddb, sizeof(*ddb));
|
||||
|
||||
for_each_intel_crtc_mask(dev, intel_crtc, realloc_pipes) {
|
||||
struct intel_crtc_state *cstate;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче