提交 7d588f90 编写于 作者: D Dave Airlie

Merge tag 'drm-intel-fixes-2018-11-08' of...

Merge tag 'drm-intel-fixes-2018-11-08' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

Bugzilla #108282 fixed: Avoid graphics corruption on 32-bit systems for Mesa 18.2.x
Avoid OOPS on LPE audio deinit. Remove two unused W/As.
Fix to correct HDMI 2.0 audio clock modes to spec.
Signed-off-by: NDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181108134508.GA28466@jlahtine-desk.ger.corp.intel.com
...@@ -1905,7 +1905,6 @@ static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu) ...@@ -1905,7 +1905,6 @@ static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
vgpu_free_mm(mm); vgpu_free_mm(mm);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
mm->ggtt_mm.last_partial_off = -1UL;
return mm; return mm;
} }
...@@ -1930,7 +1929,6 @@ void _intel_vgpu_mm_release(struct kref *mm_ref) ...@@ -1930,7 +1929,6 @@ void _intel_vgpu_mm_release(struct kref *mm_ref)
invalidate_ppgtt_mm(mm); invalidate_ppgtt_mm(mm);
} else { } else {
vfree(mm->ggtt_mm.virtual_ggtt); vfree(mm->ggtt_mm.virtual_ggtt);
mm->ggtt_mm.last_partial_off = -1UL;
} }
vgpu_free_mm(mm); vgpu_free_mm(mm);
...@@ -2168,6 +2166,8 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off, ...@@ -2168,6 +2166,8 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
struct intel_gvt_gtt_entry e, m; struct intel_gvt_gtt_entry e, m;
dma_addr_t dma_addr; dma_addr_t dma_addr;
int ret; int ret;
struct intel_gvt_partial_pte *partial_pte, *pos, *n;
bool partial_update = false;
if (bytes != 4 && bytes != 8) if (bytes != 4 && bytes != 8)
return -EINVAL; return -EINVAL;
...@@ -2178,68 +2178,57 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off, ...@@ -2178,68 +2178,57 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
if (!vgpu_gmadr_is_valid(vgpu, gma)) if (!vgpu_gmadr_is_valid(vgpu, gma))
return 0; return 0;
ggtt_get_guest_entry(ggtt_mm, &e, g_gtt_index); e.type = GTT_TYPE_GGTT_PTE;
memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data, memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
bytes); bytes);
/* If ggtt entry size is 8 bytes, and it's split into two 4 bytes /* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
* write, we assume the two 4 bytes writes are consecutive. * write, save the first 4 bytes in a list and update virtual
* Otherwise, we abort and report error * PTE. Only update shadow PTE when the second 4 bytes comes.
*/ */
if (bytes < info->gtt_entry_size) { if (bytes < info->gtt_entry_size) {
if (ggtt_mm->ggtt_mm.last_partial_off == -1UL) { bool found = false;
/* the first partial part*/
ggtt_mm->ggtt_mm.last_partial_off = off; list_for_each_entry_safe(pos, n,
ggtt_mm->ggtt_mm.last_partial_data = e.val64; &ggtt_mm->ggtt_mm.partial_pte_list, list) {
return 0; if (g_gtt_index == pos->offset >>
} else if ((g_gtt_index == info->gtt_entry_size_shift) {
(ggtt_mm->ggtt_mm.last_partial_off >> if (off != pos->offset) {
info->gtt_entry_size_shift)) && /* the second partial part*/
(off != ggtt_mm->ggtt_mm.last_partial_off)) { int last_off = pos->offset &
/* the second partial part */
int last_off = ggtt_mm->ggtt_mm.last_partial_off &
(info->gtt_entry_size - 1); (info->gtt_entry_size - 1);
memcpy((void *)&e.val64 + last_off, memcpy((void *)&e.val64 + last_off,
(void *)&ggtt_mm->ggtt_mm.last_partial_data + (void *)&pos->data + last_off,
last_off, bytes); bytes);
ggtt_mm->ggtt_mm.last_partial_off = -1UL;
} else {
int last_offset;
gvt_vgpu_err("failed to populate guest ggtt entry: abnormal ggtt entry write sequence, last_partial_off=%lx, offset=%x, bytes=%d, ggtt entry size=%d\n",
ggtt_mm->ggtt_mm.last_partial_off, off,
bytes, info->gtt_entry_size);
/* set host ggtt entry to scratch page and clear
* virtual ggtt entry as not present for last
* partially write offset
*/
last_offset = ggtt_mm->ggtt_mm.last_partial_off &
(~(info->gtt_entry_size - 1));
ggtt_get_host_entry(ggtt_mm, &m, last_offset);
ggtt_invalidate_pte(vgpu, &m);
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
ops->clear_present(&m);
ggtt_set_host_entry(ggtt_mm, &m, last_offset);
ggtt_invalidate(gvt->dev_priv);
ggtt_get_guest_entry(ggtt_mm, &e, last_offset);
ops->clear_present(&e);
ggtt_set_guest_entry(ggtt_mm, &e, last_offset);
ggtt_mm->ggtt_mm.last_partial_off = off; list_del(&pos->list);
ggtt_mm->ggtt_mm.last_partial_data = e.val64; kfree(pos);
found = true;
break;
}
/* update of the first partial part */
pos->data = e.val64;
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
return 0; return 0;
} }
} }
if (ops->test_present(&e)) { if (!found) {
/* the first partial part */
partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
if (!partial_pte)
return -ENOMEM;
partial_pte->offset = off;
partial_pte->data = e.val64;
list_add_tail(&partial_pte->list,
&ggtt_mm->ggtt_mm.partial_pte_list);
partial_update = true;
}
}
if (!partial_update && (ops->test_present(&e))) {
gfn = ops->get_pfn(&e); gfn = ops->get_pfn(&e);
m = e; m = e;
...@@ -2263,16 +2252,18 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off, ...@@ -2263,16 +2252,18 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
} else } else
ops->set_pfn(&m, dma_addr >> PAGE_SHIFT); ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
} else { } else {
ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
ggtt_invalidate_pte(vgpu, &m);
ops->set_pfn(&m, gvt->gtt.scratch_mfn); ops->set_pfn(&m, gvt->gtt.scratch_mfn);
ops->clear_present(&m); ops->clear_present(&m);
} }
out: out:
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
ggtt_invalidate_pte(vgpu, &e);
ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index); ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
ggtt_invalidate(gvt->dev_priv); ggtt_invalidate(gvt->dev_priv);
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
return 0; return 0;
} }
...@@ -2430,6 +2421,8 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu) ...@@ -2430,6 +2421,8 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
intel_vgpu_reset_ggtt(vgpu, false); intel_vgpu_reset_ggtt(vgpu, false);
INIT_LIST_HEAD(&gtt->ggtt_mm->ggtt_mm.partial_pte_list);
return create_scratch_page_tree(vgpu); return create_scratch_page_tree(vgpu);
} }
...@@ -2454,6 +2447,14 @@ static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu) ...@@ -2454,6 +2447,14 @@ static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu) static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
{ {
struct intel_gvt_partial_pte *pos;
list_for_each_entry(pos,
&vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list, list) {
gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
pos->offset, pos->data);
kfree(pos);
}
intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm); intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
vgpu->gtt.ggtt_mm = NULL; vgpu->gtt.ggtt_mm = NULL;
} }
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#define _GVT_GTT_H_ #define _GVT_GTT_H_
#define I915_GTT_PAGE_SHIFT 12 #define I915_GTT_PAGE_SHIFT 12
#define I915_GTT_PAGE_MASK (~(I915_GTT_PAGE_SIZE - 1))
struct intel_vgpu_mm; struct intel_vgpu_mm;
...@@ -133,6 +132,12 @@ enum intel_gvt_mm_type { ...@@ -133,6 +132,12 @@ enum intel_gvt_mm_type {
#define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES #define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES
struct intel_gvt_partial_pte {
unsigned long offset;
u64 data;
struct list_head list;
};
struct intel_vgpu_mm { struct intel_vgpu_mm {
enum intel_gvt_mm_type type; enum intel_gvt_mm_type type;
struct intel_vgpu *vgpu; struct intel_vgpu *vgpu;
...@@ -157,8 +162,7 @@ struct intel_vgpu_mm { ...@@ -157,8 +162,7 @@ struct intel_vgpu_mm {
} ppgtt_mm; } ppgtt_mm;
struct { struct {
void *virtual_ggtt; void *virtual_ggtt;
unsigned long last_partial_off; struct list_head partial_pte_list;
u64 last_partial_data;
} ggtt_mm; } ggtt_mm;
}; };
}; };
......
...@@ -1609,7 +1609,7 @@ static int bxt_gt_disp_pwron_write(struct intel_vgpu *vgpu, ...@@ -1609,7 +1609,7 @@ static int bxt_gt_disp_pwron_write(struct intel_vgpu *vgpu,
return 0; return 0;
} }
static int bxt_edp_psr_imr_iir_write(struct intel_vgpu *vgpu, static int edp_psr_imr_iir_write(struct intel_vgpu *vgpu,
unsigned int offset, void *p_data, unsigned int bytes) unsigned int offset, void *p_data, unsigned int bytes)
{ {
vgpu_vreg(vgpu, offset) = 0; vgpu_vreg(vgpu, offset) = 0;
...@@ -2607,6 +2607,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt) ...@@ -2607,6 +2607,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
MMIO_DFH(_MMIO(0x1a178), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); MMIO_DFH(_MMIO(0x1a178), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
MMIO_DFH(_MMIO(0x1a17c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); MMIO_DFH(_MMIO(0x1a17c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
MMIO_DFH(_MMIO(0x2217c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); MMIO_DFH(_MMIO(0x2217c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
MMIO_DH(EDP_PSR_IMR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
MMIO_DH(EDP_PSR_IIR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
return 0; return 0;
} }
...@@ -3205,9 +3208,6 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt) ...@@ -3205,9 +3208,6 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_B), D_BXT); MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_B), D_BXT);
MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_C), D_BXT); MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_C), D_BXT);
MMIO_DH(EDP_PSR_IMR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
MMIO_DH(EDP_PSR_IIR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
MMIO_D(RC6_CTX_BASE, D_BXT); MMIO_D(RC6_CTX_BASE, D_BXT);
MMIO_D(GEN8_PUSHBUS_CONTROL, D_BXT); MMIO_D(GEN8_PUSHBUS_CONTROL, D_BXT);
......
...@@ -131,7 +131,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = { ...@@ -131,7 +131,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = {
{RCS, GAMT_CHKN_BIT_REG, 0x0, false}, /* 0x4ab8 */ {RCS, GAMT_CHKN_BIT_REG, 0x0, false}, /* 0x4ab8 */
{RCS, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */ {RCS, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */
{RCS, GEN9_CSFE_CHICKEN1_RCS, 0x0, false}, /* 0x20d4 */ {RCS, GEN9_CSFE_CHICKEN1_RCS, 0xffff, false}, /* 0x20d4 */
{RCS, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */ {RCS, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */
{RCS, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */ {RCS, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */
......
...@@ -1175,8 +1175,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv) ...@@ -1175,8 +1175,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
return -EINVAL; return -EINVAL;
} }
dram_info->valid_dimm = true;
/* /*
* If any of the channel is single rank channel, worst case output * If any of the channel is single rank channel, worst case output
* will be same as if single rank memory, so consider single rank * will be same as if single rank memory, so consider single rank
...@@ -1193,8 +1191,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv) ...@@ -1193,8 +1191,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
return -EINVAL; return -EINVAL;
} }
if (ch0.is_16gb_dimm || ch1.is_16gb_dimm) dram_info->is_16gb_dimm = ch0.is_16gb_dimm || ch1.is_16gb_dimm;
dram_info->is_16gb_dimm = true;
dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0, dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0,
val_ch1, val_ch1,
...@@ -1314,7 +1311,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv) ...@@ -1314,7 +1311,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
return -EINVAL; return -EINVAL;
} }
dram_info->valid_dimm = true;
dram_info->valid = true; dram_info->valid = true;
return 0; return 0;
} }
...@@ -1327,12 +1323,17 @@ intel_get_dram_info(struct drm_i915_private *dev_priv) ...@@ -1327,12 +1323,17 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
int ret; int ret;
dram_info->valid = false; dram_info->valid = false;
dram_info->valid_dimm = false;
dram_info->is_16gb_dimm = false;
dram_info->rank = I915_DRAM_RANK_INVALID; dram_info->rank = I915_DRAM_RANK_INVALID;
dram_info->bandwidth_kbps = 0; dram_info->bandwidth_kbps = 0;
dram_info->num_channels = 0; dram_info->num_channels = 0;
/*
* Assume 16Gb DIMMs are present until proven otherwise.
* This is only used for the level 0 watermark latency
* w/a which does not apply to bxt/glk.
*/
dram_info->is_16gb_dimm = !IS_GEN9_LP(dev_priv);
if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv)) if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv))
return; return;
......
...@@ -1948,7 +1948,6 @@ struct drm_i915_private { ...@@ -1948,7 +1948,6 @@ struct drm_i915_private {
struct dram_info { struct dram_info {
bool valid; bool valid;
bool valid_dimm;
bool is_16gb_dimm; bool is_16gb_dimm;
u8 num_channels; u8 num_channels;
enum dram_rank { enum dram_rank {
......
...@@ -460,7 +460,7 @@ eb_validate_vma(struct i915_execbuffer *eb, ...@@ -460,7 +460,7 @@ eb_validate_vma(struct i915_execbuffer *eb,
* any non-page-aligned or non-canonical addresses. * any non-page-aligned or non-canonical addresses.
*/ */
if (unlikely(entry->flags & EXEC_OBJECT_PINNED && if (unlikely(entry->flags & EXEC_OBJECT_PINNED &&
entry->offset != gen8_canonical_addr(entry->offset & PAGE_MASK))) entry->offset != gen8_canonical_addr(entry->offset & I915_GTT_PAGE_MASK)))
return -EINVAL; return -EINVAL;
/* pad_to_size was once a reserved field, so sanitize it */ /* pad_to_size was once a reserved field, so sanitize it */
......
...@@ -1757,7 +1757,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m) ...@@ -1757,7 +1757,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m)
if (i == 4) if (i == 4)
continue; continue;
seq_printf(m, "\t\t(%03d, %04d) %08lx: ", seq_printf(m, "\t\t(%03d, %04d) %08llx: ",
pde, pte, pde, pte,
(pde * GEN6_PTES + pte) * I915_GTT_PAGE_SIZE); (pde * GEN6_PTES + pte) * I915_GTT_PAGE_SIZE);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
......
...@@ -42,13 +42,15 @@ ...@@ -42,13 +42,15 @@
#include "i915_selftest.h" #include "i915_selftest.h"
#include "i915_timeline.h" #include "i915_timeline.h"
#define I915_GTT_PAGE_SIZE_4K BIT(12) #define I915_GTT_PAGE_SIZE_4K BIT_ULL(12)
#define I915_GTT_PAGE_SIZE_64K BIT(16) #define I915_GTT_PAGE_SIZE_64K BIT_ULL(16)
#define I915_GTT_PAGE_SIZE_2M BIT(21) #define I915_GTT_PAGE_SIZE_2M BIT_ULL(21)
#define I915_GTT_PAGE_SIZE I915_GTT_PAGE_SIZE_4K #define I915_GTT_PAGE_SIZE I915_GTT_PAGE_SIZE_4K
#define I915_GTT_MAX_PAGE_SIZE I915_GTT_PAGE_SIZE_2M #define I915_GTT_MAX_PAGE_SIZE I915_GTT_PAGE_SIZE_2M
#define I915_GTT_PAGE_MASK -I915_GTT_PAGE_SIZE
#define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE #define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE
#define I915_FENCE_REG_NONE -1 #define I915_FENCE_REG_NONE -1
...@@ -659,20 +661,20 @@ int i915_gem_gtt_insert(struct i915_address_space *vm, ...@@ -659,20 +661,20 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
u64 start, u64 end, unsigned int flags); u64 start, u64 end, unsigned int flags);
/* Flags used by pin/bind&friends. */ /* Flags used by pin/bind&friends. */
#define PIN_NONBLOCK BIT(0) #define PIN_NONBLOCK BIT_ULL(0)
#define PIN_MAPPABLE BIT(1) #define PIN_MAPPABLE BIT_ULL(1)
#define PIN_ZONE_4G BIT(2) #define PIN_ZONE_4G BIT_ULL(2)
#define PIN_NONFAULT BIT(3) #define PIN_NONFAULT BIT_ULL(3)
#define PIN_NOEVICT BIT(4) #define PIN_NOEVICT BIT_ULL(4)
#define PIN_MBZ BIT(5) /* I915_VMA_PIN_OVERFLOW */ #define PIN_MBZ BIT_ULL(5) /* I915_VMA_PIN_OVERFLOW */
#define PIN_GLOBAL BIT(6) /* I915_VMA_GLOBAL_BIND */ #define PIN_GLOBAL BIT_ULL(6) /* I915_VMA_GLOBAL_BIND */
#define PIN_USER BIT(7) /* I915_VMA_LOCAL_BIND */ #define PIN_USER BIT_ULL(7) /* I915_VMA_LOCAL_BIND */
#define PIN_UPDATE BIT(8) #define PIN_UPDATE BIT_ULL(8)
#define PIN_HIGH BIT(9) #define PIN_HIGH BIT_ULL(9)
#define PIN_OFFSET_BIAS BIT(10) #define PIN_OFFSET_BIAS BIT_ULL(10)
#define PIN_OFFSET_FIXED BIT(11) #define PIN_OFFSET_FIXED BIT_ULL(11)
#define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE) #define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE)
#endif #endif
...@@ -2095,8 +2095,12 @@ enum i915_power_well_id { ...@@ -2095,8 +2095,12 @@ enum i915_power_well_id {
/* ICL PHY DFLEX registers */ /* ICL PHY DFLEX registers */
#define PORT_TX_DFLEXDPMLE1 _MMIO(0x1638C0) #define PORT_TX_DFLEXDPMLE1 _MMIO(0x1638C0)
#define DFLEXDPMLE1_DPMLETC_MASK(n) (0xf << (4 * (n))) #define DFLEXDPMLE1_DPMLETC_MASK(tc_port) (0xf << (4 * (tc_port)))
#define DFLEXDPMLE1_DPMLETC(n, x) ((x) << (4 * (n))) #define DFLEXDPMLE1_DPMLETC_ML0(tc_port) (1 << (4 * (tc_port)))
#define DFLEXDPMLE1_DPMLETC_ML1_0(tc_port) (3 << (4 * (tc_port)))
#define DFLEXDPMLE1_DPMLETC_ML3(tc_port) (8 << (4 * (tc_port)))
#define DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) (12 << (4 * (tc_port)))
#define DFLEXDPMLE1_DPMLETC_ML3_0(tc_port) (15 << (4 * (tc_port)))
/* BXT PHY Ref registers */ /* BXT PHY Ref registers */
#define _PORT_REF_DW3_A 0x16218C #define _PORT_REF_DW3_A 0x16218C
...@@ -4593,12 +4597,12 @@ enum { ...@@ -4593,12 +4597,12 @@ enum {
#define DRM_DIP_ENABLE (1 << 28) #define DRM_DIP_ENABLE (1 << 28)
#define PSR_VSC_BIT_7_SET (1 << 27) #define PSR_VSC_BIT_7_SET (1 << 27)
#define VSC_SELECT_MASK (0x3 << 26) #define VSC_SELECT_MASK (0x3 << 25)
#define VSC_SELECT_SHIFT 26 #define VSC_SELECT_SHIFT 25
#define VSC_DIP_HW_HEA_DATA (0 << 26) #define VSC_DIP_HW_HEA_DATA (0 << 25)
#define VSC_DIP_HW_HEA_SW_DATA (1 << 26) #define VSC_DIP_HW_HEA_SW_DATA (1 << 25)
#define VSC_DIP_HW_DATA_SW_HEA (2 << 26) #define VSC_DIP_HW_DATA_SW_HEA (2 << 25)
#define VSC_DIP_SW_HEA_DATA (3 << 26) #define VSC_DIP_SW_HEA_DATA (3 << 25)
#define VDIP_ENABLE_PPS (1 << 24) #define VDIP_ENABLE_PPS (1 << 24)
/* Panel power sequencing */ /* Panel power sequencing */
......
...@@ -144,6 +144,9 @@ static const struct { ...@@ -144,6 +144,9 @@ static const struct {
/* HDMI N/CTS table */ /* HDMI N/CTS table */
#define TMDS_297M 297000 #define TMDS_297M 297000
#define TMDS_296M 296703 #define TMDS_296M 296703
#define TMDS_594M 594000
#define TMDS_593M 593407
static const struct { static const struct {
int sample_rate; int sample_rate;
int clock; int clock;
...@@ -164,6 +167,20 @@ static const struct { ...@@ -164,6 +167,20 @@ static const struct {
{ 176400, TMDS_297M, 18816, 247500 }, { 176400, TMDS_297M, 18816, 247500 },
{ 192000, TMDS_296M, 23296, 281250 }, { 192000, TMDS_296M, 23296, 281250 },
{ 192000, TMDS_297M, 20480, 247500 }, { 192000, TMDS_297M, 20480, 247500 },
{ 44100, TMDS_593M, 8918, 937500 },
{ 44100, TMDS_594M, 9408, 990000 },
{ 48000, TMDS_593M, 5824, 562500 },
{ 48000, TMDS_594M, 6144, 594000 },
{ 32000, TMDS_593M, 5824, 843750 },
{ 32000, TMDS_594M, 3072, 445500 },
{ 88200, TMDS_593M, 17836, 937500 },
{ 88200, TMDS_594M, 18816, 990000 },
{ 96000, TMDS_593M, 11648, 562500 },
{ 96000, TMDS_594M, 12288, 594000 },
{ 176400, TMDS_593M, 35672, 937500 },
{ 176400, TMDS_594M, 37632, 990000 },
{ 192000, TMDS_593M, 23296, 562500 },
{ 192000, TMDS_594M, 24576, 594000 },
}; };
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */ /* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
......
...@@ -2138,16 +2138,8 @@ void intel_set_cdclk(struct drm_i915_private *dev_priv, ...@@ -2138,16 +2138,8 @@ void intel_set_cdclk(struct drm_i915_private *dev_priv,
static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv, static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
int pixel_rate) int pixel_rate)
{ {
if (INTEL_GEN(dev_priv) >= 10) if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
return DIV_ROUND_UP(pixel_rate, 2); return DIV_ROUND_UP(pixel_rate, 2);
else if (IS_GEMINILAKE(dev_priv))
/*
* FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
* as a temporary workaround. Use a higher cdclk instead. (Note that
* intel_compute_max_dotclk() limits the max pixel clock to 99% of max
* cdclk.)
*/
return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
else if (IS_GEN9(dev_priv) || else if (IS_GEN9(dev_priv) ||
IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
return pixel_rate; return pixel_rate;
...@@ -2543,14 +2535,8 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv) ...@@ -2543,14 +2535,8 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
{ {
int max_cdclk_freq = dev_priv->max_cdclk_freq; int max_cdclk_freq = dev_priv->max_cdclk_freq;
if (INTEL_GEN(dev_priv) >= 10) if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
return 2 * max_cdclk_freq; return 2 * max_cdclk_freq;
else if (IS_GEMINILAKE(dev_priv))
/*
* FIXME: Limiting to 99% as a temporary workaround. See
* intel_min_cdclk() for details.
*/
return 2 * max_cdclk_freq * 99 / 100;
else if (IS_GEN9(dev_priv) || else if (IS_GEN9(dev_priv) ||
IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
return max_cdclk_freq; return max_cdclk_freq;
......
...@@ -12768,19 +12768,14 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -12768,19 +12768,14 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
intel_check_cpu_fifo_underruns(dev_priv); intel_check_cpu_fifo_underruns(dev_priv);
intel_check_pch_fifo_underruns(dev_priv); intel_check_pch_fifo_underruns(dev_priv);
if (!new_crtc_state->active) { /* FIXME unify this for all platforms */
/* if (!new_crtc_state->active &&
* Make sure we don't call initial_watermarks !HAS_GMCH_DISPLAY(dev_priv) &&
* for ILK-style watermark updates. dev_priv->display.initial_watermarks)
*
* No clue what this is supposed to achieve.
*/
if (INTEL_GEN(dev_priv) >= 9)
dev_priv->display.initial_watermarks(intel_state, dev_priv->display.initial_watermarks(intel_state,
to_intel_crtc_state(new_crtc_state)); to_intel_crtc_state(new_crtc_state));
} }
} }
}
/* FIXME: Eventually get rid of our intel_crtc->config pointer */ /* FIXME: Eventually get rid of our intel_crtc->config pointer */
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
...@@ -14646,7 +14641,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb, ...@@ -14646,7 +14641,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
fb->height < SKL_MIN_YUV_420_SRC_H || fb->height < SKL_MIN_YUV_420_SRC_H ||
(fb->width % 4) != 0 || (fb->height % 4) != 0)) { (fb->width % 4) != 0 || (fb->height % 4) != 0)) {
DRM_DEBUG_KMS("src dimensions not correct for NV12\n"); DRM_DEBUG_KMS("src dimensions not correct for NV12\n");
return -EINVAL; goto err;
} }
for (i = 0; i < fb->format->num_planes; i++) { for (i = 0; i < fb->format->num_planes; i++) {
......
...@@ -297,8 +297,10 @@ void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv) ...@@ -297,8 +297,10 @@ void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv)
lpe_audio_platdev_destroy(dev_priv); lpe_audio_platdev_destroy(dev_priv);
irq_free_desc(dev_priv->lpe_audio.irq); irq_free_desc(dev_priv->lpe_audio.irq);
}
dev_priv->lpe_audio.irq = -1;
dev_priv->lpe_audio.platdev = NULL;
}
/** /**
* intel_lpe_audio_notify() - notify lpe audio event * intel_lpe_audio_notify() - notify lpe audio event
......
...@@ -2881,8 +2881,7 @@ static void intel_read_wm_latency(struct drm_i915_private *dev_priv, ...@@ -2881,8 +2881,7 @@ static void intel_read_wm_latency(struct drm_i915_private *dev_priv,
* any underrun. If not able to get Dimm info assume 16GB dimm * any underrun. If not able to get Dimm info assume 16GB dimm
* to avoid any underrun. * to avoid any underrun.
*/ */
if (!dev_priv->dram_info.valid_dimm || if (dev_priv->dram_info.is_16gb_dimm)
dev_priv->dram_info.is_16gb_dimm)
wm[0] += 1; wm[0] += 1;
} else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
......
...@@ -551,7 +551,7 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg) ...@@ -551,7 +551,7 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg)
err = igt_check_page_sizes(vma); err = igt_check_page_sizes(vma);
if (vma->page_sizes.gtt != I915_GTT_PAGE_SIZE_4K) { if (vma->page_sizes.gtt != I915_GTT_PAGE_SIZE_4K) {
pr_err("page_sizes.gtt=%u, expected %lu\n", pr_err("page_sizes.gtt=%u, expected %llu\n",
vma->page_sizes.gtt, I915_GTT_PAGE_SIZE_4K); vma->page_sizes.gtt, I915_GTT_PAGE_SIZE_4K);
err = -EINVAL; err = -EINVAL;
} }
......
...@@ -1337,7 +1337,7 @@ static int igt_gtt_reserve(void *arg) ...@@ -1337,7 +1337,7 @@ static int igt_gtt_reserve(void *arg)
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
if (vma->node.start != total || if (vma->node.start != total ||
vma->node.size != 2*I915_GTT_PAGE_SIZE) { vma->node.size != 2*I915_GTT_PAGE_SIZE) {
pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
vma->node.start, vma->node.size, vma->node.start, vma->node.size,
total, 2*I915_GTT_PAGE_SIZE); total, 2*I915_GTT_PAGE_SIZE);
err = -EINVAL; err = -EINVAL;
...@@ -1386,7 +1386,7 @@ static int igt_gtt_reserve(void *arg) ...@@ -1386,7 +1386,7 @@ static int igt_gtt_reserve(void *arg)
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
if (vma->node.start != total || if (vma->node.start != total ||
vma->node.size != 2*I915_GTT_PAGE_SIZE) { vma->node.size != 2*I915_GTT_PAGE_SIZE) {
pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
vma->node.start, vma->node.size, vma->node.start, vma->node.size,
total, 2*I915_GTT_PAGE_SIZE); total, 2*I915_GTT_PAGE_SIZE);
err = -EINVAL; err = -EINVAL;
...@@ -1430,7 +1430,7 @@ static int igt_gtt_reserve(void *arg) ...@@ -1430,7 +1430,7 @@ static int igt_gtt_reserve(void *arg)
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
if (vma->node.start != offset || if (vma->node.start != offset ||
vma->node.size != 2*I915_GTT_PAGE_SIZE) { vma->node.size != 2*I915_GTT_PAGE_SIZE) {
pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
vma->node.start, vma->node.size, vma->node.start, vma->node.size,
offset, 2*I915_GTT_PAGE_SIZE); offset, 2*I915_GTT_PAGE_SIZE);
err = -EINVAL; err = -EINVAL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册