Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp3262000imj; Mon, 18 Feb 2019 23:52:03 -0800 (PST) X-Google-Smtp-Source: AHgI3IaQcB7Xs6FYRmshd8GC036nFOYfi301arv6yMTXPHk9R+NohZT2NiwhuIaHlZpb9hAirFDD X-Received: by 2002:a17:902:b101:: with SMTP id q1mr29580886plr.135.1550562723422; Mon, 18 Feb 2019 23:52:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550562723; cv=none; d=google.com; s=arc-20160816; b=IvRE+EgXhx7HpObNRM6qmD8Vjqa+yEaVzin1Upz+5H/CyEE4trvCB5vt0sfK0qgh6D bTqPLT05w3/afXu0h4v6Rd+zZIZsmNt7q5OLVreejs/wUNEhRAQIhceDVKDOvQkhv8BG kyg5PlBDev5JS/t9VpAhmZjQpUYsv+dO2ayevJSPKTL5OYtxCA6OMvb2kT6hxKPq2twT RMXfH1W+UapvA+fm5wit1oYABvjkbGZ9DeHPmDYBGq/lGswE4FmlYHXNmruRNPtdzphJ yAASkh9KP2lHHfqTSoZPj+4CIomc9QDyyhglByfq4eWm/cAYAAgfSieENDU9lZq5+1GC xosg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=8Uv5XGic3jFjheq3uBalIYHsIthPmcN9HqTR7gaPtyQ=; b=i319bUSFCwpy2ZfPddRjEFxGxgpcSkPU9TPei58QESHEQg1Yb+KnymudcmXmUjMh7U 774rj/RMRUO1fN1OCBB+cppareGyActXR49BAEev1tfmXab0U2f/rrFIQdVJLacx52cD z9VJYKEfZ7AjQzZ/WUsk+G1kTGv18bt9Px+W6cx+m9HWVm/7qUSgMemTC/Zd1qTvgc7r SQk9TAcvXnnA6CCDaHAUai5IIoMxWpqUIZ39Jer84vk00YmYdRR45KW7Wwn4JilibIib aGf1yEit2I7ttFgLhrJr9Sk9ta7rxBYd/Y/h528E+mQs4bl41R/EW/IC5CmcgijFyQN+ tcuw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t20si15551982plo.360.2019.02.18.23.51.48; Mon, 18 Feb 2019 23:52:03 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727361AbfBSHvL (ORCPT + 99 others); Tue, 19 Feb 2019 02:51:11 -0500 Received: from mga11.intel.com ([192.55.52.93]:22889 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726695AbfBSHvL (ORCPT ); Tue, 19 Feb 2019 02:51:11 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Feb 2019 23:51:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,387,1544515200"; d="scan'208";a="147958309" Received: from joy-optiplex-7040.sh.intel.com ([10.239.13.9]) by fmsmga001.fm.intel.com with ESMTP; 18 Feb 2019 23:51:09 -0800 From: Yan Zhao To: intel-gvt-dev@lists.freedesktop.org, alex.williamson@redhat.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Yulei Zhang Subject: [PATCH 3/8] drm/i915/gvt: Patch the gma in gpu commands during command parser Date: Tue, 19 Feb 2019 02:45:53 -0500 Message-Id: <20190219074553.14170-1-yan.y.zhao@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190219074242.14015-1-yan.y.zhao@intel.com> References: <20190219074242.14015-1-yan.y.zhao@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yulei Zhang Adjust the graphics memory address in gpu commands according to the shift offset in guests' aperture and hidden gm address, and patch the commands before submit to execute. Signed-off-by: Yulei Zhang --- drivers/gpu/drm/i915/gvt/cmd_parser.c | 31 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 77ae634eb11c..90836756b235 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c @@ -984,7 +984,8 @@ static int cmd_handler_lrr(struct parser_exec_state *s) } static inline int cmd_address_audit(struct parser_exec_state *s, - unsigned long guest_gma, int op_size, bool index_mode); + unsigned long guest_gma, int op_size, + bool index_mode, int offset); static int cmd_handler_lrm(struct parser_exec_state *s) { @@ -1006,7 +1007,8 @@ static int cmd_handler_lrm(struct parser_exec_state *s) gma = cmd_gma(s, i + 1); if (gmadr_bytes == 8) gma |= (cmd_gma_hi(s, i + 2)) << 32; - ret |= cmd_address_audit(s, gma, sizeof(u32), false); + ret |= cmd_address_audit(s, gma, sizeof(u32), + false, i + 1); if (ret) break; } @@ -1030,7 +1032,8 @@ static int cmd_handler_srm(struct parser_exec_state *s) gma = cmd_gma(s, i + 1); if (gmadr_bytes == 8) gma |= (cmd_gma_hi(s, i + 2)) << 32; - ret |= cmd_address_audit(s, gma, sizeof(u32), false); + ret |= cmd_address_audit(s, gma, sizeof(u32), + false, i + 1); if (ret) break; } @@ -1102,7 +1105,7 @@ static int cmd_handler_pipe_control(struct parser_exec_state *s) if (cmd_val(s, 1) & (1 << 21)) index_mode = true; ret |= cmd_address_audit(s, gma, sizeof(u64), - index_mode); + index_mode, 2); } } } @@ -1432,10 +1435,13 @@ static unsigned long get_gma_bb_from_cmd(struct parser_exec_state *s, int index) } static inline int cmd_address_audit(struct parser_exec_state *s, - unsigned long guest_gma, int op_size, bool index_mode) + unsigned long guest_gma, int op_size, + bool index_mode, int offset) { struct intel_vgpu *vgpu = s->vgpu; u32 max_surface_size = vgpu->gvt->device_info.max_surface_size; + int gmadr_bytes = vgpu->gvt->device_info.gmadr_bytes_in_cmd; + u64 host_gma; int i; int ret; @@ -1453,6 +1459,14 @@ static inline int cmd_address_audit(struct parser_exec_state *s, } else if (!intel_gvt_ggtt_validate_range(vgpu, guest_gma, op_size)) { ret = -EFAULT; goto err; + } else + intel_gvt_ggtt_gmadr_g2h(vgpu, guest_gma, &host_gma); + + if (offset > 0) { + patch_value(s, cmd_ptr(s, offset), host_gma & GENMASK(31, 2)); + if (gmadr_bytes == 8) + patch_value(s, cmd_ptr(s, offset + 1), + (host_gma >> 32) & GENMASK(15, 0)); } return 0; @@ -1497,7 +1511,7 @@ static int cmd_handler_mi_store_data_imm(struct parser_exec_state *s) gma = (gma_high << 32) | gma_low; core_id = (cmd_val(s, 1) & (1 << 0)) ? 1 : 0; } - ret = cmd_address_audit(s, gma + op_size * core_id, op_size, false); + ret = cmd_address_audit(s, gma + op_size * core_id, op_size, false, 1); return ret; } @@ -1541,7 +1555,7 @@ static int cmd_handler_mi_op_2f(struct parser_exec_state *s) gma_high = cmd_val(s, 2) & GENMASK(15, 0); gma = (gma_high << 32) | gma; } - ret = cmd_address_audit(s, gma, op_size, false); + ret = cmd_address_audit(s, gma, op_size, false, 1); return ret; } @@ -1581,7 +1595,8 @@ static int cmd_handler_mi_flush_dw(struct parser_exec_state *s) /* Store Data Index */ if (cmd_val(s, 0) & (1 << 21)) index_mode = true; - ret = cmd_address_audit(s, gma, sizeof(u64), index_mode); + ret = cmd_address_audit(s, (gma | (1 << 2)), + sizeof(u64), index_mode, 1); } /* Check notify bit */ if ((cmd_val(s, 0) & (1 << 8))) -- 2.17.1