Merge tag 'v4.2-rc7' into drm-next
Linux 4.2-rc7 Backmerge master for i915 fixes
This commit is contained in:
@@ -3359,15 +3359,14 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
|
||||
#define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true)
|
||||
|
||||
#define I915_READ64_2x32(lower_reg, upper_reg) ({ \
|
||||
u32 upper = I915_READ(upper_reg); \
|
||||
u32 lower = I915_READ(lower_reg); \
|
||||
u32 tmp = I915_READ(upper_reg); \
|
||||
if (upper != tmp) { \
|
||||
upper = tmp; \
|
||||
lower = I915_READ(lower_reg); \
|
||||
WARN_ON(I915_READ(upper_reg) != upper); \
|
||||
} \
|
||||
(u64)upper << 32 | lower; })
|
||||
u32 upper, lower, tmp; \
|
||||
tmp = I915_READ(upper_reg); \
|
||||
do { \
|
||||
upper = tmp; \
|
||||
lower = I915_READ(lower_reg); \
|
||||
tmp = I915_READ(upper_reg); \
|
||||
} while (upper != tmp); \
|
||||
(u64)upper << 32 | lower; })
|
||||
|
||||
#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg)
|
||||
#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg)
|
||||
|
@@ -2003,6 +2003,17 @@ static int ggtt_bind_vma(struct i915_vma *vma,
|
||||
vma->vm->insert_entries(vma->vm, pages,
|
||||
vma->node.start,
|
||||
cache_level, pte_flags);
|
||||
|
||||
/* Note the inconsistency here is due to absence of the
|
||||
* aliasing ppgtt on gen4 and earlier. Though we always
|
||||
* request PIN_USER for execbuffer (translated to LOCAL_BIND),
|
||||
* without the appgtt, we cannot honour that request and so
|
||||
* must substitute it with a global binding. Since we do this
|
||||
* behind the upper layers back, we need to explicitly set
|
||||
* the bound flag ourselves.
|
||||
*/
|
||||
vma->bound |= GLOBAL_BIND;
|
||||
|
||||
}
|
||||
|
||||
if (dev_priv->mm.aliasing_ppgtt && flags & LOCAL_BIND) {
|
||||
|
@@ -464,7 +464,10 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
/* Hide bit 17 from the user -- see comment in i915_gem_set_tiling */
|
||||
args->phys_swizzle_mode = args->swizzle_mode;
|
||||
if (dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
|
||||
args->phys_swizzle_mode = I915_BIT_6_SWIZZLE_UNKNOWN;
|
||||
else
|
||||
args->phys_swizzle_mode = args->swizzle_mode;
|
||||
if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_17)
|
||||
args->swizzle_mode = I915_BIT_6_SWIZZLE_9;
|
||||
if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17)
|
||||
|
@@ -1015,15 +1015,34 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
||||
const union child_device_config *p_child;
|
||||
union child_device_config *child_dev_ptr;
|
||||
int i, child_device_num, count;
|
||||
u16 block_size;
|
||||
u8 expected_size;
|
||||
u16 block_size;
|
||||
|
||||
p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
|
||||
if (!p_defs) {
|
||||
DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n");
|
||||
return;
|
||||
}
|
||||
if (p_defs->child_dev_size < sizeof(*p_child)) {
|
||||
DRM_ERROR("General definiton block child device size is too small.\n");
|
||||
if (bdb->version < 195) {
|
||||
expected_size = 33;
|
||||
} else if (bdb->version == 195) {
|
||||
expected_size = 37;
|
||||
} else if (bdb->version <= 197) {
|
||||
expected_size = 38;
|
||||
} else {
|
||||
expected_size = 38;
|
||||
DRM_DEBUG_DRIVER("Expected child_device_config size for BDB version %u not known; assuming %u\n",
|
||||
expected_size, bdb->version);
|
||||
}
|
||||
|
||||
if (expected_size > sizeof(*p_child)) {
|
||||
DRM_ERROR("child_device_config cannot fit in p_child\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (p_defs->child_dev_size != expected_size) {
|
||||
DRM_ERROR("Size mismatch; child_device_config size=%u (expected %u); bdb->version: %u\n",
|
||||
p_defs->child_dev_size, expected_size, bdb->version);
|
||||
return;
|
||||
}
|
||||
/* get the block size of general definitions */
|
||||
@@ -1070,7 +1089,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
|
||||
|
||||
child_dev_ptr = dev_priv->vbt.child_dev + count;
|
||||
count++;
|
||||
memcpy(child_dev_ptr, p_child, sizeof(*p_child));
|
||||
memcpy(child_dev_ptr, p_child, p_defs->child_dev_size);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@@ -357,6 +357,16 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *connector,
|
||||
struct drm_connector_state *state)
|
||||
{
|
||||
struct intel_connector *intel_connector = to_intel_connector(connector);
|
||||
struct intel_dp *intel_dp = intel_connector->mst_port;
|
||||
struct intel_crtc *crtc = to_intel_crtc(state->crtc);
|
||||
|
||||
return &intel_dp->mst_encoders[crtc->pipe]->base.base;
|
||||
}
|
||||
|
||||
static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector)
|
||||
{
|
||||
struct intel_connector *intel_connector = to_intel_connector(connector);
|
||||
@@ -367,6 +377,7 @@ static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connecto
|
||||
static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = {
|
||||
.get_modes = intel_dp_mst_get_modes,
|
||||
.mode_valid = intel_dp_mst_mode_valid,
|
||||
.atomic_best_encoder = intel_mst_atomic_best_encoder,
|
||||
.best_encoder = intel_mst_best_encoder,
|
||||
};
|
||||
|
||||
|
@@ -1274,10 +1274,12 @@ int i915_reg_read_ioctl(struct drm_device *dev,
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_i915_reg_read *reg = data;
|
||||
struct register_whitelist const *entry = whitelist;
|
||||
unsigned size;
|
||||
u64 offset;
|
||||
int i, ret = 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
|
||||
if (entry->offset == reg->offset &&
|
||||
if (entry->offset == (reg->offset & -entry->size) &&
|
||||
(1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
|
||||
break;
|
||||
}
|
||||
@@ -1285,23 +1287,33 @@ int i915_reg_read_ioctl(struct drm_device *dev,
|
||||
if (i == ARRAY_SIZE(whitelist))
|
||||
return -EINVAL;
|
||||
|
||||
/* We use the low bits to encode extra flags as the register should
|
||||
* be naturally aligned (and those that are not so aligned merely
|
||||
* limit the available flags for that register).
|
||||
*/
|
||||
offset = entry->offset;
|
||||
size = entry->size;
|
||||
size |= reg->offset ^ offset;
|
||||
|
||||
intel_runtime_pm_get(dev_priv);
|
||||
|
||||
switch (entry->size) {
|
||||
switch (size) {
|
||||
case 8 | 1:
|
||||
reg->val = I915_READ64_2x32(offset, offset+4);
|
||||
break;
|
||||
case 8:
|
||||
reg->val = I915_READ64(reg->offset);
|
||||
reg->val = I915_READ64(offset);
|
||||
break;
|
||||
case 4:
|
||||
reg->val = I915_READ(reg->offset);
|
||||
reg->val = I915_READ(offset);
|
||||
break;
|
||||
case 2:
|
||||
reg->val = I915_READ16(reg->offset);
|
||||
reg->val = I915_READ16(offset);
|
||||
break;
|
||||
case 1:
|
||||
reg->val = I915_READ8(reg->offset);
|
||||
reg->val = I915_READ8(offset);
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(entry->size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
Reference in New Issue
Block a user