[PATCH] drm/i915/gvt: factor out tlb and mocs register offset table
Zhenyu Wang
zhenyuw at linux.intel.com
Fri Jul 26 09:14:37 UTC 2019
On 2019.07.26 07:28:14 +0000, Wang, Zhi A wrote:
> Ping.
>
Looks ok to me.
Reviewed-by: Zhenyu Wang <zhenyuw at linux.intel.com>
> -----Original Message-----
> From: intel-gvt-dev [mailto:intel-gvt-dev-bounces at lists.freedesktop.org] On Behalf Of Aleksei Gimbitskii
> Sent: Monday, July 22, 2019 2:07 PM
> To: intel-gvt-dev at lists.freedesktop.org
> Cc: Wang, Zhi A <zhi.a.wang at intel.com>
> Subject: [PATCH] drm/i915/gvt: factor out tlb and mocs register offset table
>
> From: Zhi Wang <zhi.a.wang at intel.com>
>
> Factor out tlb and mocs register offset table to fix the issues reported by klocwork, #512 and #550. Mostly, the reason why the klocwork reports these problems is because there can be possbilities for platforms, which have more rings than the ring offset table, to take the dirty data from the stack as the register offset. It results to a random HW register offset writting in this scenairo when doing context switch between vGPUs.
>
> After the factoring, the ring offset table of TLB and MOCS should be per platform.
>
> v2:
>
> - Enable TLB register switch for GEN8. (Zhenyu)
>
> Signed-off-by: Zhi Wang <zhi.a.wang at intel.com>
> ---
> drivers/gpu/drm/i915/gvt/gvt.h | 4 ++
> drivers/gpu/drm/i915/gvt/mmio_context.c | 57 +++++++++++++++++--------
> 2 files changed, 43 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h index 3ff59dcf6977..b47c6acaf9c0 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.h
> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
> @@ -334,6 +334,10 @@ struct intel_gvt {
> struct {
> struct engine_mmio *mmio;
> int ctx_mmio_count[I915_NUM_ENGINES];
> + u32 *tlb_mmio_offset_list;
> + u32 tlb_mmio_offset_list_cnt;
> + u32 *mocs_mmio_offset_list;
> + u32 mocs_mmio_offset_list_cnt;
> } engine_mmio_list;
>
> struct dentry *debugfs_root;
> diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c
> index 2998999e8568..4208e40445b1 100644
> --- a/drivers/gpu/drm/i915/gvt/mmio_context.c
> +++ b/drivers/gpu/drm/i915/gvt/mmio_context.c
> @@ -148,19 +148,27 @@ static struct {
> u32 l3cc_table[GEN9_MOCS_SIZE / 2];
> } gen9_render_mocs;
>
> +static u32 gen9_mocs_mmio_offset_list[] = {
> + [RCS0] = 0xc800,
> + [VCS0] = 0xc900,
> + [VCS1] = 0xca00,
> + [BCS0] = 0xcc00,
> + [VECS0] = 0xcb00,
> +};
> +
> static void load_render_mocs(struct drm_i915_private *dev_priv) {
> + struct intel_gvt *gvt = dev_priv->gvt;
> i915_reg_t offset;
> - u32 regs[] = {
> - [RCS0] = 0xc800,
> - [VCS0] = 0xc900,
> - [VCS1] = 0xca00,
> - [BCS0] = 0xcc00,
> - [VECS0] = 0xcb00,
> - };
> + u32 cnt = gvt->engine_mmio_list.mocs_mmio_offset_list_cnt;
> + u32 *regs = gvt->engine_mmio_list.mocs_mmio_offset_list;
> int ring_id, i;
>
> - for (ring_id = 0; ring_id < ARRAY_SIZE(regs); ring_id++) {
> + /* Platform doesn't have mocs mmios. */
> + if (!regs)
> + return;
> +
> + for (ring_id = 0; ring_id < cnt; ring_id++) {
> if (!HAS_ENGINE(dev_priv, ring_id))
> continue;
> offset.reg = regs[ring_id];
> @@ -327,22 +335,28 @@ int intel_vgpu_restore_inhibit_context(struct intel_vgpu *vgpu,
> return ret;
> }
>
> +static u32 gen8_tlb_mmio_offset_list[] = {
> + [RCS0] = 0x4260,
> + [VCS0] = 0x4264,
> + [VCS1] = 0x4268,
> + [BCS0] = 0x426c,
> + [VECS0] = 0x4270,
> +};
> +
> static void handle_tlb_pending_event(struct intel_vgpu *vgpu, int ring_id) {
> struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
> struct intel_uncore *uncore = &dev_priv->uncore;
> struct intel_vgpu_submission *s = &vgpu->submission;
> + u32 *regs = vgpu->gvt->engine_mmio_list.tlb_mmio_offset_list;
> + u32 cnt = vgpu->gvt->engine_mmio_list.tlb_mmio_offset_list_cnt;
> enum forcewake_domains fw;
> i915_reg_t reg;
> - u32 regs[] = {
> - [RCS0] = 0x4260,
> - [VCS0] = 0x4264,
> - [VCS1] = 0x4268,
> - [BCS0] = 0x426c,
> - [VECS0] = 0x4270,
> - };
>
> - if (WARN_ON(ring_id >= ARRAY_SIZE(regs)))
> + if (!regs)
> + return;
> +
> + if (WARN_ON(ring_id >= cnt))
> return;
>
> if (!test_and_clear_bit(ring_id, (void *)s->tlb_handle_pending)) @@ -565,10 +579,17 @@ void intel_gvt_init_engine_mmio_context(struct intel_gvt *gvt) {
> struct engine_mmio *mmio;
>
> - if (INTEL_GEN(gvt->dev_priv) >= 9)
> + if (INTEL_GEN(gvt->dev_priv) >= 9) {
> gvt->engine_mmio_list.mmio = gen9_engine_mmio_list;
> - else
> + gvt->engine_mmio_list.tlb_mmio_offset_list = gen8_tlb_mmio_offset_list;
> + gvt->engine_mmio_list.tlb_mmio_offset_list_cnt = ARRAY_SIZE(gen8_tlb_mmio_offset_list);
> + gvt->engine_mmio_list.mocs_mmio_offset_list = gen9_mocs_mmio_offset_list;
> + gvt->engine_mmio_list.mocs_mmio_offset_list_cnt = ARRAY_SIZE(gen9_mocs_mmio_offset_list);
> + } else {
> gvt->engine_mmio_list.mmio = gen8_engine_mmio_list;
> + gvt->engine_mmio_list.tlb_mmio_offset_list = gen8_tlb_mmio_offset_list;
> + gvt->engine_mmio_list.tlb_mmio_offset_list_cnt = ARRAY_SIZE(gen8_tlb_mmio_offset_list);
> + }
>
> for (mmio = gvt->engine_mmio_list.mmio;
> i915_mmio_reg_valid(mmio->reg); mmio++) {
> --
> 2.17.1
>
> ---------------------------------------------------------------------
> Intel Finland Oy
> Registered Address: PL 281, 00181 Helsinki Business Identity Code: 0357606 - 4 Domiciled in Helsinki
>
> This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
>
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
--
Open Source Technology Center, Intel ltd.
$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20190726/20a8a130/attachment.sig>
More information about the intel-gvt-dev
mailing list