From nobody Mon Feb 9 10:26:02 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011023.outbound.protection.outlook.com [40.107.208.23]) (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 19F69359F83 for ; Thu, 13 Nov 2025 16:09:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763050147; cv=fail; b=CbsS2h+vv1ZHCJrIbRNiu8D9B4dtIX/F2558Af1hm+E9c0pC8JSe4x5rxquVwOhCuicl+LQ4TMArwdGO+sOqGwXRBTEqMvIY166XMtaVsPTczg46Ko7qTbebijWsLxhmzosc1YfZnwxR5fYXkodgXoMIb0/JO9L4TzjKoPrKB9w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763050147; c=relaxed/simple; bh=Kdw/bN828aO0lR8ols40yq9KDSQkDPx6WiY78IQlC3Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CcekgrQiRKkZIXBnO1qs3ahl1uyxJEVzGu4tZbwvBqeCDh9B3dO9udvt5GT2wKCKTne4YrTwhrsro9SN7ABbtWcPT0dFoNtjwKP+Tr66WolMPw0jtVwvvV6E/+iLycPLp4Vkem35diNtcMkb1S/jqwZ1jPju5LkkrBjyCW8/xH0= 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=aOZYjczY; arc=fail smtp.client-ip=40.107.208.23 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="aOZYjczY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=REska99V12yWANAW2sS22ALuBtaa2Fx3BgmXBGiAGCTXFVqXnkvqMOhCdRqzmtla2VgpZYPloDdRcdsL6x28ApGPA9LNF97wgVmt1PSHFD5+HGNcZ2Da8PRmkm63LToEUMj8iIvzib1LBZ2uFwQyr/itgJdXFpbEjcFmt1XSMSe2UwkWct1ZhCoG/InMowf9A8KsSVy0YJ/Ts4uaSrOs6HHeBBqxeJNHcyiiafU6CdzWz3Myt87Aj9MIGZmw7PmSp9UkBLTW1wWbQEo3ThnTxU1Oj7gVqtjBbOz6qVlLzjujASyciCD8s/4C9DeocQXKkgEr0kpoFvJrNbyF1iV67Q== 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=78ZkSTiA49OEqnuHu5gVkr7/CfpOTZLtY5ddvNJY+HQ=; b=VVUN0+Gq0kK+dYPrwVRM5SAv7Z5lx0BHfdLrmmm6N/x6pMUUvgzkd3UQO40mF17YjAouhN8bJG4aKP71CKD83WOy1myaDzk/fHXf5UD15RugtTbe9Uk2/fzyPlK7tRgYQzFvCnrAAPA3g6C6mnuB65TVDliE8drmscN4X9Pi1UVnHqc/yQGV1z5njqKwV2vdpZfqp5yk3E1ssR6nKXfGXluhvQ1UNoZl6qSzR9GjUf7ojtJRwsVYp7HIXIirWE0oI0eQw6TBQ5NOvxxpvwKiv4zesxXqi639eZuEyrMyQF+MOL6yksi0zpGUfM1qsn0OFxqKJznT5ov4vx6S1GW0sQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=gmail.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=78ZkSTiA49OEqnuHu5gVkr7/CfpOTZLtY5ddvNJY+HQ=; b=aOZYjczYlJdQUKf/bzUeJlr0xPHw1tzOyLkuJ57Ay0VHuqiA7xmqtCkBIUmSMaFBWi+ex/ooaxhiypZtkJHgNkEdXIt3qPogu6ZKxvE/wNn74JUZo7SWp17p4xmYIaQYwxXalGnsWdpWPCQVW80UEFXM3rWhNU/tClPALwfdZOs= Received: from CH0PR03CA0396.namprd03.prod.outlook.com (2603:10b6:610:11b::16) by CH3PR12MB7524.namprd12.prod.outlook.com (2603:10b6:610:146::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.17; Thu, 13 Nov 2025 16:09:03 +0000 Received: from CH1PEPF0000A34B.namprd04.prod.outlook.com (2603:10b6:610:11b:cafe::c0) by CH0PR03CA0396.outlook.office365.com (2603:10b6:610:11b::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9320.17 via Frontend Transport; Thu, 13 Nov 2025 16:09: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 CH1PEPF0000A34B.mail.protection.outlook.com (10.167.244.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.13 via Frontend Transport; Thu, 13 Nov 2025 16:09:00 +0000 Received: from FRAPPELLOUX01-WSLPUB.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.17; Thu, 13 Nov 2025 08:08:58 -0800 From: Pierre-Eric Pelloux-Prayer To: Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , David Airlie , Simona Vetter , Felix Kuehling CC: Pierre-Eric Pelloux-Prayer , , , Subject: [PATCH v2 06/20] drm/amdgpu: statically assign gart windows to ttm entities Date: Thu, 13 Nov 2025 17:05:47 +0100 Message-ID: <20251113160632.5889-7-pierre-eric.pelloux-prayer@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251113160632.5889-1-pierre-eric.pelloux-prayer@amd.com> References: <20251113160632.5889-1-pierre-eric.pelloux-prayer@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: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A34B:EE_|CH3PR12MB7524:EE_ X-MS-Office365-Filtering-Correlation-Id: 91069092-8051-41d5-9a9e-08de22cef571 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700013|82310400026|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ldNfTL3w9Y0ryxVl+M/GvXzsuHNHx5objROg1WYNBxhOeVCzkbcm9Qa0GyBA?= =?us-ascii?Q?sNz0Frn+OuUSZExTnhM4Fnv/K0zG/7ZKtRmBt9vVSpx76F0DhEhh0KGNPaVy?= =?us-ascii?Q?f8C3HAY33bRIIWbsIPrjtY/PfQaxp/tb9zG3EZg+MX7/xAjaBtqGg4Mwr9pm?= =?us-ascii?Q?7jvPxcad/b5P2LZlKFZV4wEWQzAotMu+yBg21lRB6hulGfzxYWUcG71rRm9Q?= =?us-ascii?Q?Npaum+pU8ho/24sEH5+LJ1PzaXP+U/gqwE33NxxCLn3yWkWkKLW+joLG41Sd?= =?us-ascii?Q?bEQZAyuiEF4wDnF7LPeoL8gcL1yz4mucQu5gitlOA3bsftQuLC+rhzRTJ6Pi?= =?us-ascii?Q?rfB5+UB7AqsoipCNxA7XpwszMgKhmrEs/XPDyoqDCyP+c9D3IEkdzfb8JMiD?= =?us-ascii?Q?nx2cbZiGhGrphq8ZirSdsQm07HribeWSKfv63YUPMLJ7rMv/yIZRj7h8Q+29?= =?us-ascii?Q?LqVefCFdQZIwQpxGjoZ1Fl1RhmPPw4QMMjZZaaVhZrGrfw3QyfyzZZJlKf3p?= =?us-ascii?Q?IUFeG5TnZfBYF3eacrvqUWD2q4xwzFLoVNUJlsfYAZq8XXq6dESowhh162Lv?= =?us-ascii?Q?BxMFJP5z5AUNEPtXM9xxgPsmx/SSGrTlagsN/ciQJN25cSI/i+D/ev0fMD8z?= =?us-ascii?Q?VY78VWlvowD5zm708s+nOwe5X4wuVWMSK2+Nddsn5J9kgR3drHaoUqM1mHz4?= =?us-ascii?Q?5I1hG9clCg0sKriLRPvnxWB8H7o9u2YUDSu/KKyRP4yi4Sm3Urv1ygno7n6b?= =?us-ascii?Q?e2qfp2AA8ltFPFakx4N5274IMESXC1SsjTQpDboOjCKxatKo7mxuVGodJnc8?= =?us-ascii?Q?UNQN9nn5RlM66BskZHINIh3nS69VHPse7S+6gnl7NvJKzQU9G+fyLMTBQMO4?= =?us-ascii?Q?TJvVtJQXCo67oylvP4YrNR0yf+1fzEstpJ8qn5sRjdTrkaL7xKVimqRNK0vp?= =?us-ascii?Q?kok8CZ+HUQewj2reth1cwVf8n4zJb9wJB3bdFxhY7RttV1tq2BaBff5EMlhI?= =?us-ascii?Q?gP+cKgSsmgtDRLvej8Kz5cyYxgMOuv9jt6hF6pHTaqhOqrb/5rkTvQjKWSpv?= =?us-ascii?Q?0p+ZVcYL7d4Nl9Yvqt9RuAR7JYqgzKDafiX5EfiqzihGOXbwMVjcBGARE7y0?= =?us-ascii?Q?n83gn1pQJxPESmhML/XDNXYaKYpAoccougFBQ5vkuCflL00Ih5ejInSYBKqC?= =?us-ascii?Q?oOcMYG5itHQgLuduBjauitUJgBajaM/dGO8t5JYfZD0WDBQmHN1odwDoedAu?= =?us-ascii?Q?eVmD6MVlGE26VFpCG91/DRTL53ZKnqcVKOMaBbifuoF8GNcwXW4sapOL5Dlk?= =?us-ascii?Q?cBrRaj77pOzeGNKr0wBk8FL97ZcSCdtR7TlqoMJntjk3YtEdJ+CzVVjvJ8cp?= =?us-ascii?Q?zGAwheXBk/cZ/G6dBLBXyLeYfybpCoW5PkNtQP8FDXFcgy20EcBnlG28urJI?= =?us-ascii?Q?SkHGEQl3HnlhK/kUe+65lI0NtRyGcR/Lv9vwSNmKlaOF0YikI+wd4VXjmoVw?= =?us-ascii?Q?aGRML69P1URdZG9d6MpLLoeH6q4BiQI+zrCvTZcCehilFUcnKwgSzYocJicr?= =?us-ascii?Q?pTKm9oZcLKhLdsggxPM=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(36860700013)(82310400026)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Nov 2025 16:09:00.9147 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 91069092-8051-41d5-9a9e-08de22cef571 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: CH1PEPF0000A34B.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB7524 Content-Type: text/plain; charset="utf-8" If multiple entities share the same window we must make sure that jobs using them are executed sequentially. This commit gives separate window id to each entity, so jobs from multiple entities could execute in parallel if needed. (for now they all use the first sdma engine, so it makes no difference yet). default_entity doesn't get any windows reserved since there is no use for them. Signed-off-by: Pierre-Eric Pelloux-Prayer --- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 9 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 50 ++++++++++++++---------- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 9 +++-- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 8 ++-- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/= amdgpu/amdgpu_gmc.c index 8e2d41c9c271..2a444d02cf4b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c @@ -686,7 +686,8 @@ void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *ade= v, uint32_t vmid, * translation. Avoid this by doing the invalidation from the SDMA * itself at least for GART. */ - mutex_lock(&adev->mman.gtt_window_lock); + mutex_lock(&adev->mman.clear_entity.gart_window_lock); + mutex_lock(&adev->mman.move_entity.gart_window_lock); r =3D amdgpu_job_alloc_with_ib(ring->adev, &adev->mman.default_entity.bas= e, AMDGPU_FENCE_OWNER_UNDEFINED, 16 * 4, AMDGPU_IB_POOL_IMMEDIATE, @@ -699,7 +700,8 @@ void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *ade= v, uint32_t vmid, job->ibs->ptr[job->ibs->length_dw++] =3D ring->funcs->nop; amdgpu_ring_pad_ib(ring, &job->ibs[0]); fence =3D amdgpu_job_submit(job); - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&adev->mman.move_entity.gart_window_lock); + mutex_unlock(&adev->mman.clear_entity.gart_window_lock); =20 dma_fence_wait(fence, false); dma_fence_put(fence); @@ -707,7 +709,8 @@ void amdgpu_gmc_flush_gpu_tlb(struct amdgpu_device *ade= v, uint32_t vmid, return; =20 error_alloc: - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&adev->mman.move_entity.gart_window_lock); + mutex_unlock(&adev->mman.clear_entity.gart_window_lock); dev_err(adev->dev, "Error flushing GPU TLB using the SDMA (%d)!\n", r); } =20 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/= amdgpu/amdgpu_ttm.c index c8d59ca2b3bd..7193a341689d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -291,7 +291,7 @@ static int amdgpu_ttm_map_buffer(struct drm_sched_entit= y *entity, */ __attribute__((nonnull)) static int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev, - struct drm_sched_entity *entity, + struct amdgpu_ttm_buffer_entity *entity, const struct amdgpu_copy_mem *src, const struct amdgpu_copy_mem *dst, uint64_t size, bool tmz, @@ -314,7 +314,7 @@ static int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_dev= ice *adev, amdgpu_res_first(src->mem, src->offset, size, &src_mm); amdgpu_res_first(dst->mem, dst->offset, size, &dst_mm); =20 - mutex_lock(&adev->mman.gtt_window_lock); + mutex_lock(&entity->gart_window_lock); while (src_mm.remaining) { uint64_t from, to, cur_size, tiling_flags; uint32_t num_type, data_format, max_com, write_compress_disable; @@ -324,15 +324,15 @@ static int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_d= evice *adev, cur_size =3D min3(src_mm.size, dst_mm.size, 256ULL << 20); =20 /* Map src to window 0 and dst to window 1. */ - r =3D amdgpu_ttm_map_buffer(entity, + r =3D amdgpu_ttm_map_buffer(&entity->base, src->bo, src->mem, &src_mm, - 0, ring, tmz, &cur_size, &from); + entity->gart_window_id0, ring, tmz, &cur_size, &from); if (r) goto error; =20 - r =3D amdgpu_ttm_map_buffer(entity, + r =3D amdgpu_ttm_map_buffer(&entity->base, dst->bo, dst->mem, &dst_mm, - 1, ring, tmz, &cur_size, &to); + entity->gart_window_id1, ring, tmz, &cur_size, &to); if (r) goto error; =20 @@ -359,7 +359,7 @@ static int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_dev= ice *adev, write_compress_disable)); } =20 - r =3D amdgpu_copy_buffer(ring, entity, from, to, cur_size, resv, + r =3D amdgpu_copy_buffer(ring, &entity->base, from, to, cur_size, resv, &next, true, copy_flags); if (r) goto error; @@ -371,7 +371,7 @@ static int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_dev= ice *adev, amdgpu_res_next(&dst_mm, cur_size); } error: - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&entity->gart_window_lock); *f =3D fence; return r; } @@ -401,7 +401,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *b= o, dst.offset =3D 0; =20 r =3D amdgpu_ttm_copy_mem_to_mem(adev, - &adev->mman.move_entity.base, + &adev->mman.move_entity, &src, &dst, new_mem->size, amdgpu_bo_encrypted(abo), @@ -1893,8 +1893,6 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) uint64_t gtt_size; int r; =20 - mutex_init(&adev->mman.gtt_window_lock); - dma_set_max_seg_size(adev->dev, UINT_MAX); /* No others user of address space so set it to 0 */ r =3D ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, adev->dev, @@ -2207,6 +2205,15 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgp= u_device *adev, bool enable) drm_sched_entity_destroy(&adev->mman.clear_entity.base); goto error_free_entity; } + + /* Statically assign GART windows to each entity. */ + mutex_init(&adev->mman.default_entity.gart_window_lock); + adev->mman.move_entity.gart_window_id0 =3D 0; + adev->mman.move_entity.gart_window_id1 =3D 1; + mutex_init(&adev->mman.move_entity.gart_window_lock); + /* Clearing entity doesn't use id0 */ + adev->mman.clear_entity.gart_window_id1 =3D 2; + mutex_init(&adev->mman.clear_entity.gart_window_lock); } else { drm_sched_entity_destroy(&adev->mman.default_entity.base); drm_sched_entity_destroy(&adev->mman.clear_entity.base); @@ -2371,6 +2378,7 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo, { struct amdgpu_device *adev =3D amdgpu_ttm_adev(bo->tbo.bdev); struct amdgpu_ring *ring =3D adev->mman.buffer_funcs_ring; + struct amdgpu_ttm_buffer_entity *entity; struct amdgpu_res_cursor cursor; u64 addr; int r =3D 0; @@ -2381,11 +2389,12 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo, if (!fence) return -EINVAL; =20 + entity =3D &adev->mman.clear_entity; *fence =3D dma_fence_get_stub(); =20 amdgpu_res_first(bo->tbo.resource, 0, amdgpu_bo_size(bo), &cursor); =20 - mutex_lock(&adev->mman.gtt_window_lock); + mutex_lock(&entity->gart_window_lock); while (cursor.remaining) { struct dma_fence *next =3D NULL; u64 size; @@ -2398,13 +2407,13 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo, /* Never clear more than 256MiB at once to avoid timeouts */ size =3D min(cursor.size, 256ULL << 20); =20 - r =3D amdgpu_ttm_map_buffer(&adev->mman.clear_entity.base, + r =3D amdgpu_ttm_map_buffer(&entity->base, &bo->tbo, bo->tbo.resource, &cursor, - 1, ring, false, &size, &addr); + entity->gart_window_id1, ring, false, &size, &addr); if (r) goto err; =20 - r =3D amdgpu_ttm_fill_mem(ring, &adev->mman.clear_entity.base, 0, addr, = size, resv, + r =3D amdgpu_ttm_fill_mem(ring, &entity->base, 0, addr, size, resv, &next, true, AMDGPU_KERNEL_JOB_ID_TTM_CLEAR_BUFFER); if (r) @@ -2416,12 +2425,12 @@ int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo, amdgpu_res_next(&cursor, size); } err: - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&entity->gart_window_lock); =20 return r; } =20 -int amdgpu_fill_buffer(struct amdgpu_ttm_entity *entity, +int amdgpu_fill_buffer(struct amdgpu_ttm_buffer_entity *entity, struct amdgpu_bo *bo, uint32_t src_data, struct dma_resv *resv, @@ -2442,7 +2451,7 @@ int amdgpu_fill_buffer(struct amdgpu_ttm_entity *enti= ty, =20 amdgpu_res_first(bo->tbo.resource, 0, amdgpu_bo_size(bo), &dst); =20 - mutex_lock(&adev->mman.gtt_window_lock); + mutex_lock(&entity->gart_window_lock); while (dst.remaining) { struct dma_fence *next; uint64_t cur_size, to; @@ -2452,7 +2461,8 @@ int amdgpu_fill_buffer(struct amdgpu_ttm_entity *enti= ty, =20 r =3D amdgpu_ttm_map_buffer(&entity->base, &bo->tbo, bo->tbo.resource, &dst, - 1, ring, false, &cur_size, &to); + entity->gart_window_id1, ring, false, + &cur_size, &to); if (r) goto error; =20 @@ -2468,7 +2478,7 @@ int amdgpu_fill_buffer(struct amdgpu_ttm_entity *enti= ty, amdgpu_res_next(&dst, cur_size); } error: - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&entity->gart_window_lock); if (f) *f =3D dma_fence_get(fence); dma_fence_put(fence); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/= amdgpu/amdgpu_ttm.h index e1655f86a016..f4f762be9fdd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -39,7 +39,7 @@ #define __AMDGPU_PL_NUM (TTM_PL_PRIV + 6) =20 #define AMDGPU_GTT_MAX_TRANSFER_SIZE 512 -#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2 +#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 3 =20 extern const struct attribute_group amdgpu_vram_mgr_attr_group; extern const struct attribute_group amdgpu_gtt_mgr_attr_group; @@ -54,6 +54,9 @@ struct amdgpu_gtt_mgr { =20 struct amdgpu_ttm_buffer_entity { struct drm_sched_entity base; + struct mutex gart_window_lock; + u32 gart_window_id0; + u32 gart_window_id1; }; =20 struct amdgpu_mman { @@ -69,7 +72,7 @@ struct amdgpu_mman { =20 struct mutex gtt_window_lock; =20 - struct amdgpu_ttm_buffer_entity default_entity; + struct amdgpu_ttm_buffer_entity default_entity; /* has no gart windows */ struct amdgpu_ttm_buffer_entity clear_entity; struct amdgpu_ttm_buffer_entity move_entity; =20 @@ -177,7 +180,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, int amdgpu_ttm_clear_buffer(struct amdgpu_bo *bo, struct dma_resv *resv, struct dma_fence **fence); -int amdgpu_fill_buffer(struct amdgpu_ttm_entity *entity, +int amdgpu_fill_buffer(struct amdgpu_ttm_buffer_entity *entity, struct amdgpu_bo *bo, uint32_t src_data, struct dma_resv *resv, diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd= /amdkfd/kfd_migrate.c index 09756132fa1b..bc47fc362a17 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -60,7 +60,7 @@ svm_migrate_gart_map(struct amdgpu_ring *ring, int r; =20 /* use gart window 0 */ - *gart_addr =3D adev->gmc.gart_start; + *gart_addr =3D entity->gart_window_id0; =20 num_dw =3D ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8); num_bytes =3D npages * 8; @@ -116,7 +116,7 @@ svm_migrate_gart_map(struct amdgpu_ring *ring, * multiple GTT_MAX_PAGES transfer, all sdma operations are serialized, wa= it for * the last sdma finish fence which is returned to check copy memory is do= ne. * - * Context: Process context, takes and releases gtt_window_lock + * Context: Process context, takes and releases gart_window_lock * * Return: * 0 - OK, otherwise error code @@ -138,7 +138,7 @@ svm_migrate_copy_memory_gart(struct amdgpu_device *adev= , dma_addr_t *sys, =20 entity =3D &adev->mman.move_entity; =20 - mutex_lock(&adev->mman.gtt_window_lock); + mutex_lock(&entity->gart_window_lock); =20 while (npages) { size =3D min(GTT_MAX_PAGES, npages); @@ -175,7 +175,7 @@ svm_migrate_copy_memory_gart(struct amdgpu_device *adev= , dma_addr_t *sys, } =20 out_unlock: - mutex_unlock(&adev->mman.gtt_window_lock); + mutex_unlock(&entity->gart_window_lock); =20 return r; } --=20 2.43.0