forked from Minki/linux
Merge tag 'gvt-next-2019-04-16' of https://github.com/intel/gvt-linux into drm-intel-next-queued
gvt-next-2019-04-16 - Refine range of MCHBAR snapshot (Yakui) - Refine out-of-sync page struct (Yakui) - Remove unused vGPU sreg (Yan) - Refind MMIO reg names (Xiaolin) - Proper handling of sync/async flip (Colin) - Proper handling of PIPE_CONTROL/MI_FLUSH_DW index mode (Xiaolin) - EXCC reg mask fix (Colin) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> From: Zhenyu Wang <zhenyuw@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190416084814.GH17995@zhen-hp.sh.intel.com
This commit is contained in:
commit
e4eabf27ca
@ -1077,6 +1077,7 @@ static int cmd_handler_pipe_control(struct parser_exec_state *s)
|
||||
bool index_mode = false;
|
||||
unsigned int post_sync;
|
||||
int ret = 0;
|
||||
u32 hws_pga, val;
|
||||
|
||||
post_sync = (cmd_val(s, 1) & PIPE_CONTROL_POST_SYNC_OP_MASK) >> 14;
|
||||
|
||||
@ -1100,6 +1101,15 @@ static int cmd_handler_pipe_control(struct parser_exec_state *s)
|
||||
index_mode = true;
|
||||
ret |= cmd_address_audit(s, gma, sizeof(u64),
|
||||
index_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (index_mode) {
|
||||
hws_pga = s->vgpu->hws_pga[s->ring_id];
|
||||
gma = hws_pga + gma;
|
||||
patch_value(s, cmd_ptr(s, 2), gma);
|
||||
val = cmd_val(s, 1) & (~(1 << 21));
|
||||
patch_value(s, cmd_ptr(s, 1), val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1317,8 +1327,14 @@ static int gen8_update_plane_mmio_from_mi_display_flip(
|
||||
info->tile_val << 10);
|
||||
}
|
||||
|
||||
vgpu_vreg_t(vgpu, PIPE_FRMCOUNT_G4X(info->pipe))++;
|
||||
intel_vgpu_trigger_virtual_event(vgpu, info->event);
|
||||
if (info->plane == PLANE_PRIMARY)
|
||||
vgpu_vreg_t(vgpu, PIPE_FLIPCOUNT_G4X(info->pipe))++;
|
||||
|
||||
if (info->async_flip)
|
||||
intel_vgpu_trigger_virtual_event(vgpu, info->event);
|
||||
else
|
||||
set_bit(info->event, vgpu->irq.flip_done_event[info->pipe]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1563,6 +1579,7 @@ static int cmd_handler_mi_flush_dw(struct parser_exec_state *s)
|
||||
unsigned long gma;
|
||||
bool index_mode = false;
|
||||
int ret = 0;
|
||||
u32 hws_pga, val;
|
||||
|
||||
/* Check post-sync and ppgtt bit */
|
||||
if (((cmd_val(s, 0) >> 14) & 0x3) && (cmd_val(s, 1) & (1 << 2))) {
|
||||
@ -1573,6 +1590,15 @@ static int cmd_handler_mi_flush_dw(struct parser_exec_state *s)
|
||||
if (cmd_val(s, 0) & (1 << 21))
|
||||
index_mode = true;
|
||||
ret = cmd_address_audit(s, gma, sizeof(u64), index_mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (index_mode) {
|
||||
hws_pga = s->vgpu->hws_pga[s->ring_id];
|
||||
gma = hws_pga + gma;
|
||||
patch_value(s, cmd_ptr(s, 1), gma);
|
||||
val = cmd_val(s, 0) & (~(1 << 21));
|
||||
patch_value(s, cmd_ptr(s, 0), val);
|
||||
}
|
||||
}
|
||||
/* Check notify bit */
|
||||
if ((cmd_val(s, 0) & (1 << 8)))
|
||||
|
@ -407,7 +407,6 @@ static void emulate_vblank_on_pipe(struct intel_vgpu *vgpu, int pipe)
|
||||
if (!pipe_is_enabled(vgpu, pipe))
|
||||
continue;
|
||||
|
||||
vgpu_vreg_t(vgpu, PIPE_FLIPCOUNT_G4X(pipe))++;
|
||||
intel_vgpu_trigger_virtual_event(vgpu, event);
|
||||
}
|
||||
|
||||
|
@ -2489,6 +2489,7 @@ static void clean_spt_oos(struct intel_gvt *gvt)
|
||||
list_for_each_safe(pos, n, >t->oos_page_free_list_head) {
|
||||
oos_page = container_of(pos, struct intel_vgpu_oos_page, list);
|
||||
list_del(&oos_page->list);
|
||||
free_page((unsigned long)oos_page->mem);
|
||||
kfree(oos_page);
|
||||
}
|
||||
}
|
||||
@ -2509,6 +2510,12 @@ static int setup_spt_oos(struct intel_gvt *gvt)
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
oos_page->mem = (void *)__get_free_pages(GFP_KERNEL, 0);
|
||||
if (!oos_page->mem) {
|
||||
ret = -ENOMEM;
|
||||
kfree(oos_page);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&oos_page->list);
|
||||
INIT_LIST_HEAD(&oos_page->vm_list);
|
||||
|
@ -221,7 +221,7 @@ struct intel_vgpu_oos_page {
|
||||
struct list_head list;
|
||||
struct list_head vm_list;
|
||||
int id;
|
||||
unsigned char mem[I915_GTT_PAGE_SIZE];
|
||||
void *mem;
|
||||
};
|
||||
|
||||
#define GTT_ENTRY_NUM_IN_ONE_PAGE 512
|
||||
|
@ -94,7 +94,6 @@ struct intel_vgpu_fence {
|
||||
|
||||
struct intel_vgpu_mmio {
|
||||
void *vreg;
|
||||
void *sreg;
|
||||
};
|
||||
|
||||
#define INTEL_GVT_MAX_BAR_NUM 4
|
||||
@ -111,11 +110,9 @@ struct intel_vgpu_cfg_space {
|
||||
|
||||
#define vgpu_cfg_space(vgpu) ((vgpu)->cfg_space.virtual_cfg_space)
|
||||
|
||||
#define INTEL_GVT_MAX_PIPE 4
|
||||
|
||||
struct intel_vgpu_irq {
|
||||
bool irq_warn_once[INTEL_GVT_EVENT_MAX];
|
||||
DECLARE_BITMAP(flip_done_event[INTEL_GVT_MAX_PIPE],
|
||||
DECLARE_BITMAP(flip_done_event[I915_MAX_PIPES],
|
||||
INTEL_GVT_EVENT_MAX);
|
||||
};
|
||||
|
||||
@ -449,10 +446,6 @@ void intel_vgpu_write_fence(struct intel_vgpu *vgpu,
|
||||
(*(u64 *)(vgpu->mmio.vreg + i915_mmio_reg_offset(reg)))
|
||||
#define vgpu_vreg64(vgpu, offset) \
|
||||
(*(u64 *)(vgpu->mmio.vreg + (offset)))
|
||||
#define vgpu_sreg_t(vgpu, reg) \
|
||||
(*(u32 *)(vgpu->mmio.sreg + i915_mmio_reg_offset(reg)))
|
||||
#define vgpu_sreg(vgpu, offset) \
|
||||
(*(u32 *)(vgpu->mmio.sreg + (offset)))
|
||||
|
||||
#define for_each_active_vgpu(gvt, vgpu, id) \
|
||||
idr_for_each_entry((&(gvt)->vgpu_idr), (vgpu), (id)) \
|
||||
|
@ -750,18 +750,19 @@ static int pri_surf_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
void *p_data, unsigned int bytes)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
|
||||
unsigned int index = DSPSURF_TO_PIPE(offset);
|
||||
i915_reg_t surflive_reg = DSPSURFLIVE(index);
|
||||
int flip_event[] = {
|
||||
[PIPE_A] = PRIMARY_A_FLIP_DONE,
|
||||
[PIPE_B] = PRIMARY_B_FLIP_DONE,
|
||||
[PIPE_C] = PRIMARY_C_FLIP_DONE,
|
||||
};
|
||||
u32 pipe = DSPSURF_TO_PIPE(offset);
|
||||
int event = SKL_FLIP_EVENT(pipe, PLANE_PRIMARY);
|
||||
|
||||
write_vreg(vgpu, offset, p_data, bytes);
|
||||
vgpu_vreg_t(vgpu, surflive_reg) = vgpu_vreg(vgpu, offset);
|
||||
vgpu_vreg_t(vgpu, DSPSURFLIVE(pipe)) = vgpu_vreg(vgpu, offset);
|
||||
|
||||
vgpu_vreg_t(vgpu, PIPE_FLIPCOUNT_G4X(pipe))++;
|
||||
|
||||
if (vgpu_vreg_t(vgpu, DSPCNTR(pipe)) & PLANE_CTL_ASYNC_FLIP)
|
||||
intel_vgpu_trigger_virtual_event(vgpu, event);
|
||||
else
|
||||
set_bit(event, vgpu->irq.flip_done_event[pipe]);
|
||||
|
||||
set_bit(flip_event[index], vgpu->irq.flip_done_event[index]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -771,18 +772,42 @@ static int pri_surf_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
static int spr_surf_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
void *p_data, unsigned int bytes)
|
||||
{
|
||||
unsigned int index = SPRSURF_TO_PIPE(offset);
|
||||
i915_reg_t surflive_reg = SPRSURFLIVE(index);
|
||||
int flip_event[] = {
|
||||
[PIPE_A] = SPRITE_A_FLIP_DONE,
|
||||
[PIPE_B] = SPRITE_B_FLIP_DONE,
|
||||
[PIPE_C] = SPRITE_C_FLIP_DONE,
|
||||
};
|
||||
u32 pipe = SPRSURF_TO_PIPE(offset);
|
||||
int event = SKL_FLIP_EVENT(pipe, PLANE_SPRITE0);
|
||||
|
||||
write_vreg(vgpu, offset, p_data, bytes);
|
||||
vgpu_vreg_t(vgpu, surflive_reg) = vgpu_vreg(vgpu, offset);
|
||||
vgpu_vreg_t(vgpu, SPRSURFLIVE(pipe)) = vgpu_vreg(vgpu, offset);
|
||||
|
||||
if (vgpu_vreg_t(vgpu, SPRCTL(pipe)) & PLANE_CTL_ASYNC_FLIP)
|
||||
intel_vgpu_trigger_virtual_event(vgpu, event);
|
||||
else
|
||||
set_bit(event, vgpu->irq.flip_done_event[pipe]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int reg50080_mmio_write(struct intel_vgpu *vgpu,
|
||||
unsigned int offset, void *p_data,
|
||||
unsigned int bytes)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
|
||||
enum pipe pipe = REG_50080_TO_PIPE(offset);
|
||||
enum plane_id plane = REG_50080_TO_PLANE(offset);
|
||||
int event = SKL_FLIP_EVENT(pipe, plane);
|
||||
|
||||
write_vreg(vgpu, offset, p_data, bytes);
|
||||
if (plane == PLANE_PRIMARY) {
|
||||
vgpu_vreg_t(vgpu, DSPSURFLIVE(pipe)) = vgpu_vreg(vgpu, offset);
|
||||
vgpu_vreg_t(vgpu, PIPE_FLIPCOUNT_G4X(pipe))++;
|
||||
} else {
|
||||
vgpu_vreg_t(vgpu, SPRSURFLIVE(pipe)) = vgpu_vreg(vgpu, offset);
|
||||
}
|
||||
|
||||
if ((vgpu_vreg(vgpu, offset) & REG50080_FLIP_TYPE_MASK) == REG50080_FLIP_TYPE_ASYNC)
|
||||
intel_vgpu_trigger_virtual_event(vgpu, event);
|
||||
else
|
||||
set_bit(event, vgpu->irq.flip_done_event[pipe]);
|
||||
|
||||
set_bit(flip_event[index], vgpu->irq.flip_done_event[index]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1969,6 +1994,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DH(DSPSURF(PIPE_A), D_ALL, NULL, pri_surf_mmio_write);
|
||||
MMIO_D(DSPOFFSET(PIPE_A), D_ALL);
|
||||
MMIO_D(DSPSURFLIVE(PIPE_A), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_A, PLANE_PRIMARY), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(DSPCNTR(PIPE_B), D_ALL);
|
||||
MMIO_D(DSPADDR(PIPE_B), D_ALL);
|
||||
@ -1978,6 +2005,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DH(DSPSURF(PIPE_B), D_ALL, NULL, pri_surf_mmio_write);
|
||||
MMIO_D(DSPOFFSET(PIPE_B), D_ALL);
|
||||
MMIO_D(DSPSURFLIVE(PIPE_B), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_B, PLANE_PRIMARY), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(DSPCNTR(PIPE_C), D_ALL);
|
||||
MMIO_D(DSPADDR(PIPE_C), D_ALL);
|
||||
@ -1987,6 +2016,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DH(DSPSURF(PIPE_C), D_ALL, NULL, pri_surf_mmio_write);
|
||||
MMIO_D(DSPOFFSET(PIPE_C), D_ALL);
|
||||
MMIO_D(DSPSURFLIVE(PIPE_C), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_C, PLANE_PRIMARY), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(SPRCTL(PIPE_A), D_ALL);
|
||||
MMIO_D(SPRLINOFF(PIPE_A), D_ALL);
|
||||
@ -2000,6 +2031,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_D(SPROFFSET(PIPE_A), D_ALL);
|
||||
MMIO_D(SPRSCALE(PIPE_A), D_ALL);
|
||||
MMIO_D(SPRSURFLIVE(PIPE_A), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_A, PLANE_SPRITE0), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(SPRCTL(PIPE_B), D_ALL);
|
||||
MMIO_D(SPRLINOFF(PIPE_B), D_ALL);
|
||||
@ -2013,6 +2046,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_D(SPROFFSET(PIPE_B), D_ALL);
|
||||
MMIO_D(SPRSCALE(PIPE_B), D_ALL);
|
||||
MMIO_D(SPRSURFLIVE(PIPE_B), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_B, PLANE_SPRITE0), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(SPRCTL(PIPE_C), D_ALL);
|
||||
MMIO_D(SPRLINOFF(PIPE_C), D_ALL);
|
||||
@ -2026,6 +2061,8 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_D(SPROFFSET(PIPE_C), D_ALL);
|
||||
MMIO_D(SPRSCALE(PIPE_C), D_ALL);
|
||||
MMIO_D(SPRSURFLIVE(PIPE_C), D_ALL);
|
||||
MMIO_DH(REG_50080(PIPE_C, PLANE_SPRITE0), D_ALL, NULL,
|
||||
reg50080_mmio_write);
|
||||
|
||||
MMIO_D(HTOTAL(TRANSCODER_A), D_ALL);
|
||||
MMIO_D(HBLANK(TRANSCODER_A), D_ALL);
|
||||
@ -2827,26 +2864,26 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
|
||||
|
||||
MMIO_DH(DBUF_CTL, D_SKL_PLUS, NULL, gen9_dbuf_ctl_mmio_write);
|
||||
|
||||
MMIO_D(_MMIO(0xa210), D_SKL_PLUS);
|
||||
MMIO_D(GEN9_PG_ENABLE, D_SKL_PLUS);
|
||||
MMIO_D(GEN9_MEDIA_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
|
||||
MMIO_D(GEN9_RENDER_PG_IDLE_HYSTERESIS, D_SKL_PLUS);
|
||||
MMIO_DFH(GEN9_GAMT_ECO_REG_RW_IA, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DH(_MMIO(0x4ddc), D_SKL_PLUS, NULL, NULL);
|
||||
MMIO_DH(_MMIO(0x42080), D_SKL_PLUS, NULL, NULL);
|
||||
MMIO_D(_MMIO(0x45504), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x45520), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x46000), D_SKL_PLUS);
|
||||
MMIO_DH(_MMIO(0x46010), D_SKL_PLUS, NULL, skl_lcpll_write);
|
||||
MMIO_DH(_MMIO(0x46014), D_SKL_PLUS, NULL, skl_lcpll_write);
|
||||
MMIO_D(_MMIO(0x6C040), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6C048), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6C050), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6C044), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6C04C), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6C054), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6c058), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6c05c), D_SKL_PLUS);
|
||||
MMIO_DH(_MMIO(0x6c060), D_SKL_PLUS, dpll_status_read, NULL);
|
||||
MMIO_DH(MMCD_MISC_CTRL, D_SKL_PLUS, NULL, NULL);
|
||||
MMIO_DH(CHICKEN_PAR1_1, D_SKL_PLUS, NULL, NULL);
|
||||
MMIO_D(DC_STATE_EN, D_SKL_PLUS);
|
||||
MMIO_D(DC_STATE_DEBUG, D_SKL_PLUS);
|
||||
MMIO_D(CDCLK_CTL, D_SKL_PLUS);
|
||||
MMIO_DH(LCPLL1_CTL, D_SKL_PLUS, NULL, skl_lcpll_write);
|
||||
MMIO_DH(LCPLL2_CTL, D_SKL_PLUS, NULL, skl_lcpll_write);
|
||||
MMIO_D(_MMIO(_DPLL1_CFGCR1), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_DPLL2_CFGCR1), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_DPLL3_CFGCR1), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_DPLL1_CFGCR2), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_DPLL2_CFGCR2), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_DPLL3_CFGCR2), D_SKL_PLUS);
|
||||
MMIO_D(DPLL_CTRL1, D_SKL_PLUS);
|
||||
MMIO_D(DPLL_CTRL2, D_SKL_PLUS);
|
||||
MMIO_DH(DPLL_STATUS, D_SKL_PLUS, dpll_status_read, NULL);
|
||||
|
||||
MMIO_DH(SKL_PS_WIN_POS(PIPE_A, 0), D_SKL_PLUS, NULL, pf_write);
|
||||
MMIO_DH(SKL_PS_WIN_POS(PIPE_A, 1), D_SKL_PLUS, NULL, pf_write);
|
||||
@ -2965,40 +3002,41 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DH(_MMIO(_REG_701C4(PIPE_C, 3)), D_SKL_PLUS, NULL, NULL);
|
||||
MMIO_DH(_MMIO(_REG_701C4(PIPE_C, 4)), D_SKL_PLUS, NULL, NULL);
|
||||
|
||||
MMIO_D(_MMIO(0x70380), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x71380), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_PLANE_CTL_3_A), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_PLANE_CTL_3_B), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x72380), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x7239c), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x7039c), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(_PLANE_SURF_3_A), D_SKL_PLUS);
|
||||
|
||||
MMIO_D(_MMIO(0x8f074), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x8f004), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x8f034), D_SKL_PLUS);
|
||||
MMIO_D(CSR_SSP_BASE, D_SKL_PLUS);
|
||||
MMIO_D(CSR_HTP_SKL, D_SKL_PLUS);
|
||||
MMIO_D(CSR_LAST_WRITE, D_SKL_PLUS);
|
||||
|
||||
MMIO_D(_MMIO(0xb11c), D_SKL_PLUS);
|
||||
MMIO_D(BDW_SCRATCH1, D_SKL_PLUS);
|
||||
|
||||
MMIO_D(_MMIO(0x51000), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6c00c), D_SKL_PLUS);
|
||||
MMIO_D(SKL_DFSM, D_SKL_PLUS);
|
||||
MMIO_D(DISPIO_CR_TX_BMU_CR0, D_SKL_PLUS);
|
||||
|
||||
MMIO_F(_MMIO(0xc800), 0x7f8, F_CMD_ACCESS, 0, 0, D_SKL_PLUS,
|
||||
MMIO_F(GEN9_GFX_MOCS(0), 0x7f8, F_CMD_ACCESS, 0, 0, D_SKL_PLUS,
|
||||
NULL, NULL);
|
||||
MMIO_F(_MMIO(0xb020), 0x80, F_CMD_ACCESS, 0, 0, D_SKL_PLUS,
|
||||
MMIO_F(GEN7_L3CNTLREG2, 0x80, F_CMD_ACCESS, 0, 0, D_SKL_PLUS,
|
||||
NULL, NULL);
|
||||
|
||||
MMIO_D(RPM_CONFIG0, D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0xd08), D_SKL_PLUS);
|
||||
MMIO_D(RC6_LOCATION, D_SKL_PLUS);
|
||||
MMIO_DFH(_MMIO(0x20e0), D_SKL_PLUS, F_MODE_MASK, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x20ec), D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
|
||||
MMIO_DFH(GEN7_FF_SLICE_CS_CHICKEN1, D_SKL_PLUS, F_MODE_MASK,
|
||||
NULL, NULL);
|
||||
MMIO_DFH(GEN9_CS_DEBUG_MODE1, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
|
||||
NULL, NULL);
|
||||
|
||||
/* TRTT */
|
||||
MMIO_DFH(_MMIO(0x4de0), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x4de4), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x4de8), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x4dec), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x4df0), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x4df4), D_SKL_PLUS, F_CMD_ACCESS,
|
||||
MMIO_DFH(TRVATTL3PTRDW(0), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(TRVATTL3PTRDW(1), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(TRVATTL3PTRDW(2), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(TRVATTL3PTRDW(3), D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(TRVADR, D_SKL_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(TRTTE, D_SKL_PLUS, F_CMD_ACCESS,
|
||||
NULL, gen9_trtte_write);
|
||||
MMIO_DH(_MMIO(0x4dfc), D_SKL_PLUS, NULL, gen9_trtt_chicken_write);
|
||||
|
||||
@ -3011,7 +3049,7 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DH(DMA_CTRL, D_SKL_PLUS, NULL, dma_ctrl_write);
|
||||
|
||||
MMIO_D(_MMIO(0x65900), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x1082c0), D_SKL_PLUS);
|
||||
MMIO_D(GEN6_STOLEN_RESERVED, D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x4068), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x67054), D_SKL_PLUS);
|
||||
MMIO_D(_MMIO(0x6e560), D_SKL_PLUS);
|
||||
@ -3042,8 +3080,8 @@ static int init_skl_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DFH(GEN9_WM_CHICKEN3, D_SKL_PLUS, F_MODE_MASK | F_CMD_ACCESS,
|
||||
NULL, NULL);
|
||||
|
||||
MMIO_D(_MMIO(0x4ab8), D_KBL | D_CFL);
|
||||
MMIO_D(_MMIO(0x2248), D_SKL_PLUS);
|
||||
MMIO_D(GAMT_CHKN_BIT_REG, D_KBL);
|
||||
MMIO_D(GEN9_CTX_PREEMPT_REG, D_KBL | D_SKL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3265,7 +3303,7 @@ void intel_gvt_clean_mmio_info(struct intel_gvt *gvt)
|
||||
/* Special MMIO blocks. */
|
||||
static struct gvt_mmio_block mmio_blocks[] = {
|
||||
{D_SKL_PLUS, _MMIO(CSR_MMIO_START_RANGE), 0x3000, NULL, NULL},
|
||||
{D_ALL, _MMIO(MCHBAR_MIRROR_BASE_SNB), 0x40000, NULL, NULL},
|
||||
{D_ALL, MCHBAR_MIRROR_REG_BASE, 0x4000, NULL, NULL},
|
||||
{D_ALL, _MMIO(VGT_PVINFO_PAGE), VGT_PVINFO_SIZE,
|
||||
pvinfo_mmio_read, pvinfo_mmio_write},
|
||||
{D_ALL, LGC_PALETTE(PIPE_A, 0), 1024, NULL, NULL},
|
||||
@ -3489,12 +3527,11 @@ int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
return mmio_info->read(vgpu, offset, pdata, bytes);
|
||||
else {
|
||||
u64 ro_mask = mmio_info->ro_mask;
|
||||
u32 old_vreg = 0, old_sreg = 0;
|
||||
u32 old_vreg = 0;
|
||||
u64 data = 0;
|
||||
|
||||
if (intel_gvt_mmio_has_mode_mask(gvt, mmio_info->offset)) {
|
||||
old_vreg = vgpu_vreg(vgpu, offset);
|
||||
old_sreg = vgpu_sreg(vgpu, offset);
|
||||
}
|
||||
|
||||
if (likely(!ro_mask))
|
||||
@ -3516,8 +3553,6 @@ int intel_vgpu_mmio_reg_rw(struct intel_vgpu *vgpu, unsigned int offset,
|
||||
|
||||
vgpu_vreg(vgpu, offset) = (old_vreg & ~mask)
|
||||
| (vgpu_vreg(vgpu, offset) & mask);
|
||||
vgpu_sreg(vgpu, offset) = (old_sreg & ~mask)
|
||||
| (vgpu_sreg(vgpu, offset) & mask);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -239,7 +239,6 @@ void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)
|
||||
|
||||
if (dmlr) {
|
||||
memcpy(vgpu->mmio.vreg, mmio, info->mmio_size);
|
||||
memcpy(vgpu->mmio.sreg, mmio, info->mmio_size);
|
||||
|
||||
vgpu_vreg_t(vgpu, GEN6_GT_THREAD_STATUS_REG) = 0;
|
||||
|
||||
@ -280,7 +279,6 @@ void intel_vgpu_reset_mmio(struct intel_vgpu *vgpu, bool dmlr)
|
||||
* touched
|
||||
*/
|
||||
memcpy(vgpu->mmio.vreg, mmio, GVT_GEN8_MMIO_RESET_OFFSET);
|
||||
memcpy(vgpu->mmio.sreg, mmio, GVT_GEN8_MMIO_RESET_OFFSET);
|
||||
}
|
||||
|
||||
}
|
||||
@ -296,12 +294,10 @@ int intel_vgpu_init_mmio(struct intel_vgpu *vgpu)
|
||||
{
|
||||
const struct intel_gvt_device_info *info = &vgpu->gvt->device_info;
|
||||
|
||||
vgpu->mmio.vreg = vzalloc(array_size(info->mmio_size, 2));
|
||||
vgpu->mmio.vreg = vzalloc(info->mmio_size);
|
||||
if (!vgpu->mmio.vreg)
|
||||
return -ENOMEM;
|
||||
|
||||
vgpu->mmio.sreg = vgpu->mmio.vreg + info->mmio_size;
|
||||
|
||||
intel_vgpu_reset_mmio(vgpu, true);
|
||||
|
||||
return 0;
|
||||
@ -315,5 +311,5 @@ int intel_vgpu_init_mmio(struct intel_vgpu *vgpu)
|
||||
void intel_vgpu_clean_mmio(struct intel_vgpu *vgpu)
|
||||
{
|
||||
vfree(vgpu->mmio.vreg);
|
||||
vgpu->mmio.vreg = vgpu->mmio.sreg = NULL;
|
||||
vgpu->mmio.vreg = NULL;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ static struct engine_mmio gen8_engine_mmio_list[] __cacheline_aligned = {
|
||||
{BCS0, RING_MI_MODE(BLT_RING_BASE), 0xffff, false}, /* 0x2209c */
|
||||
{BCS0, RING_INSTPM(BLT_RING_BASE), 0xffff, false}, /* 0x220c0 */
|
||||
{BCS0, RING_HWSTAM(BLT_RING_BASE), 0x0, false}, /* 0x22098 */
|
||||
{BCS0, RING_EXCC(BLT_RING_BASE), 0x0, false}, /* 0x22028 */
|
||||
{BCS0, RING_EXCC(BLT_RING_BASE), 0xffff, false}, /* 0x22028 */
|
||||
{RCS0, INVALID_MMIO_REG, 0, false } /* Terminated */
|
||||
};
|
||||
|
||||
@ -119,7 +119,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = {
|
||||
{BCS0, RING_MI_MODE(BLT_RING_BASE), 0xffff, false}, /* 0x2209c */
|
||||
{BCS0, RING_INSTPM(BLT_RING_BASE), 0xffff, false}, /* 0x220c0 */
|
||||
{BCS0, RING_HWSTAM(BLT_RING_BASE), 0x0, false}, /* 0x22098 */
|
||||
{BCS0, RING_EXCC(BLT_RING_BASE), 0x0, false}, /* 0x22028 */
|
||||
{BCS0, RING_EXCC(BLT_RING_BASE), 0xffff, false}, /* 0x22028 */
|
||||
|
||||
{VCS1, RING_EXCC(GEN8_BSD2_RING_BASE), 0xffff, false}, /* 0x1c028 */
|
||||
|
||||
|
@ -60,6 +60,37 @@
|
||||
#define _REG_701C0(pipe, plane) (0x701c0 + pipe * 0x1000 + (plane - 1) * 0x100)
|
||||
#define _REG_701C4(pipe, plane) (0x701c4 + pipe * 0x1000 + (plane - 1) * 0x100)
|
||||
|
||||
#define SKL_FLIP_EVENT(pipe, plane) (PRIMARY_A_FLIP_DONE + (plane) * 3 + (pipe))
|
||||
|
||||
#define PLANE_CTL_ASYNC_FLIP (1 << 9)
|
||||
#define REG50080_FLIP_TYPE_MASK 0x3
|
||||
#define REG50080_FLIP_TYPE_ASYNC 0x1
|
||||
|
||||
#define REG_50080(_pipe, _plane) ({ \
|
||||
typeof(_pipe) (p) = (_pipe); \
|
||||
typeof(_plane) (q) = (_plane); \
|
||||
(((p) == PIPE_A) ? (((q) == PLANE_PRIMARY) ? (_MMIO(0x50080)) : \
|
||||
(_MMIO(0x50090))) : \
|
||||
(((p) == PIPE_B) ? (((q) == PLANE_PRIMARY) ? (_MMIO(0x50088)) : \
|
||||
(_MMIO(0x50098))) : \
|
||||
(((p) == PIPE_C) ? (((q) == PLANE_PRIMARY) ? (_MMIO(0x5008C)) : \
|
||||
(_MMIO(0x5009C))) : \
|
||||
(_MMIO(0x50080))))); })
|
||||
|
||||
#define REG_50080_TO_PIPE(_reg) ({ \
|
||||
typeof(_reg) (reg) = (_reg); \
|
||||
(((reg) == 0x50080 || (reg) == 0x50090) ? (PIPE_A) : \
|
||||
(((reg) == 0x50088 || (reg) == 0x50098) ? (PIPE_B) : \
|
||||
(((reg) == 0x5008C || (reg) == 0x5009C) ? (PIPE_C) : \
|
||||
(INVALID_PIPE)))); })
|
||||
|
||||
#define REG_50080_TO_PLANE(_reg) ({ \
|
||||
typeof(_reg) (reg) = (_reg); \
|
||||
(((reg) == 0x50080 || (reg) == 0x50088 || (reg) == 0x5008C) ? \
|
||||
(PLANE_PRIMARY) : \
|
||||
(((reg) == 0x50090 || (reg) == 0x50098 || (reg) == 0x5009C) ? \
|
||||
(PLANE_SPRITE0) : (I915_MAX_PLANES))); })
|
||||
|
||||
#define GFX_MODE_BIT_SET_IN_MASK(val, bit) \
|
||||
((((bit) & 0xffff0000) == 0) && !!((val) & (((bit) << 16))))
|
||||
|
||||
@ -95,4 +126,7 @@
|
||||
#define RING_GFX_MODE(base) _MMIO((base) + 0x29c)
|
||||
#define VF_GUARDBAND _MMIO(0x83a4)
|
||||
|
||||
/* define the effective range of MCHBAR register on Sandybridge+ */
|
||||
#define MCHBAR_MIRROR_REG_BASE _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x4000)
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user