From nobody Fri Sep 25 00:40:07 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013011.outbound.protection.outlook.com [40.107.201.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2679B3B14A1 for ; Fri, 18 Sep 2026 10:00:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725611; cv=fail; b=IBFfMV+jITUr6TJCCWABeLrxFAyd7JluMQu4OOu1k2Fgn/vdPM8OU5HDXJgAT9TXFpcRPX+OVcd2CP/S/QBpgO3G0WjWRPSQdZhpKwbyMzDa7kroNMVAM0rBk4cA4cituSyrPqdbtMQp47OgCY58nrpW+MFmREOIegceKfQwz1M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725611; c=relaxed/simple; bh=jluCXE+Y9rLXUz/X/Xd8ATvDlFCJwmFvNmrA41EyH8M=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=SZGlnjCJTGrDfSPu72f+RjiEnDEubkPJQaluMUGIbO5wdDxwKBevHwoTSq0xwAJJ30+RJe5UzgfZIAtz2yDNgzYr7T1g08xmoc8i2/o1pzhaatBg06AHwcXc9L8JXyuVHeYGd5IIHwMu6RHP0cuMItT2HRzCmnfvCdUJJOqaxFA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=ogj2cZIP; arc=fail smtp.client-ip=40.107.201.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="ogj2cZIP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SIJWRTcx2TadZeJgkxkcdjeTEgMWQBx+6pvKluC+/3edA4CaMVE8aAqSbWnDp9GCMX4BBk4pEgnqwl8z3X5HWW0mNS6KDGBhfRtgAtvdIPjUyy0MYYWLjnyJT25pgAh2y2HU9ZXipmGfLaOHHYs0zbnt5xZb3e6KhR8Svri/ozHlwrYkSoo+M8CcaJm585NbnkaHHfWbD6olkOLgenyT+bpc/Kc/DnT3FSLwSngxW1ZOBQGM3uUPBHAWwXCa0bzcFMDo2zpWToMd/2pam4b+bFGClU7TID4RG3q0idPGDeMRf2Lo3vHgSBpM8slbVSRy2et7L9OGehDaLH6JEPmOUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FPZgi3EZoiK37BEgU8VWTDJ16nfVL1aGE1DlxaQkN8A=; b=d7B8IIIxL/RjuvlA1eLxhPHnfS7haMqDFXnAkoW1rkxImAbgb46S0ZNrXPiK61kfh+g6RaHUbF1/O6fcYvSJreMjLJPv/Tk2IxxfJ1Q4L/tjBq9/BO89Wmc2z0shfzjZ/b7p+5mNIrG5/oLi+L+18PGGJWtQStS0KRP5g1aMFP4C52XLWvfX+GPvXuNXHss2FJbeQnDkl1PsKDgyhM81MGI9mupEHwQIhLZeowSQH6trTVI8OxYFsrSf30CFm5zfFj14R8fGN0iTfTz5wqtMV2RrF4sGRr/ji03f9CI108p6CdW4fcGOxY8ReI9dqkqneV8oDvd0nXD2R0TT3Xv3yQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=collabora.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FPZgi3EZoiK37BEgU8VWTDJ16nfVL1aGE1DlxaQkN8A=; b=ogj2cZIP2dINMu14NNA+QLV8tDF3VVg6inkUQyLpqLUS6YbrqjrtvlWFbB15DC6o74iRAEPHOCXoCmAjJLmfuIF1wU3/mFTXvjsuA6z2q7ffmCg/Jy4wdZ2r455EZr0gUUBgejsFC3ve5YNTChnNoAHU7dI97J5I1LSqE59J/08= Received: from SJ0PR03CA0389.namprd03.prod.outlook.com (2603:10b6:a03:3a1::34) by CH3PR12MB7499.namprd12.prod.outlook.com (2603:10b6:610:142::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Fri, 18 Sep 2026 09:59:58 +0000 Received: from SJ1PEPF000037A5.namprd04.prod.outlook.com (2603:10b6:a03:3a1:cafe::84) by SJ0PR03CA0389.outlook.office365.com (2603:10b6:a03:3a1::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.13 via Frontend Transport; Fri, 18 Sep 2026 09:59:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000037A5.mail.protection.outlook.com (10.167.244.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 09:59:57 +0000 Received: from honglei-remote.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 04:59:53 -0500 From: Honglei Huang To: Dmitry Osipenko , Akihiko Odaki , David Airlie , "Gerd Hoffmann" CC: Gurchetan Singh , Chia-I Wu , Ray Huang , , , , Honglei Huang Subject: [PATCH v8 1/4] drm/virtio-gpu: Add VIRTIO_GPU_CAPSET_ROCM capability Date: Fri, 18 Sep 2026 17:59:37 +0800 Message-ID: <20260918095940.2253018-2-honghuan@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260918095940.2253018-1-honghuan@amd.com> References: <20260918095940.2253018-1-honghuan@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000037A5:EE_|CH3PR12MB7499:EE_ X-MS-Office365-Filtering-Correlation-Id: 9ccb0267-ee2c-4a2b-f664-08df156b9887 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|23010399003|1800799024|376014|56012099006|11063799006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: yp3AFuC0su0ZDvkJjRUKErvCJ1eCd4j8tIRkouR+7BNlTYqJ2R7oB6jK9PuIhk/CjMn4bytQADqleE54dpyk+pnHX4tEt1CjM2vACl0Gb1pMiWHAIkBtwcSz+DG/CREm2fimf8yRAw53VTqqHUjz3D17slQ36Q1HkeurAkcjOGaWwb0OfrOWP1a4ywJdrTT9N+niPH1riYYf5V3SZ0BMsKgcxmuOds1oeoGTCxi6jfi5pxB9YWErknG+TbVtNMduz8iAAVxsx6mRT6RHomlfgSiuq2an/jWTm6uhWyhaJy7n6F9ELwzv2ia8gMhJzYVjTWQpkWDjXQzE3X+OUg9uT5X18zYB6YhzSpoFF1laq3bXhT+llOK+VlJwPHxX3BsoU5NrgvHCci7CzowBApkIIQ+CB0XuD7BVeJrpNL+RASP0dnoTWU6oz+BwW2sfejTHglwvQPdwknCpjc0HLUKMvgRXtlKShyYUQKix8twWR/LEaxJ3RNDy7wsHm1vu+Jn77pi2KF19FJZ0RNmw8pY2/GV7tU+Eb8++QxHXGAPNhLSpEr1ADicGhOgPkUReXWyXLB8WcP6lP0wTx5pGolgjhYrc6lomT5yhn74uLvKsb4VLiv1DW1Xf+s9H/TOLm8V5Q8ZxfQS5V7GJ25oCHr9DouzsWXAESyXn6gfEwD2dExXCATE7GZZroTeN+vIAM2VnwWH6gNm5jSh6mX5FMuXGaQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(23010399003)(1800799024)(376014)(56012099006)(11063799006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: h0pTJcNsJYCCUMFtuMSiWfPKfXPvmUm8ypxmBmWGkUAh96L4t9Zv7BR4bwQvbHb1UgABH7FyLXznVL3L2rlCyC6tLvFFepkOzYCP2eFMt8IafLKRnUOAMAiaw6lHQcu5xsH/Nh8D7e0U3l8h3S2L3ZVhHXOQg4tuOI4ek77EnVm/mq13rHCkrMrdSZrFuhVd1hvOT+GapJG8NqL75H1JUHVHMR3s9EVHQ5vKxXATfpLu0O0UmzCHLu0aFpOnYJC24f8Kf3jZjzE5X+Cu471wrjxWx4NiCuLZFk0aFsUgOiilvdsIaPtuHi2YLbwuiwp7nrRYo/aiNlRnySyx7y+BJB13N5kZmYgvsGUBFYxtZSgXHmg1eQPmQeZp2EEG6F93I0iEgtgRKXPNf7dYcQUOVnebFtO0GN5r2eUQwL7jExKBT+3IYe49kSe6BsS6M4Yx X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 09:59:57.3345 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9ccb0267-ee2c-4a2b-f664-08df156b9887 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000037A5.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB7499 Content-Type: text/plain; charset="utf-8" Add a new GPU capability set VIRTIO_GPU_CAPSET_ROCM to support ROCm compute workloads in virtualized environments. ROCm (Radeon Open Compute) is AMD's open-source software platform for GPU compute and HPC workloads. ID 7 is already used by VIRCL in the virgl/virtio-gpu stack, so ROCm uses ID 8. A matching virtio-gpu specification change is in progress to register this assignment. Signed-off-by: Honglei Huang --- include/uapi/linux/virtio_gpu.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gp= u.h index 4f530d9005..3d4dfadc9d 100644 --- a/include/uapi/linux/virtio_gpu.h +++ b/include/uapi/linux/virtio_gpu.h @@ -321,6 +321,7 @@ struct virtio_gpu_cmd_submit { #define VIRTIO_GPU_CAPSET_VENUS 4 #define VIRTIO_GPU_CAPSET_CROSS_DOMAIN 5 #define VIRTIO_GPU_CAPSET_DRM 6 +#define VIRTIO_GPU_CAPSET_ROCM 8 =20 /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */ struct virtio_gpu_get_capset_info { --=20 2.34.1 From nobody Fri Sep 25 00:40:07 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010029.outbound.protection.outlook.com [52.101.85.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69B933BB127 for ; Fri, 18 Sep 2026 10:00:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725611; cv=fail; b=rFP2a36iUhbmnqOUsF9JhOvdjXqwjDtLglOl2w9U/jgxpSlzBd6WfThBmYYez2gSHrTUT58cKFn/kw197kml8a9b1eERnZnX9ZeWNCnpnIo4eApcqeyK1KVviKQGEWanqek4vulGMP9D9zpDWc5GCCkMzKBEWF5qBgH4THaI5Lg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725611; c=relaxed/simple; bh=m2dJVrN4C+yWnA+bwb3IS+s8iwlfIVF2vRmATIpvxa4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Xx9OT7iKl2Ed4jP2H3So3GQXU8KG59v8xgl3mYwU3bP8x89EGeKS7wK4z/R1qXPfT2qUwzmp/b3clxF0zH1z6CldS+9NbtVClbmw+sHWMzrIWX/niR906vRRek6bmyrh6pLWX8WrDfvXVxCL9xOBc1yG6rstotzk3p04F6n5JvE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=VhOi6Gta; arc=fail smtp.client-ip=52.101.85.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="VhOi6Gta" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AqlT56Fhy/XJWVSFNz1MCvHY4ESL/XKuRdXplhEHoIJt7lE4GqzyMG3vH7rx1fUoK9kHFPZP2nKnPYjy3ZW+ck9RFCaUuHw/P5biQKG0dc79Rpe0JcmM6GhKwgWvSSst1bnO5PY6ud9Br2Qw4fBr9GssUMe2UgttKz/PW5SyXGjsoi6oSpJWqrI6F79OuqqjjeChWKrGaOFs0bowp6TuOPo4WgEJQScHntR2tNSJ+weDTGd+aYgK+z7vOcJ5CecnET6j/CYcM7SsBjp9sX9sqDpQmvmYNSFHnTI3AXgb+kYy2Eesgb5q3GkQ1q5AbnuDXk8CRzORMoiPHzDISE1qbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZEd3Ws1ZJrISbTEwZ1itvhZz4BbQlDtfOlJ4JlqZyxE=; b=RJuSOmrYVhx4x3h0I60vPoxtxLRS2CsuPA3tUiIdEBPGwXUposSz4fbAClYRPu1u5OuwOlZhXHDtgBbHE/rjVS4wXR9TYx4aDSnxvawV4sgbfq+X8yRX3RoZt3fAOpnvEuRX6s4K5HARlF0L4EKb+dmWa1HuVM7OBHPtGm/NmsBy3LXTJnXD/OJB3J1PXMExkqlk9mFqIktyd3Df4+n4/4kwmLVBAG1XgyxUHp4wDWOIDOCDmXr7+4mTTk+QrqtPKT531M6RZs15679zIj3bB5GgbvvkQi90F7mKwp6BjtKZeZv65M3VdDnkJG3jiZRP9i5lQYMCs/PkzbYPSFlX6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=collabora.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZEd3Ws1ZJrISbTEwZ1itvhZz4BbQlDtfOlJ4JlqZyxE=; b=VhOi6GtaJGHh237jy7ve17Tb5Jhxiu3szxSZPSIE/SgzUbuZYKOltE8aauribZ/DPgKOBeyscjLuSXUWfnPrQGIqfTI5wHowOHQStdhfqhCQGnb3Ppar8HQ5L8/uM8kRkWU7+8EJekWKlzJwmpIEZh9Smm6NFW6bnGJD89hACno= Received: from SJ0PR05CA0089.namprd05.prod.outlook.com (2603:10b6:a03:332::34) by IA1PR12MB6282.namprd12.prod.outlook.com (2603:10b6:208:3e6::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Fri, 18 Sep 2026 10:00:00 +0000 Received: from SJ1PEPF000037A1.namprd04.prod.outlook.com (2603:10b6:a03:332:cafe::43) by SJ0PR05CA0089.outlook.office365.com (2603:10b6:a03:332::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Fri, 18 Sep 2026 10:00:00 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000037A1.mail.protection.outlook.com (10.167.244.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 10:00:00 +0000 Received: from honglei-remote.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 04:59:56 -0500 From: Honglei Huang To: Dmitry Osipenko , Akihiko Odaki , David Airlie , "Gerd Hoffmann" CC: Gurchetan Singh , Chia-I Wu , Ray Huang , , , , Honglei Huang Subject: [PATCH v8 2/4] drm/virtgpu api: add blob userptr resource Date: Fri, 18 Sep 2026 17:59:38 +0800 Message-ID: <20260918095940.2253018-3-honghuan@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260918095940.2253018-1-honghuan@amd.com> References: <20260918095940.2253018-1-honghuan@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000037A1:EE_|IA1PR12MB6282:EE_ X-MS-Office365-Filtering-Correlation-Id: 57aa3307-fe97-4b21-9994-08df156b9a43 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|23010399003|82310400026|36860700016|376014|11063799006|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: syRnVjhO2bPglVv6B9s+mlo98ybqJXWQOUCeRrVBwLDtGzAVubhA/Tiyk9ptP5lV0WB2b2cNOETiCp155knbpEEB9mMoeuoy877GAqozsfFW9UV1oDGyGVM1cG6vMdcBGg2exKyQ0MhaaDvDfc+kh5AcIhVviuEjrR8T9lszuYBflP8DBgXmB5NIvD1RdLML0kjf6sNukmUGxooywkNpZ3bT8nIeTwyL4muHepUhg/SCRqf8lKAgo1tJNDog77qsGDkmAaPb7BFEpEnN/ZcZcflLA1w0KAfII0350IixL7g8CvZuFhLrIyS2ynnXEOhpWyc8d+Ko/raYJ4HO+WxzGW+tmjo2NHfoSiokOISLn6YRV+/TNAc6ss9U5RlQ0/V5n4Az+YS0GQHC9F7XtenIDI7+1GQAFZKDTrgPLltBSqHIYo5NI3FHLCIkXAxhWY3sI19HveaxLsjPKedd18Z76/vfgy+5ZXUrVtrz/1BDpDHac8dBB8VEjyFIgG5LEUI9BtVTDxBT0YZAebC3QOeQUHehKyaw+RwC15fF6uqB23AH6Dq1NXqDPwR708kVuItFlyFeznLfXwqNVblP5coValQWoyMxGoSAYC6KC7XK5dGHNgHo84A7cGgBN/TSDh2ff4nH24HZvjDw1vfkYtHIf8YwV4yTwrFIJjwwsbQOm9a1NRRv5JziQjCSm7cHiEZeSvKPvhSO1MunsZg7kbpYMQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(23010399003)(82310400026)(36860700016)(376014)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kjLKxDq9jXgDJd06a9RgRLionevae9HN4nymZn2ZheXWChbuhiTZqZDBp0Rc7XPd2dqZ/yPh4vJRvgV2pPKrLyscM7M0hS/ljfMWY69WoN+Vp0JFkjXiMNtUAqawRnObdm4YdA/qA/HOhPiOTC12C+HqF2NDGE836VKz1iOAHpSyaSynxuNjEaqqRWQVl9cxgRov/5+QVEfhKRr2h4HqcTNQXp3OinNgdwCKevJr/pHqjauiHQo1SH68mq1Q/55LMRSf6QRcG8GsmCvnBXYEW0Cwk2I6tQaOYhBCPI+yRMM1phEmCx23kHS6+DRmk9TcGHFXOsMB1fqodVVZTzqr0DKuMyL1ao/vayf3E9k6os3c8RbSpTBokeD6P1J8oD25Nf2f94MRN+qs9f3IXLDNGdtg4my5ORaTnFyJRtrOPXob1ojFm9MOaJ6zZYfKIxyg X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 10:00:00.2444 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 57aa3307-fe97-4b21-9994-08df156b9a43 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000037A1.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6282 Content-Type: text/plain; charset="utf-8" Add a userptr address field so userspace can request a blob backed by an existing process mapping. A non-zero userptr selects that path; probe VIRTGPU_PARAM_USERPTR before using the field. GPU-readonly backing is requested with the virtio CREATE_BLOB wire flag VIRTIO_GPU_BLOB_FLAG_USE_READONLY (also VIRTGPU_BLOB_FLAG_USE_READONLY). The device MUST NOT write such a resource. The guest pins without FOLL_WRITE only when the device advertised VIRTIO_GPU_F_BLOB_READONLY (VIRTGPU_PARAM_BLOB_READONLY). Signed-off-by: Honglei Huang --- include/uapi/drm/virtgpu_drm.h | 13 +++++++++++++ include/uapi/linux/virtio_gpu.h | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h index 95587e12ae..80f73b3276 100644 --- a/include/uapi/drm/virtgpu_drm.h +++ b/include/uapi/drm/virtgpu_drm.h @@ -99,6 +99,8 @@ struct drm_virtgpu_execbuffer { #define VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs 7 /* Bitmask of supported capab= ility set ids */ #define VIRTGPU_PARAM_EXPLICIT_DEBUG_NAME 8 /* Ability to set debug name f= rom userspace */ #define VIRTGPU_PARAM_BLOB_ALIGNMENT 9 /* Device alignment requirements fo= r blobs */ +#define VIRTGPU_PARAM_USERPTR 10 /* CREATE_BLOB userptr field is supported= */ +#define VIRTGPU_PARAM_BLOB_READONLY 11 /* VIRTGPU_BLOB_FLAG_USE_READONLY i= s honored */ =20 struct drm_virtgpu_getparam { __u64 param; @@ -186,6 +188,10 @@ struct drm_virtgpu_resource_create_blob { #define VIRTGPU_BLOB_FLAG_USE_MAPPABLE 0x0001 #define VIRTGPU_BLOB_FLAG_USE_SHAREABLE 0x0002 #define VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 +/* Wire flag: device MUST NOT write. Guest pins without FOLL_WRITE. + * Rejected unless VIRTGPU_PARAM_BLOB_READONLY is 1. + */ +#define VIRTGPU_BLOB_FLAG_USE_READONLY 0x0008 /* zero is invalid blob_mem */ __u32 blob_mem; __u32 blob_flags; @@ -205,6 +211,13 @@ struct drm_virtgpu_resource_create_blob { #define DRM_VIRTGPU_BLOB_FLAG_HINT_DEFER_MAPPING 0x0001 __u32 blob_hints; __u32 pad2; + + /* + * Guest VA to pin as blob backing. Non-zero selects the userptr + * path and is valid only with VIRTGPU_BLOB_MEM_GUEST. Must be 0 + * otherwise. Probe VIRTGPU_PARAM_USERPTR before using this field. + */ + __u64 userptr; }; =20 #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID 0x0001 diff --git a/include/uapi/linux/virtio_gpu.h b/include/uapi/linux/virtio_gp= u.h index 3d4dfadc9d..33f5332e59 100644 --- a/include/uapi/linux/virtio_gpu.h +++ b/include/uapi/linux/virtio_gpu.h @@ -72,6 +72,10 @@ * must be aligned to that value. */ #define VIRTIO_GPU_F_BLOB_ALIGNMENT 5 +/* + * VIRTIO_GPU_BLOB_FLAG_USE_READONLY + */ +#define VIRTIO_GPU_F_BLOB_READONLY 6 =20 enum virtio_gpu_ctrl_type { VIRTIO_GPU_UNDEFINED =3D 0, @@ -415,6 +419,8 @@ struct virtio_gpu_resource_create_blob { #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001 #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002 #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004 +/* Device MUST NOT write. Driver may pin read-only guest pages. */ +#define VIRTIO_GPU_BLOB_FLAG_USE_READONLY 0x0008 /* zero is invalid blob mem */ __le32 blob_mem; __le32 blob_flags; --=20 2.34.1 From nobody Fri Sep 25 00:40:08 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010041.outbound.protection.outlook.com [52.101.56.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A1E744838E for ; Fri, 18 Sep 2026 10:00:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.41 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725623; cv=fail; b=EsV4giq9jomp7829U1aZzcA8onpDnYaatcIi3CwTh11z9oek+jSg67y96RdsMA/fRnHUGlJ4ZujEby8o0mQovnGpIq20FMvfw1nqZZeVcgtAl1sQU+JwvcKUfDBoa1A9ceM2Xy3QwMTe2zDU3omQxQiG7zkFJYpFbRFWQ/adxUA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725623; c=relaxed/simple; bh=6Xi89yuvrMcVQ5IzCBQZNmNAC4wA0JVRe9NFPpPFoTs=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OXsx7ssHj6CW9+Wdlw3H8ItjaBzvZk8FJ3oQybJG/WykEwXiPBkAWzy9kXYd87rAvGqYFJcK/LSqhmAczTUeUcUJTdpiryP1V+buexMQJgoZqGI3zqdLlQ9IHZsN9zSfjKnUv2r8Oj6FP0M66HxeBT6Mg1XBkj6lAm7LyqJdc1U= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=XDUfxeTb; arc=fail smtp.client-ip=52.101.56.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="XDUfxeTb" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kiw1biidVUMEmzSHtd2jpkSMtT7KVFkhk4g02pwlpHiZFLTqtknOgZOWa4sU5xCEBKKhss5yS45pDJOeVg6+E4S6HYRbAOM4v+wqdEXOgn/RQKIL7lvz30HdwE7XppofM1JBR+LlMa54u4Vvb5aXCCacOU3hlypZLh8jfIiRUVzEYVClmz7PAJ565g5fZZ1r5/wNFGVqpiV4OAaEMniTCEAidSfJIkQCc17bpMmrNbczI9nKVHaTl/l5htDyeoJ/vfqMnyveM3q5DBWxfFmW0zFUQotogkyUHuCKWdTxh7VZqR4/ZodirFXyC1wgaqu6+2yCx4Sed8L+Cu99LbLiwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LvN1AE5Z77dbmuNDT/vjJgGQibFC/Ec4CfAnevGbQuI=; b=B/rES07Fl4gDUSQykt/CjiTfSKPdt18EaDsbhwGm5iYoJn9c4p22UX0FygWRc0BAvL4xo4QuxFtXubJhbg50lwvoM0R4GMViPb8q3ZZPw6bByLcBBWnb48Ak8352u3gjBwEJ5ESQmk4aY/+FgD1Xmchgl2PuGhnU3dDR15XMUONNlNPcmP9rwOp7BOH/pxILME4r+ah48r7tdnPCAr3EuX/GRG9+MWt0dkKlLfzO2szv5FnKj7WMAJ+HRH72vMSMgCEsiEEJGCUYgMhndys27LgIkd3GXVXo3lh48xvvCgFeUwdZDWbk03SgLvklq4IrelodoZpUX29L2mEuXS2B9Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=collabora.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LvN1AE5Z77dbmuNDT/vjJgGQibFC/Ec4CfAnevGbQuI=; b=XDUfxeTbuOP+AwsSHm53DDpwoU481uefxMrKe0YTrr0tCfaY0pdndED/JZ44UH3cCDp5+jMIL/9OCOQHD7BYYH/rVuxf1WvhcnXy3XnUjnsekvW2MCSVmZsm7KWObFhjxcLL66gs/vSv7qRGxh5f05BxKzyF+vKBM+w0NL9VIf0= Received: from SJ0PR05CA0085.namprd05.prod.outlook.com (2603:10b6:a03:332::30) by CH3PR12MB9147.namprd12.prod.outlook.com (2603:10b6:610:19a::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Fri, 18 Sep 2026 10:00:04 +0000 Received: from SJ1PEPF000037A1.namprd04.prod.outlook.com (2603:10b6:a03:332:cafe::52) by SJ0PR05CA0085.outlook.office365.com (2603:10b6:a03:332::30) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.6 via Frontend Transport; Fri, 18 Sep 2026 10:00:04 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000037A1.mail.protection.outlook.com (10.167.244.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 10:00:03 +0000 Received: from honglei-remote.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 04:59:59 -0500 From: Honglei Huang To: Dmitry Osipenko , Akihiko Odaki , David Airlie , "Gerd Hoffmann" CC: Gurchetan Singh , Chia-I Wu , Ray Huang , , , , Honglei Huang Subject: [PATCH v8 3/4] drm/virtio: implement userptr support for zero-copy memory access Date: Fri, 18 Sep 2026 17:59:39 +0800 Message-ID: <20260918095940.2253018-4-honghuan@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260918095940.2253018-1-honghuan@amd.com> References: <20260918095940.2253018-1-honghuan@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000037A1:EE_|CH3PR12MB9147:EE_ X-MS-Office365-Filtering-Correlation-Id: d7a76291-6910-47a8-4d9a-08df156b9c72 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|23010399003|376014|82310400026|1800799024|10067099003|56012099006|5023799004|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: DnjQlys41Wx/JMt7yqnNYYT1O9HA6AGVmj5bpYBq0eBCtqM5sh4yhOLC+H/eE9L0uK03PN659uD+QMYi0oi8MBTOrJmYcgUaul768JojzR0G/tDxrydh5Id++YGeO301SPyM7rORx2FA1vq8+ra5R6qTOC1LHxYRhtE2x7F7FTg4W4GFmPOet8cjIF8DUjKsMeAaiE4uv38jahsSx0j2Y64isGHo3VOrfRRU/vLay1sPTYgjzRVagbud9InqeGuf3Cwkro+e7sqxsl9e3kxY+5KJ2XhAwH01nHkcr5EbQeDZdy6WBtJvYcCx/Y8pxVpnQ+tKRcVhmx2DrQ4UozCEPzomy2yyjFwk2e7TyCOiCj27jZXXtN0Ytvu7TY0VqHdbnwaNllJIxTHGMs8xIqHMT6kAP/jhz0VRPV5yZ1A/YbZvitckp8pQ4yVDtAvEX7d6pMo3j+sfs0EOuXvj5SGTeEykgbPwwutZ+K+8C2HuvBNsufCKgaUSNZj9rVDpThoj6JJ75n1FhtP2feC9O3JfiN0KBze+Jjm3wt9JI6SG9py/OOEgeNMvMUbxhFupGQkrcMgtYTXOxs+EOqz5h9Qfhpy1pPUV8Dwpm+tnL55zNdA2QcScqrhgpCmPv7mHTwk+MX3nZ4eAEuXkvSsdDk9OLVlcmRcYNdryCjz84maTLAI3EPjaREcMxnXLSFvGNuGwsKkyo6UYW0Lie+a7A0Nl2w== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(23010399003)(376014)(82310400026)(1800799024)(10067099003)(56012099006)(5023799004)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GRbTpREDbUx0cFPONQi2RsWc5Fv77tsOdymhgonP0/Zv/uKSjkllHXyA4dSx337n9iyC0XATVzDr4DmHXQBemWCefZ6Xs9/h0n7UrVbfG8JAOK10UjjSLel8bO/L9uL7Ib9jdhwT5sogySZh9EP0y+15cw5Ujd1XJJSjqP5GvN4lVwlPwGl8yKCiJiSjevpf/e5W0p67HH17j8P8tZqetJPyPpdHVOyExW3/J2DCrTavgLnE2BHQbvrX+nXBi5yFyiko8AqdGM92mbiqyEfyei4Rn7q80s8YgcQwRLmbdnB1hffdc6Q1Par1wYSIhT7wRWP0hAuQn64UY757UaA/j53uHQAIZRtLvUHPfBIIE434010gEtEpgpSrg7kWCeA4VoMKKPEiuEGThfeH5HeO/hB1IwYANo3Ct6QIs5lwzL0pYR/hqMlnMLcXXzbyDcE9 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 10:00:03.9232 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d7a76291-6910-47a8-4d9a-08df156b9c72 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000037A1.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB9147 Content-Type: text/plain; charset="utf-8" Add userptr blob objects so the guest kernel can pin an existing userspace mapping and advertise it as CREATE_BLOB backing entries. - New virtio_gpu_object_userptr type for userptr resources - Pin pages with pin_user_pages_fast() and FOLL_LONGTERM - Omit FOLL_WRITE when VIRTGPU_BLOB_FLAG_USE_READONLY is set - Charge FOLL_LONGTERM pins against RLIMIT_MEMLOCK - DMA-map the scatterlist only when virtio_gpu_use_dma_api() is required; use DMA_TO_DEVICE for USE_READONLY blobs - Sync userptr SG for the device on TRANSFER_TO_HOST - Mark writable pages dirty when unpinning - Keep pages pinned until RESOURCE_UNREF is queued; drop them from cleanup_object() on the unref response or on create failure - Clear userptr->pages on pin failure to avoid double-free on cleanup - Reject unaligned or overflowing userptr ranges at create time - Disallow PRIME export of userptr objects - Save CREATE_BLOB params and restore userptr resources after hibernation without using the shmem restore path Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/Makefile | 3 +- drivers/gpu/drm/virtio/virtgpu_drv.h | 43 +++ drivers/gpu/drm/virtio/virtgpu_object.c | 22 ++ drivers/gpu/drm/virtio/virtgpu_userptr.c | 365 +++++++++++++++++++++++ drivers/gpu/drm/virtio/virtgpu_vq.c | 33 +- 5 files changed, 456 insertions(+), 10 deletions(-) create mode 100644 drivers/gpu/drm/virtio/virtgpu_userptr.c diff --git a/drivers/gpu/drm/virtio/Makefile b/drivers/gpu/drm/virtio/Makef= ile index d2e1788a82..fe7332a621 100644 --- a/drivers/gpu/drm/virtio/Makefile +++ b/drivers/gpu/drm/virtio/Makefile @@ -6,6 +6,7 @@ virtio-gpu-y :=3D virtgpu_drv.o virtgpu_kms.o virtgpu_gem.o virtgpu_vram.o= \ virtgpu_display.o virtgpu_vq.o \ virtgpu_fence.o virtgpu_object.o virtgpu_debugfs.o virtgpu_plane.o \ - virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o virtgpu_submit.o + virtgpu_ioctl.o virtgpu_prime.o virtgpu_trace_points.o virtgpu_submit.o \ + virtgpu_userptr.o =20 obj-$(CONFIG_DRM_VIRTIO_GPU) +=3D virtio-gpu.o diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/= virtgpu_drv.h index 9df4c71173..e0941cc187 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.h +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h @@ -105,6 +105,7 @@ struct virtio_gpu_object_params { uint32_t blob_flags; uint64_t blob_id; uint32_t blob_hints; + uint64_t userptr; }; =20 struct virtio_gpu_object { @@ -138,12 +139,42 @@ struct virtio_gpu_object_vram { struct drm_mm_node vram_node; }; =20 +struct virtio_gpu_object_userptr; + +struct virtio_gpu_object_userptr_ops { + int (*get_pages)(struct virtio_gpu_object_userptr *userptr); + void (*put_pages)(struct virtio_gpu_object_userptr *userptr); +}; + +struct virtio_gpu_object_userptr { + struct virtio_gpu_object base; + const struct virtio_gpu_object_userptr_ops *ops; + /* Protects pages and sgt. */ + struct mutex lock; + + uint64_t start; + uint32_t npages; + uint32_t bo_handle; + uint32_t flags; + + struct virtio_gpu_device *vgdev; + struct drm_file *file; + struct page **pages; + struct sg_table *sgt; + bool dma_mapped; + enum dma_data_direction dma_dir; + struct mm_struct *mm; +}; + #define to_virtio_gpu_shmem(virtio_gpu_object) \ container_of((virtio_gpu_object), struct virtio_gpu_object_shmem, base) =20 #define to_virtio_gpu_vram(virtio_gpu_object) \ container_of((virtio_gpu_object), struct virtio_gpu_object_vram, base) =20 +#define to_virtio_gpu_userptr(virtio_gpu_object) \ + container_of((virtio_gpu_object), struct virtio_gpu_object_userptr, base) + struct virtio_gpu_object_array { struct ww_acquire_ctx ticket; struct list_head next; @@ -284,6 +315,7 @@ struct virtio_gpu_device { bool has_host_visible; bool has_context_init; bool has_blob_alignment; + bool has_blob_readonly; bool hibernated; struct virtio_shm_region host_visible_region; struct drm_mm host_visible_mm; @@ -562,4 +594,15 @@ void virtio_gpu_vram_map_deferred(struct virtio_gpu_ob= ject_vram *vram); int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file); =20 +/* virtgpu_userptr.c */ +int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, + struct drm_file *file, + struct virtio_gpu_object_params *params, + struct virtio_gpu_object **bo_ptr); +bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo); +void virtio_gpu_userptr_dma_sync_for_device(struct virtio_gpu_object *bo); +int virtio_gpu_userptr_restore(struct virtio_gpu_device *vgdev, + struct virtio_gpu_object *bo, + struct virtio_gpu_mem_entry **ents, + unsigned int *nents); #endif diff --git a/drivers/gpu/drm/virtio/virtgpu_object.c b/drivers/gpu/drm/virt= io/virtgpu_object.c index 49899485be..ab21494b1c 100644 --- a/drivers/gpu/drm/virtio/virtgpu_object.c +++ b/drivers/gpu/drm/virtio/virtgpu_object.c @@ -91,6 +91,16 @@ void virtio_gpu_cleanup_object(struct virtio_gpu_object = *bo) drm_gem_free_mmap_offset(&vram->base.base.base); drm_gem_object_release(&vram->base.base.base); kfree(vram); + } else if (virtio_gpu_is_userptr(bo)) { + struct virtio_gpu_object_userptr *userptr =3D + to_virtio_gpu_userptr(bo); + + mutex_lock(&userptr->lock); + userptr->ops->put_pages(userptr); + mutex_unlock(&userptr->lock); + mutex_destroy(&userptr->lock); + drm_gem_object_release(&userptr->base.base.base); + kfree(userptr); } else { drm_gem_object_release(&bo->base.base); kfree(bo); @@ -316,6 +326,18 @@ int virtio_gpu_object_restore_all(struct virtio_gpu_de= vice *vgdev) continue; } =20 + if (virtio_gpu_is_userptr(bo)) { + ret =3D virtio_gpu_userptr_restore(vgdev, bo, &ents, + &nents); + if (ret) + break; + + virtio_gpu_cmd_resource_create_blob(vgdev, bo, + &bo->params, + ents, nents); + continue; + } + if (bo->params.blob || bo->attached) { ret =3D virtio_gpu_object_shmem_init(vgdev, bo, &ents, &nents); diff --git a/drivers/gpu/drm/virtio/virtgpu_userptr.c b/drivers/gpu/drm/vir= tio/virtgpu_userptr.c new file mode 100644 index 0000000000..ccfd96844e --- /dev/null +++ b/drivers/gpu/drm/virtio/virtgpu_userptr.c @@ -0,0 +1,365 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#include "virtgpu_drv.h" +#include + +static void virtio_gpu_userptr_free(struct drm_gem_object *obj) +{ + struct virtio_gpu_object *bo =3D gem_to_virtio_gpu_obj(obj); + struct virtio_gpu_device *vgdev =3D obj->dev->dev_private; + + /* + * Keep pages pinned until RESOURCE_UNREF completes. The response + * callback calls virtio_gpu_cleanup_object(), which drops them. + */ + if (bo->created) { + virtio_gpu_remove_from_restore_list(bo); + virtio_gpu_cmd_unref_resource(vgdev, bo, false); + virtio_gpu_notify(vgdev); + return; + } + + virtio_gpu_cleanup_object(bo); +} + +static struct dma_buf * +virtio_gpu_userptr_prime_export(struct drm_gem_object *obj, int flags) +{ + return ERR_PTR(-EINVAL); +} + +static const struct drm_gem_object_funcs virtio_gpu_userptr_funcs =3D { + .open =3D virtio_gpu_gem_object_open, + .close =3D virtio_gpu_gem_object_close, + .free =3D virtio_gpu_userptr_free, + .export =3D virtio_gpu_userptr_prime_export, +}; + +bool virtio_gpu_is_userptr(struct virtio_gpu_object *bo) +{ + return bo->base.base.funcs =3D=3D &virtio_gpu_userptr_funcs; +} + +void virtio_gpu_userptr_dma_sync_for_device(struct virtio_gpu_object *bo) +{ + struct virtio_gpu_object_userptr *userptr =3D to_virtio_gpu_userptr(bo); + struct device *dev; + + if (!userptr->dma_mapped) + return; + + dev =3D drm_dev_dma_dev(userptr->base.base.base.dev); + dma_sync_sgtable_for_device(dev, userptr->sgt, DMA_TO_DEVICE); +} + +static int +virtio_gpu_userptr_get_pages(struct virtio_gpu_object_userptr *userptr) +{ + unsigned int flag =3D FOLL_LONGTERM; + unsigned int num_pages, pinned =3D 0; + int ret =3D 0; + + if (userptr->pages) + return 0; + + userptr->pages =3D kvmalloc_array(userptr->npages, sizeof(struct page *), + GFP_KERNEL); + if (!userptr->pages) + return -ENOMEM; + + if (!(userptr->flags & VIRTGPU_BLOB_FLAG_USE_READONLY)) + flag |=3D FOLL_WRITE; + + do { + num_pages =3D userptr->npages - pinned; + + ret =3D pin_user_pages_fast(userptr->start + pinned * PAGE_SIZE, + num_pages, flag, + userptr->pages + pinned); + + if (ret < 0) { + if (pinned) + unpin_user_pages(userptr->pages, pinned); + kvfree(userptr->pages); + userptr->pages =3D NULL; + return ret; + } + + pinned +=3D ret; + + } while (pinned < userptr->npages); + + return 0; +} + +static void +virtio_gpu_userptr_unaccount(struct virtio_gpu_object_userptr *userptr) +{ + if (!userptr->mm) + return; + + atomic64_sub(userptr->npages, &userptr->mm->pinned_vm); + mmdrop(userptr->mm); + userptr->mm =3D NULL; +} + +static void +virtio_gpu_userptr_put_pages(struct virtio_gpu_object_userptr *userptr) +{ + struct drm_device *dev =3D userptr->base.base.base.dev; + + if (userptr->sgt) { + if (userptr->dma_mapped) + dma_unmap_sgtable(drm_dev_dma_dev(dev), userptr->sgt, + userptr->dma_dir, 0); + userptr->dma_mapped =3D false; + sg_free_table(userptr->sgt); + kfree(userptr->sgt); + userptr->sgt =3D NULL; + } + + if (userptr->pages) { + bool dirty =3D !(userptr->flags & VIRTGPU_BLOB_FLAG_USE_READONLY); + + unpin_user_pages_dirty_lock(userptr->pages, userptr->npages, + dirty); + kvfree(userptr->pages); + userptr->pages =3D NULL; + } + + virtio_gpu_userptr_unaccount(userptr); +} + +static int +virtio_gpu_userptr_get_entries(struct virtio_gpu_device *vgdev, + struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_mem_entry **ents, + unsigned int *nents) +{ + bool use_dma_api =3D virtio_gpu_use_dma_api(vgdev->vdev); + struct scatterlist *sg; + unsigned int count; + int si; + + count =3D use_dma_api ? userptr->sgt->nents : userptr->sgt->orig_nents; + if (!count) + return -EINVAL; + + *ents =3D kvmalloc_array(count, sizeof(**ents), GFP_KERNEL); + if (!*ents) + return -ENOMEM; + + if (use_dma_api) { + for_each_sgtable_dma_sg(userptr->sgt, sg, si) { + (*ents)[si].addr =3D cpu_to_le64(sg_dma_address(sg)); + (*ents)[si].length =3D cpu_to_le32(sg_dma_len(sg)); + (*ents)[si].padding =3D 0; + } + } else { + for_each_sgtable_sg(userptr->sgt, sg, si) { + (*ents)[si].addr =3D cpu_to_le64(sg_phys(sg)); + (*ents)[si].length =3D cpu_to_le32(sg->length); + (*ents)[si].padding =3D 0; + } + } + + *nents =3D count; + return 0; +} + +int virtio_gpu_userptr_restore(struct virtio_gpu_device *vgdev, + struct virtio_gpu_object *bo, + struct virtio_gpu_mem_entry **ents, + unsigned int *nents) +{ + struct virtio_gpu_object_userptr *userptr =3D to_virtio_gpu_userptr(bo); + int ret; + + mutex_lock(&userptr->lock); + if (!userptr->sgt || !userptr->pages) { + mutex_unlock(&userptr->lock); + return -EINVAL; + } + + if (userptr->dma_mapped) { + struct device *dev =3D drm_dev_dma_dev(vgdev->ddev); + + dma_unmap_sgtable(dev, userptr->sgt, userptr->dma_dir, 0); + userptr->dma_mapped =3D false; + ret =3D dma_map_sgtable(dev, userptr->sgt, userptr->dma_dir, 0); + if (ret) { + mutex_unlock(&userptr->lock); + return ret; + } + userptr->dma_mapped =3D true; + } + + ret =3D virtio_gpu_userptr_get_entries(vgdev, userptr, ents, nents); + mutex_unlock(&userptr->lock); + return ret; +} + +static int +virtio_gpu_userptr_init(struct drm_device *dev, struct drm_file *file, + struct virtio_gpu_object_userptr *userptr, + struct virtio_gpu_object_params *params, + const struct virtio_gpu_object_userptr_ops *ops) +{ + struct drm_gem_object *obj; + int ret; + + userptr->start =3D params->userptr; + userptr->npages =3D params->size >> PAGE_SHIFT; + userptr->flags =3D params->blob_flags; + + mutex_init(&userptr->lock); + userptr->vgdev =3D dev->dev_private; + userptr->file =3D file; + userptr->ops =3D ops; + + /* + * Allocate the resource id before GEM init so a failure here can + * unwind with a plain kfree and does not need a special id=3D0 guard + * in the shared resource_id_put helper. + */ + ret =3D virtio_gpu_resource_id_get(userptr->vgdev, + &userptr->base.hw_res_handle); + if (ret) { + mutex_destroy(&userptr->lock); + return ret; + } + + obj =3D &userptr->base.base.base; + obj->funcs =3D &virtio_gpu_userptr_funcs; + + drm_gem_private_object_init(dev, obj, params->size); + INIT_LIST_HEAD(&userptr->base.restore_node); + + return 0; +} + +static const struct virtio_gpu_object_userptr_ops virtio_gpu_userptr_ops = =3D { + .get_pages =3D virtio_gpu_userptr_get_pages, + .put_pages =3D virtio_gpu_userptr_put_pages, +}; + +int virtio_gpu_userptr_create(struct virtio_gpu_device *vgdev, + struct drm_file *file, + struct virtio_gpu_object_params *params, + struct virtio_gpu_object **bo_ptr) +{ + struct virtio_gpu_object_userptr *userptr; + struct virtio_gpu_mem_entry *ents =3D NULL; + struct sg_table *sgt; + struct mm_struct *mm; + unsigned long lock_limit; + unsigned long start; + unsigned long end; + s64 new_pinned; + unsigned int nents; + int ret; + + *bo_ptr =3D NULL; + + if (!params->size || !IS_ALIGNED(params->size, PAGE_SIZE) || + params->userptr !=3D (unsigned long)params->userptr) + return -EINVAL; + + start =3D params->userptr; + if (!IS_ALIGNED(start, PAGE_SIZE) || + check_add_overflow(start, (unsigned long)params->size, &end)) + return -EINVAL; + + if (!can_do_mlock()) + return -EPERM; + + if (params->size >> PAGE_SHIFT > INT_MAX) + return -E2BIG; + + if (!access_ok((void __user *)start, params->size)) + return -EFAULT; + + userptr =3D kzalloc_obj(*userptr); + if (!userptr) + return -ENOMEM; + + ret =3D virtio_gpu_userptr_init(vgdev->ddev, file, userptr, params, + &virtio_gpu_userptr_ops); + if (ret) { + kfree(userptr); + return ret; + } + + mm =3D current->mm; + mmgrab(mm); + lock_limit =3D rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; + new_pinned =3D atomic64_add_return(userptr->npages, &mm->pinned_vm); + if (new_pinned < 0 || + (new_pinned > lock_limit && !capable(CAP_IPC_LOCK))) { + atomic64_sub(userptr->npages, &mm->pinned_vm); + mmdrop(mm); + ret =3D new_pinned < 0 ? -EOVERFLOW : -ENOMEM; + goto err_cleanup; + } + userptr->mm =3D mm; + + mutex_lock(&userptr->lock); + ret =3D userptr->ops->get_pages(userptr); + mutex_unlock(&userptr->lock); + if (ret) + goto err_cleanup; + + sgt =3D drm_prime_pages_to_sg(vgdev->ddev, userptr->pages, + userptr->npages); + if (IS_ERR(sgt)) { + ret =3D PTR_ERR(sgt); + goto err_cleanup; + } + + userptr->sgt =3D sgt; + + /* + * Match shmem blobs: only DMA-map when the virtio DMA API is in + * use. Mapping unconditionally can create SWIOTLB bounce buffers + * that get copied back over guest pages on unmap even though the + * host was given sg_phys() addresses. + */ + if (virtio_gpu_use_dma_api(vgdev->vdev)) { + enum dma_data_direction dir =3D + (userptr->flags & VIRTGPU_BLOB_FLAG_USE_READONLY) ? + DMA_TO_DEVICE : DMA_BIDIRECTIONAL; + + ret =3D dma_map_sgtable(drm_dev_dma_dev(vgdev->ddev), sgt, + dir, 0); + if (ret) + goto err_cleanup; + + userptr->dma_dir =3D dir; + userptr->dma_mapped =3D true; + } + + ret =3D virtio_gpu_userptr_get_entries(vgdev, userptr, &ents, &nents); + if (ret) + goto err_cleanup; + + virtio_gpu_cmd_resource_create_blob(vgdev, &userptr->base, params, ents, + nents); + + userptr->base.params =3D *params; + virtio_gpu_add_object_to_restore_list(vgdev, &userptr->base); + + *bo_ptr =3D &userptr->base; + return 0; + +err_cleanup: + virtio_gpu_cleanup_object(&userptr->base); + return ret; +} diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/v= irtgpu_vq.c index c02c03c10d..dcbd7bb7a6 100644 --- a/drivers/gpu/drm/virtio/virtgpu_vq.c +++ b/drivers/gpu/drm/virtio/virtgpu_vq.c @@ -781,9 +781,14 @@ int virtio_gpu_panic_cmd_transfer_to_host_2d(struct vi= rtio_gpu_device *vgdev, struct virtio_gpu_vbuffer *vbuf; bool use_dma_api =3D virtio_gpu_use_dma_api(vgdev->vdev); =20 - if (virtio_gpu_is_shmem(bo) && use_dma_api) - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - bo->base.sgt, DMA_TO_DEVICE); + if (use_dma_api) { + if (virtio_gpu_is_shmem(bo)) + dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, + bo->base.sgt, + DMA_TO_DEVICE); + else if (virtio_gpu_is_userptr(bo)) + virtio_gpu_userptr_dma_sync_for_device(bo); + } =20 cmd_p =3D virtio_gpu_panic_alloc_cmd_resp(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); @@ -812,9 +817,14 @@ void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_= gpu_device *vgdev, struct virtio_gpu_vbuffer *vbuf; bool use_dma_api =3D virtio_gpu_use_dma_api(vgdev->vdev); =20 - if (virtio_gpu_is_shmem(bo) && use_dma_api) - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - bo->base.sgt, DMA_TO_DEVICE); + if (use_dma_api) { + if (virtio_gpu_is_shmem(bo)) + dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, + bo->base.sgt, + DMA_TO_DEVICE); + else if (virtio_gpu_is_userptr(bo)) + virtio_gpu_userptr_dma_sync_for_device(bo); + } =20 cmd_p =3D virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); @@ -1245,9 +1255,14 @@ void virtio_gpu_cmd_transfer_to_host_3d(struct virti= o_gpu_device *vgdev, struct virtio_gpu_vbuffer *vbuf; bool use_dma_api =3D virtio_gpu_use_dma_api(vgdev->vdev); =20 - if (virtio_gpu_is_shmem(bo) && use_dma_api) - dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, - bo->base.sgt, DMA_TO_DEVICE); + if (use_dma_api) { + if (virtio_gpu_is_shmem(bo)) + dma_sync_sgtable_for_device(vgdev->vdev->dev.parent, + bo->base.sgt, + DMA_TO_DEVICE); + else if (virtio_gpu_is_userptr(bo)) + virtio_gpu_userptr_dma_sync_for_device(bo); + } =20 cmd_p =3D virtio_gpu_alloc_cmd(vgdev, &vbuf, sizeof(*cmd_p)); memset(cmd_p, 0, sizeof(*cmd_p)); --=20 2.34.1 From nobody Fri Sep 25 00:40:08 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012039.outbound.protection.outlook.com [52.101.43.39]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F797440641 for ; Fri, 18 Sep 2026 10:00:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725620; cv=fail; b=rdIHOyFt2nWHjvYYBh+rDdEphJfOW5MG/qUPEn7nbGpdytZqvAaiDx0TFXBJCf8Cet/dudRCXgbqWmCWnOmEI+9VgOCcH31WB9Db5i4uKkeX/refAJwxNTdbSn/M7l4E+aAW5Det9rZuGees9DyO3FFF8h1SSCU/OKoPmz3JN1w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789725620; c=relaxed/simple; bh=mFVCiM5xeBJCksOk+LA8iN+Z+yh+iQtif75mc3oYgLc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Bmhv2ytGZ0iLUMjHSaIsvApJ3xNJjvA4G+I5ya5a26OlFnHe5YBuzv4XGh9TrArBvZnw+7I/duBzIlY3P+i17wXAc1Nt26mrhavi0ON5h/SFheaZBuYbfRMz8pwSxBBZsT6pPLO1JxgqHSWXAhAo+FHbLICau1PsaPgBJ9/CyLU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=uHWPfefR; arc=fail smtp.client-ip=52.101.43.39 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="uHWPfefR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IwqaxfiNsEBsT3J7cDesVnH8LBW1MeaXC7SpPBOUipweRjCdwaDQjtxUelL+Z+M20qKs0BHQQrOCRBbAn+3ri40eIXoSIWh3LwRJ20XMgaI/TjuEQh4oSuJKmnZ5xLaO7LgMHxwz6j7A8kMU800u+muLEGAXhBLBplOK/CGzX8LAOumQTB7MEUsW1nuRrEhUpd9Ld4jF36IGg/VIdPVPdkW2pzDUW3ZeKfKHo977GXqWWauEy9mf+S1KWLGDonzrGIYsJviEQqzidBUUqB/YhMv4vy0e0DoYqz9fp1pJPU7TxoZUz78lxNQkqxM6H9Yl5xkAIW2AIfBlcYrplQt9iQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Xh7t9lCZvEKIt8fCKxkY0noneQl/NapxT7EK65Iw9pM=; b=RjRSe7UOQhCr5RBReuxcHnoc5jQzFIoGeqLIMOnU9+UJ5tgtxvn3pkXsqQ6cxArFWO8/XJ9SzfNvxBC/lyHYn/e0LyuQZxNFUGAMKCYsA4TEd2MuXLYx3xOsg2sN9Da+okV35ZHWTua+ZAtoc5UFJvRxiq2LvfYvGMSCjIvKcIrb9U+OqZ/b7ogfQiFWtuqaW6LWRLcak2FOz8hCyA5oNUvqrLZN277uBxRcyO68U7YyMFUeifmYeMclAgaZ+0rxVFLRgEYOi7lyPM3NbG2fjoeO1+F269b7lXgEULE5qb8Uayy3uuRTgWOP4lNytN3in85eluAZGvH8Q50VEoKCSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=collabora.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Xh7t9lCZvEKIt8fCKxkY0noneQl/NapxT7EK65Iw9pM=; b=uHWPfefR0RVB0h6moNfwb8I3ab++pHb1f5XKK5F0FZ8WjeNsU2CcLh9r5Gd6wFgEKzi3iwdo7FehhP2OkGVx/MVsehRgI7JqzxqZGl1aOr9snz7e5zIsvJpV0Q3EhHRbAlsMSwdgJhKRNdUbqzIH138S5fKastuCr2apB7GYw6c= Received: from SJ0PR03CA0086.namprd03.prod.outlook.com (2603:10b6:a03:331::31) by BL1PR12MB5873.namprd12.prod.outlook.com (2603:10b6:208:395::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Fri, 18 Sep 2026 10:00:10 +0000 Received: from SJ1PEPF000037A7.namprd04.prod.outlook.com (2603:10b6:a03:331:cafe::64) by SJ0PR03CA0086.outlook.office365.com (2603:10b6:a03:331::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.11 via Frontend Transport; Fri, 18 Sep 2026 10:00:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SJ1PEPF000037A7.mail.protection.outlook.com (10.167.244.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.451.8 via Frontend Transport; Fri, 18 Sep 2026 10:00:09 +0000 Received: from honglei-remote.amd.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 05:00:02 -0500 From: Honglei Huang To: Dmitry Osipenko , Akihiko Odaki , David Airlie , "Gerd Hoffmann" CC: Gurchetan Singh , Chia-I Wu , Ray Huang , , , , Honglei Huang Subject: [PATCH v8 4/4] drm/virtio: wire blob ioctl creation to userptr objects Date: Fri, 18 Sep 2026 17:59:40 +0800 Message-ID: <20260918095940.2253018-5-honghuan@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260918095940.2253018-1-honghuan@amd.com> References: <20260918095940.2253018-1-honghuan@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF000037A7:EE_|BL1PR12MB5873:EE_ X-MS-Office365-Filtering-Correlation-Id: 0238a22f-1201-4cf7-b0f0-08df156b9fe7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|23010399003|1800799024|82310400026|56012099006|11063799006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: UIVRXaLKGOd25cFP7JThWNq/rfgJAwdSf2UGIMULSDdi2OymYmW7uepeUGRDWFL+sTypxQbxZOsbVQCy/N6xY32I1SKngU/8zdCE1WIvum23sgkViHrFjEwHq7dmOeD9XFmMavnvJhKTFml20Y2lOYVSVAmqLmTD4XbNnjgEOWAybn6q0+ydGnd+rDWxm8nh95QBSYfJG2DeO4Hc1Nr6aer4NLHDxCpTMH7aCd8EZfLyKXTAfMGRFm85lKrmrO4NaIB/00MbasacN+ia0Sr99g+tBXY1ud+qJkemCGb/Ua+1uRKqiITiuYTcoINxM9Pa7ls9wP8T2Y7LMdutG/RUk2kZQVHpJd+gA8MFIYGNX1fdjEU6tJZOD8xWsFTKK8B2ITZ7gio42yPLI8Vm1Hxd7/qPmoFBnBy0aQ6NsT+TJG7eN+e5BSqEoQOuDtRlkPFsUWp2kKhlTC3pl3BB9JNlRog0sPAmPTftkZNNn0ZITXsI5y1fi0NmP2hgyp5FIUu//Xg+MoQgqZn266k8lJleHaaOVTPWZe2X5c3sE7SNHCo2N3Mxww9pIHT74N5/S4OaxXIt7jI1XE0FG9vi5/01/lO96/uB2TI7mD1E2u5daOhCqWpyyCs1RTjQhCXyyyH+J5iPXkHo4T4teTJ1FQXYoU7ZmEqPdaTzRKYP+BNuV1AMggDUmx/0KaqioxnXo0dVyVazIraKddinpt399+DNOA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(376014)(23010399003)(1800799024)(82310400026)(56012099006)(11063799006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: +OOnFywmHuJcuC6N7kAPZNmbLTtduEqgijDC+O4rrTJRCM/1TH7MhnNtTzB2SIcI/NbHGPcLQ7s7lHtpzQS3F4PP79kFCGi/5Sy1dmgkNmESOn+gaZ9eW+qGbsmjnYlhdtayyyFSKNRz6m7l60pwXbEOcNdxD9xjFofuvHecGb+kMohyQyq17683Rc9Itd7Ks9588ujdQhTxWJA+QuyQs8LLvcfXqMlu7GY/808bkS9fHxKTGfgcGXFTf0TuJMgDU4tfAcWwzDglqtEbnwr9OY6iBJ9/1hKtv9rVRW1M3HTv5Ba15V4a4Mpx0PI0aDtbK9eGeJJXrPg3rrxtwJPAmv35Q3GgfsmzB6bXYGigfUuVC13NXyCLDaFWk34gY1ZPokIVz7rtIxuaUa5l/1jfAlGEBMfyKxh/CUYnNZ3gh+JNFyMePAUI7OiOb8FjHKih X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 10:00:09.5713 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0238a22f-1201-4cf7-b0f0-08df156b9fe7 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF000037A7.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5873 Content-Type: text/plain; charset="utf-8" Integrate userptr into the blob resource creation ioctl. - A non-zero userptr selects virtio_gpu_userptr_create() - Reject userptr unless blob_mem is VIRTGPU_BLOB_MEM_GUEST - Reject VIRTGPU_BLOB_FLAG_USE_READONLY unless the device advertised VIRTIO_GPU_F_BLOB_READONLY - Advertise VIRTGPU_PARAM_USERPTR and VIRTGPU_PARAM_BLOB_READONLY Signed-off-by: Honglei Huang --- drivers/gpu/drm/virtio/virtgpu_debugfs.c | 1 + drivers/gpu/drm/virtio/virtgpu_ioctl.c | 35 ++++++++++++++++++++---- drivers/gpu/drm/virtio/virtgpu_kms.c | 8 ++++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_debugfs.c b/drivers/gpu/drm/vir= tio/virtgpu_debugfs.c index 3a68a16b58..b8b9b40584 100644 --- a/drivers/gpu/drm/virtio/virtgpu_debugfs.c +++ b/drivers/gpu/drm/virtio/virtgpu_debugfs.c @@ -55,6 +55,7 @@ static int virtio_gpu_features(struct seq_file *m, void *= data) vgdev->has_resource_assign_uuid); =20 virtio_gpu_add_bool(m, "blob resources", vgdev->has_resource_blob); + virtio_gpu_add_bool(m, "blob readonly", vgdev->has_blob_readonly); virtio_gpu_add_bool(m, "context init", vgdev->has_context_init); virtio_gpu_add_int(m, "cap sets", vgdev->num_capsets); virtio_gpu_add_int(m, "scanouts", vgdev->num_scanouts); diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virti= o/virtgpu_ioctl.c index 3d8e4ccdb7..3dc058e50e 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -36,7 +36,10 @@ =20 #define VIRTGPU_BLOB_FLAG_USE_MASK (VIRTGPU_BLOB_FLAG_USE_MAPPABLE | \ VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \ - VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) + VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE | \ + VIRTGPU_BLOB_FLAG_USE_READONLY) + +#define VIRTGPU_BLOB_HINT_MASK DRM_VIRTGPU_BLOB_FLAG_HINT_DEFER_MAPPING =20 /* Must be called with &virtio_gpu_fpriv.struct_mutex held. */ static void virtio_gpu_create_context_locked(struct virtio_gpu_device *vgd= ev, @@ -122,6 +125,12 @@ static int virtio_gpu_getparam_ioctl(struct drm_device= *dev, void *data, return -ENOENT; value =3D vgdev->blob_alignment; break; + case VIRTGPU_PARAM_USERPTR: + value =3D 1; + break; + case VIRTGPU_PARAM_BLOB_READONLY: + value =3D vgdev->has_blob_readonly ? 1 : 0; + break; default: return -EINVAL; } @@ -453,11 +462,23 @@ static int verify_blob(struct virtio_gpu_device *vgde= v, if (rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) return -EINVAL; =20 + if (rc_blob->blob_hints & ~VIRTGPU_BLOB_HINT_MASK) + return -EINVAL; + if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) { if (!vgdev->has_resource_assign_uuid) return -EINVAL; } =20 + if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_READONLY) { + if (!vgdev->has_blob_readonly) + return -EINVAL; + } + + if (rc_blob->userptr && + rc_blob->blob_mem !=3D VIRTGPU_BLOB_MEM_GUEST) + return -EINVAL; + switch (rc_blob->blob_mem) { case VIRTGPU_BLOB_MEM_GUEST: *guest_blob =3D true; @@ -495,6 +516,7 @@ static int verify_blob(struct virtio_gpu_device *vgdev, params->blob =3D true; params->blob_flags =3D rc_blob->blob_flags; params->blob_hints =3D rc_blob->blob_hints; + params->userptr =3D rc_blob->userptr; =20 if (vgdev->has_blob_alignment && !IS_ALIGNED(params->size, vgdev->blob_alignment)) @@ -518,9 +540,10 @@ static int virtio_gpu_resource_create_blob_ioctl(struc= t drm_device *dev, struct virtio_gpu_fpriv *vfpriv =3D file->driver_priv; struct drm_virtgpu_resource_create_blob *rc_blob =3D data; =20 - if (verify_blob(vgdev, vfpriv, ¶ms, rc_blob, - &guest_blob, &host3d_blob)) - return -EINVAL; + ret =3D verify_blob(vgdev, vfpriv, ¶ms, rc_blob, + &guest_blob, &host3d_blob); + if (ret) + return ret; =20 if (vgdev->has_virgl_3d) virtio_gpu_create_context(dev, file); @@ -538,7 +561,9 @@ static int virtio_gpu_resource_create_blob_ioctl(struct= drm_device *dev, vfpriv->ctx_id, NULL, NULL); } =20 - if (guest_blob) + if (guest_blob && params.userptr) + ret =3D virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo); + else if (guest_blob) ret =3D virtio_gpu_object_create(vgdev, ¶ms, &bo, NULL); else if (!guest_blob && host3d_blob) ret =3D virtio_gpu_vram_create(vgdev, ¶ms, &bo); diff --git a/drivers/gpu/drm/virtio/virtgpu_kms.c b/drivers/gpu/drm/virtio/= virtgpu_kms.c index 1d4d3bf46a..06c2bded49 100644 --- a/drivers/gpu/drm/virtio/virtgpu_kms.c +++ b/drivers/gpu/drm/virtio/virtgpu_kms.c @@ -249,15 +249,19 @@ int virtio_gpu_init(struct virtio_device *vdev, struc= t drm_device *dev) vgdev->blob_alignment =3D blob_alignment; } =20 + if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_BLOB_READONLY)) + vgdev->has_blob_readonly =3D true; + DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible", vgdev->has_virgl_3d ? '+' : '-', vgdev->has_edid ? '+' : '-', vgdev->has_resource_blob ? '+' : '-', vgdev->has_host_visible ? '+' : '-'); =20 - DRM_INFO("features: %ccontext_init %cblob_alignment\n", + DRM_INFO("features: %ccontext_init %cblob_alignment %cblob_readonly\n", vgdev->has_context_init ? '+' : '-', - vgdev->has_blob_alignment ? '+' : '-'); + vgdev->has_blob_alignment ? '+' : '-', + vgdev->has_blob_readonly ? '+' : '-'); =20 ret =3D virtio_gpu_find_vqs(vgdev); if (ret) { --=20 2.34.1