From nobody Sat Feb 7 15:11:18 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011051.outbound.protection.outlook.com [52.101.62.51]) (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 13A4A324701; Fri, 30 Jan 2026 08:35:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762137; cv=fail; b=bw4TsjNp1FGtj0OktnjWg6h9E7bopVeKFLdoxI0IbTmdWbilAyy7QzZiWM5P0c0OBTra+epnsh0Rwe1eeyKZQOXQG3sNUL7ZftGTMgrrq9xTx3HbbIz0NU/tMhOb+KBblOFqZPQheCmhi2JNSDUOTdhQcDVt0TRPb4esL28l7uU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762137; c=relaxed/simple; bh=xEDiAFtaOWeE2R9kf2Sl0hlyEE2Cg9vfGOttWTAIYhE=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Io8ZpjBsJH9GBF16hqtPp6lLfKUH6MibNHKPPRSghy/YDDEl3gDB4NaR8dhtS/SYMXxq4Iuk9zNeiv5QLYzCcTNML0ha5ciJ8QX6wQnWrqaSNNVsRq8DGZbhJ+aehEuQlASSY2+0pIxsKpxqCK/3HRdFzq8nHX2MYAlIabl13Is= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=CKXUgdb5; arc=fail smtp.client-ip=52.101.62.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="CKXUgdb5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YLTAEgs2YTxEaOEjq7DyS/r2agrDklNbFSc0Eft5C9wprN4XmPaF1OsTuj8q7+woLBCCaHSlVm/b9AntcCDojHUg5HooI+UTaTg0LzNp74aFUi9p18QludPt+7zSE4Rd5Y1d5F8K1l25hHDikvUaADvXPMerwiNKXRqAnAh3p9uyhP3bbLWkDstlIUxik8gA08xfhlI+gZIDuGKyeDmh6iMFEdP9d3iXwgns9QFij9YRs4wfTmBfOjW0TCBcf/KoyT5Yt0cjMFAKeLj4BIEFa5XXHKAbp7CrBhce4G8+dcwX+ymiDRUsisZxRAdqhlCcvRDyh2XCNJIGVAW5dsrZgQ== 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=kA9R8Rxz1G7iPOKp8pYm905Gu/KbLbGJ3myVy5aVskE=; b=zI4tqpUk1i7fPUYfhN/F2+cWd6PdgtGi8ZWGdDVc1knszDnJV3cU4BWIDG//hOAQ/pF3xlM1IpbiIqPsG/Krx4vI7t3ZyU+C0GAjvmSVgSIlB8y7/ppEpAllfw/KshaQusF8ojoZ1VChkj6jH0BgY4fsgFkrK6kam4Z5alU4+t95Htn28PExC0x1TVkNGvgfabxYIK0Z/Tmq+ENHMH+OpujOfE/faGt1/mcBP3Y/oDgCC4oZMhhGVGty1iFsaAuOI9XHZoOOsriZQL3QRLYDLA0YXZCu4Po/0HMh5QFTnYpo4jabOp4gjcZ3WmdIjOMBps+bS7zQewLV9rm4hzpVXQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kA9R8Rxz1G7iPOKp8pYm905Gu/KbLbGJ3myVy5aVskE=; b=CKXUgdb5sANlkb9lEO4Fe/Bxv3FunTxgwE1ltXNAb+9O7iLJ192JK6VL7rRRK0TuBqqYlviME9mR2o86F/qwkb8/i3/CMX9KN7nwQt2ibym1ANqH8Cxc7eccDwgwnptFcruSQN1+hxRPrHRQ2F36XAG8VuoO8uvwArS+zc0iYlBHJcwPLX0G6LTXVlUNSYkad1Vjl4PFQkBmjVi1I6XiKxoYyUhKqJhMB8nUJ0MP9BhXt9B3coZMwNRX5d+3uw7ojp9rT92h7hPM9GFbkUNV0GFJ2Q14jfwRbYK99SdjV/FNSjvTS8qMwWwxr252oF6fkmaYm/f1KAu5oDHrN9HXrQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by DS0PR12MB9400.namprd12.prod.outlook.com (2603:10b6:8:1b6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 08:35:28 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:28 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:04 +0900 Subject: [PATCH 1/9] rust: dma: rename CoherentAllocation fallible methods Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-1-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4P286CA0048.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:36e::9) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|DS0PR12MB9400:EE_ X-MS-Office365-Filtering-Correlation-Id: e8a4548a-69bd-4688-0126-08de5fda85cb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?L0hWd25lS2MvL1FFc3h3OGtTNGhUVGU1aHNtMTQ2dTlRbVlPMDJGRklqdmVi?= =?utf-8?B?UTNqaklPMU1pV3hpQWRQZGFFMytiOXVUY1N0VHM5WGN4dElQVVVYQ0VQTi9N?= =?utf-8?B?MEYxajFscndvaWFTMXVTL1dEcko2aTNBK0E5Q2d3QnVwTHc5eWR4V1l1SzJX?= =?utf-8?B?bFNaV29aaXR5TzlrVG8rZENCbnJBak1ubTBrNzl0OVdqUG4wVjhTSHlVYW1z?= =?utf-8?B?Z2xHUW8zdW56RGhmbnExMW15RXAzYVo3eEx4NWVudTV3Vm4ycmlOYVh2a0JL?= =?utf-8?B?bEZnb3c2dzNJaHZwNVpXYXI2QWJmQlZZZjlINDRNcXZHdVByc0J6RW1GSUdr?= =?utf-8?B?am11SlFnR3M4bWRBUGprYnhoUHhPQXJVSFViNTJlbVNVa0ZTdEhtOTl2SVRq?= =?utf-8?B?R0p0YlZORXM1enVnQzhPRmtEM1RYQUZRNVZZbkZpTjQ5QnNHSmVocUNLY2Ra?= =?utf-8?B?S1gwZWgwRlpleWJsdUdIdGM1TFFNMDJPUnNFU2lZa0ora0d4QjhXRW84Y2lH?= =?utf-8?B?MkowWHRaeG9MalM4NllDOXd1R2tpa01TVVpBekVPQ2dFRkp2YW5TTmd2OFpy?= =?utf-8?B?ZEdJa05aK2tKam5jczEra3VJR0w3S0luQVgvUjl2VWR0YUU4Z3VTOThnSThl?= =?utf-8?B?VjhLMytoR01vWElOZFJXb2ZlclFGOEtpbXgxNjg5QWkwS0VmZ2RGMTlaZVV3?= =?utf-8?B?V244YWE3bURUeHhEOUdsVlpjN2ljMXltcXNCa3RCQ3lPa2d5NTRiUklFdHM0?= =?utf-8?B?blQ3QnpjNE9sQ29XYkJ1Q2hCQittdE1CY3l3WUpKTlFJcWRtb0V5NlRZbWRu?= =?utf-8?B?UVV5WW1EaS85TWYrRG5lME1nUG5QSGRCNmMwRFcrbldjWkpxcmJIRTRGZEFE?= =?utf-8?B?KzMxOTlsbk9uUW42QnhuRHFnZEcyclp3YnRNYkdtRGVNSTRtL0R5bndsb1hh?= =?utf-8?B?MjRpWHpGMXVkTExRU0htNHpicEpINmZzR1FkZ3BRN0hqT3JucE5GV1dFKzQr?= =?utf-8?B?SFdlRnVZakdHU05hZncrT1hCL0djb3BpZ1YwWmlReW5HUDZ2U1VaVHoyZytP?= =?utf-8?B?VHA1eERPOFZ1WlNjeWlRRWQ5RkVkZG5NbWlMVjFnUzRRYnNvU1AzcWtuOERK?= =?utf-8?B?RmMybTlndDF1SDlDWnRwUFE5Vjk1V0xvemhDcVAvbkNWaDBkMFFDSUZCSytL?= =?utf-8?B?UXJjOHZVTjVFNDE5a1NrMXJzRGhIVEgzd1dSTHR0dXNSTnZUWDRETEVOVnc4?= =?utf-8?B?WWNaSktWUnFtNFpyL3c5MlhlOXJUWFB6L3RleHdCNzZzN1ltRDltdjdPSzk5?= =?utf-8?B?bHlETWJxVmgwelZxejNQeFF6NE1wSnFuSFlkZVQyY3kwMndtNnFjbjkxY1o0?= =?utf-8?B?bkNhZkhBbDlhSk5NUGYyNWtwUHVZWGhQdzB4b1QyN1N1ckRjdHdGUnVUR0oz?= =?utf-8?B?TVhMKzRMUzNLYmxLcjhKamZzMHNwditoRitGdmlvN0VwUkhmYk12ajVaMlNv?= =?utf-8?B?ZjZ2Q2lGcDZiUWdWUW05RGovOHRCNkkvTmtjYWtrbDBRek0vaFBXQ0lpUmVJ?= =?utf-8?B?eWpTYk9vR0JNcnNqTDNCcmRVVzRLT2NQS043NEFseUpnalhqNGJ3K3p5SDk5?= =?utf-8?B?cjI3SkZOQ2o4MlQzZS9ibCtiWHpKZmZjTDEzMTFxajc3SkZ2QlZZOVFpUUtS?= =?utf-8?B?Tm8va0tObi9pSDBNNCtUVGpRWmhSWG9ScXN0M1VpZ0E3cU9mQjRLS1NocCsy?= =?utf-8?B?SzZQS2JvOUVVd3FhKytRS0VJdjJoY3crT2xGaWNCNlRTWnI2ZWJjb3BGSTBa?= =?utf-8?B?b2xjNk1RWmJQWFJoaDZGQTd0QnNNNWhDVTMvQ2tGTk04bkV5aWY5d1NHODc3?= =?utf-8?B?c2ZzYi9mK25RSk0yVlptWjBYTVVvd1I0SVNVdkZNZmpwV2JzMFNidU8vdVRu?= =?utf-8?B?QUZLS3ZxUGJUNW05YTJMTmFTa1IzVkFMWWVHNzRVTXFOVmppejlBbnpnaXRw?= =?utf-8?B?NE5kdzlYTkl2a1ZnaXd1Qk5oZWUxc25DWkI2SllQQitDQ3VHclBCejVkUXU1?= =?utf-8?B?dDY0WEtmaGloUzh3UWtHUUJPU1dTQ3U5OENMZHVMWlNjM0QzTEFVMHJvV1Jz?= =?utf-8?B?ZEJzcldYRXphbnNzT3I3M25uV2t5emZwSm5lMkJyUUhNNStQZFQ4VzFTNGU5?= =?utf-8?B?TVE9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UnYzVTJ3TmF1eG43ZzNGNTV0bkMwYUpoV3JxYi9abFgyVGNVQWFNeFJBRGVI?= =?utf-8?B?dzRLTjFrcE1Dc05TMWJxcy8vbVRRd3Fhb3UvRVhOcFFlVU80eHRHcnJ5c2lO?= =?utf-8?B?UzRad2JsMWJOWEdEaUZZL2NUWjdwS3V6RFlxS3AwVGJod2ttVmNUMUhPZlhu?= =?utf-8?B?SDZsQWk3dnByRUUwbEhvcUVOdE9EV0djWjBRNDRvUVFzeGZma3YvaFQwdFdP?= =?utf-8?B?MFREancrV3V3OE1DaUNHNXI3amVWODlXTE1vcUFYTGlTWUdtbEZIYVdwWFln?= =?utf-8?B?SnoreHM4eVFjTUV2Zm9vc3k4SHZqWGhUcmZOZFlpVjFoN05GV0pWRDRrc2VK?= =?utf-8?B?dnZFeFdXbFQ4b01SMHh0VEVmanpiV0hEOWthTEhnTW90T3NjT1lPVENUc0NE?= =?utf-8?B?eHMxQkoyOGMydzRzTmpNcURyNGZiTW45allEQjVkUENjWlkvcG1aaWdueFFh?= =?utf-8?B?eDZQU0kxVFR0WFd0Vm9IZ215Tk5QY1V3NThsbnVjdmtzRjF1SWdIaE1rVmtu?= =?utf-8?B?ZldxcEEvV2ppQlRrRlVFUkowVm4zdjQ4YmJQTkZjR0h1TDVSZVRwSXZrakZZ?= =?utf-8?B?elVaNjhSRmFyd3VKajJWQ1FFY1lxb3FldHgyNlpJc3ZlMitxZHpuSjdRRjNk?= =?utf-8?B?WjJ3S29tTXVuU2d1QXh6Y2x1ZkJNbERab3lMTk5UQ0JlR1B6WGNOdnlrVDNB?= =?utf-8?B?YkpQRk9MWnVTczlRME5vT3R5QVVZNXcrS0ZNOGl0Z2tqdmJFOG12bzQ0RGQw?= =?utf-8?B?MUdtQ28yd0N1UlI2SDZ1Q1pkaXJvVWQyZVMxUEdqTkJRaGlXTkVCaG9haEp4?= =?utf-8?B?bXZKSkVOdy9Ec0xVc3lacStyZW1RMXdTU3c5aFdaR0NQUkViUEQrd1M4Si9r?= =?utf-8?B?bmtWNm0rcFpERW1JRWtDTmo0cXIyQ1NOeDlPUFA4MGEzcnUrUllYem93M0k5?= =?utf-8?B?dVpadnlmZnUyY1lpN3NkTTZ2ejkreWlVd3JvTUZoVEc1ZTdoWWZZYzVSTjZs?= =?utf-8?B?dDNRMndxWnl1SzZRclZndWdaZzAvYTh1eWliaGhrbXQzMVJWTkdUQXIrelBu?= =?utf-8?B?bnBhYllyL2pTa2hGQnRwLzY2WVRzZ0tFZ1NoM3diVzdidjRZMHZicHprRVpE?= =?utf-8?B?MFloWGQ2aWE5YmplRmdidFZsRTlycm9mRUJBYVMvMXpabm5CS0RCaDBYamFQ?= =?utf-8?B?eUVmVkVWVG5NZWZTdHMxdDBSNnQxN1hEUE1VSzkrNWVuR0FDRlBlK0NKcnpk?= =?utf-8?B?S1FwUlVOSXplc2dGb1RYVXFSWUtham15bG12cHRReFpCK1lzSDlwRmhiaFBt?= =?utf-8?B?R2tidGFCUVlxZHdGb3hvKzV4ZTRjRE1lMURhSHlkREJjeHpqR1RkSEEvNEUy?= =?utf-8?B?UmFON3lkZjVJemVRVDkxek16TzZLaVFWaEdKTzNhOHl0Z2pxdFovRjVOMFRK?= =?utf-8?B?bUtmVVpETDRlTVIxNjJvaDBhMjlpUlB2ckNyVk1vUk85dWRyN2cvMjVyV2ZR?= =?utf-8?B?VkVxcUU5N1BTcWFBQU9jT3pmamZmcnlEMjUwM29jK3VkcG9TOHYzT0h1a0Js?= =?utf-8?B?VWcwam4yUE40dDE1dTVIYXB2MU9JQ3JjVjh4N1d1VGJQOWNaQzJYZzlkUUJz?= =?utf-8?B?YUhTZlRwZU0zRmNwaWJQZExvTEl0OVIreE1rV2NEY2tNQXFoRlg4b3F0YVNp?= =?utf-8?B?QjNMb1ZWOVloKzRMU2xOTzBlT1dBUEZhamo2SmlnUUdvRitPUmg0YWsveHla?= =?utf-8?B?SkMzWWlnbzUvR2o5ME9JWDIrUUZrYkJ3TzV6Nm83bDlNMFNkRTFyQ2FPV0Rh?= =?utf-8?B?ZlNtV3lUeGM0SitwY0U5OHlydVFRcnM2Sy95RmxYbldPU1Qza3ZQZEFjMGJu?= =?utf-8?B?Rk5ORGs5OUg1QlFXUktyMjdLVU50bG5sNXkvWVlCZ0VsTElMWEJPYmZSalVw?= =?utf-8?B?ZDRTc0dBQUtzMUJPV3JmYnQrdFgrSktsTUluNFJueDBiK3lDb1UzbTRRS0da?= =?utf-8?B?QXlOZWlyTkNmRHZOaTVTdWpONUtLY0xIZ0I0WGlwVzFmZHdQSm9rTjFsVnVW?= =?utf-8?B?elNYTUJWeWF0bnNiejZnakJwcDlITy9IdzZKVFlURWxmMnFtMVhFYzNCdUht?= =?utf-8?B?RGRaclorU2Zld21FeEpEWER2NDc5amVrSGZJcFFFYitDSFdIOWRUUjhTY0JX?= =?utf-8?B?UUsxUCsxRkpWNTJlYUc0Rm1LcDZ6ekVEZzJEcE5kam9WZlh2YVFKcFRoSndV?= =?utf-8?B?STdKM2VkNmIzdHZnaGRUZkNqRXd5NnFXbHpDTUV5OE83MHBGR1hEZ3BxNE1u?= =?utf-8?B?UGFDS1A5Z0lwSjhPcklxY2x0MTNpOVFyYXNBSXBGTTEyeDA1czAzeTFleU84?= =?utf-8?Q?f/PzpWG7tvnhQ62jiiJmiTfBT/5tkRmHmAEN+MGcI50Ge?= X-MS-Exchange-AntiSpam-MessageData-1: 3k7R/UpR75IBeA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8a4548a-69bd-4688-0126-08de5fda85cb X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:28.6437 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6M2yVZmO+G1gDn9UwFNdv27hOrehoQ2d8wxu0r2sQ3vt+j7ira8Sjn5d6zQeWUwna7z50M/if0cFNfRFOPTGMw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB9400 Prefix fallible methods in CoherentAllocation with try_. Prefix dma_write! and dma_read! macros with try_ to better indicate they can fail. Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/dma.rs | 2 +- drivers/gpu/nova-core/falcon.rs | 2 +- drivers/gpu/nova-core/firmware/fwsec.rs | 4 +- drivers/gpu/nova-core/gsp.rs | 16 +++---- drivers/gpu/nova-core/gsp/boot.rs | 6 +-- drivers/gpu/nova-core/gsp/cmdq.rs | 14 +++--- rust/kernel/dma.rs | 85 +++++++++++++++++------------= ---- samples/rust/rust_dma.rs | 6 +-- 8 files changed, 69 insertions(+), 66 deletions(-) diff --git a/drivers/gpu/nova-core/dma.rs b/drivers/gpu/nova-core/dma.rs index 7215398969da..f77754f12f02 100644 --- a/drivers/gpu/nova-core/dma.rs +++ b/drivers/gpu/nova-core/dma.rs @@ -33,7 +33,7 @@ pub(crate) fn from_data(dev: &device::Device, data: &[u8]) -> Res Self::new(dev, data.len()).and_then(|mut dma_obj| { // SAFETY: We have just allocated the DMA memory, we are the o= nly users and // we haven't made the device aware of the handle yet. - unsafe { dma_obj.write(data, 0)? } + unsafe { dma_obj.try_write(data, 0)? } Ok(dma_obj) }) } diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 82c661aef594..9cd271de0554 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -460,7 +460,7 @@ fn dma_wr>( FalconMem::Imem =3D> (load_offsets.src_start, fw.dma_handle()), FalconMem::Dmem =3D> ( 0, - fw.dma_handle_with_offset(load_offsets.src_start.into_safe= _cast())?, + fw.try_dma_handle_with_offset(load_offsets.src_start.into_= safe_cast())?, ), }; if dma_start % DmaAddress::from(DMA_LEN) > 0 { diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-cor= e/firmware/fwsec.rs index b28e34d279f4..515b19926b49 100644 --- a/drivers/gpu/nova-core/firmware/fwsec.rs +++ b/drivers/gpu/nova-core/firmware/fwsec.rs @@ -191,7 +191,7 @@ unsafe fn transmute(fw: &DmaObjec= t, offset: usize) -> Resu // SAFETY: The safety requirements of the function guarantee the devic= e won't read // or write to memory while the reference is alive and that this call = won't race // with writes to the same memory region. - T::from_bytes(unsafe { fw.as_slice(offset, size_of::())? }).ok_or(E= INVAL) + T::from_bytes(unsafe { fw.try_as_slice(offset, size_of::())? }).ok_= or(EINVAL) } =20 /// Reinterpret the area starting from `offset` in `fw` as a mutable insta= nce of `T` (which must @@ -210,7 +210,7 @@ unsafe fn transmute_mut( // SAFETY: The safety requirements of the function guarantee the devic= e won't read // or write to memory while the reference is alive and that this call = won't race // with writes or reads to the same memory region. - T::from_bytes_mut(unsafe { fw.as_slice_mut(offset, size_of::())? })= .ok_or(EINVAL) + T::from_bytes_mut(unsafe { fw.try_as_slice_mut(offset, size_of::())= ? }).ok_or(EINVAL) } =20 /// The FWSEC microcode, extracted from the BIOS and to be run on the GSP = falcon. diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index fb6f74797178..43bc35fd3b55 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -8,10 +8,10 @@ CoherentAllocation, DmaAddress, // }, - dma_write, pci, prelude::*, - transmute::AsBytes, // + transmute::AsBytes, + try_dma_write, // }; =20 pub(crate) mod cmdq; @@ -92,7 +92,7 @@ fn new(dev: &device::Device) -> Result { unsafe { // Copy the self-mapping PTE at the expected location. obj.0 - .as_slice_mut(size_of::(), size_of_val(&ptes))? + .try_as_slice_mut(size_of::(), size_of_val(&ptes))? .copy_from_slice(ptes.as_bytes()) }; =20 @@ -131,13 +131,13 @@ pub(crate) fn new(pdev: &pci::Device) = -> Result) ->= Result::alloc_coherent(dev, 1, GFP= _KERNEL | __GFP_ZERO)?; - dma_write!(wpr_meta[0] =3D GspFwWprMeta::new(&gsp_fw, &fb_layout))= ?; + try_dma_write!(wpr_meta[0] =3D GspFwWprMeta::new(&gsp_fw, &fb_layo= ut))?; =20 self.cmdq .send_command(bar, commands::SetSystemInfo::new(pdev))?; diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 3991ccc0c10f..9c94f4c6ff6d 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -15,7 +15,6 @@ CoherentAllocation, DmaAddress, // }, - dma_write, io::poll::read_poll_timeout, prelude::*, sync::aref::ARef, @@ -24,6 +23,7 @@ AsBytes, FromBytes, // }, + try_dma_write, // }; =20 use crate::{ @@ -201,9 +201,11 @@ fn new(dev: &device::Device) -> Result<= Self> { =20 let gsp_mem =3D CoherentAllocation::::alloc_coherent(dev, 1, GFP_KERNE= L | __GFP_ZERO)?; - dma_write!(gsp_mem[0].ptes =3D PteArray::new(gsp_mem.dma_handle())= ?)?; - dma_write!(gsp_mem[0].cpuq.tx =3D MsgqTxHeader::new(MSGQ_SIZE, RX_= HDR_OFF, MSGQ_NUM_PAGES))?; - dma_write!(gsp_mem[0].cpuq.rx =3D MsgqRxHeader::new())?; + try_dma_write!(gsp_mem[0].ptes =3D PteArray::new(gsp_mem.dma_handl= e())?)?; + try_dma_write!( + gsp_mem[0].cpuq.tx =3D MsgqTxHeader::new(MSGQ_SIZE, RX_HDR_OFF= , MSGQ_NUM_PAGES) + )?; + try_dma_write!(gsp_mem[0].cpuq.rx =3D MsgqRxHeader::new())?; =20 Ok(Self(gsp_mem)) } @@ -221,7 +223,7 @@ fn new(dev: &device::Device) -> Result { // - The `CoherentAllocation` contains exactly one object. // - We will only access the driver-owned part of the shared memor= y. // - Per the safety statement of the function, no concurrent acces= s will be performed. - let gsp_mem =3D &mut unsafe { self.0.as_slice_mut(0, 1) }.unwrap()= [0]; + let gsp_mem =3D &mut unsafe { self.0.try_as_slice_mut(0, 1) }.unwr= ap()[0]; // PANIC: per the invariant of `cpu_write_ptr`, `tx` is `<=3D MSGQ= _NUM_PAGES`. let (before_tx, after_tx) =3D gsp_mem.cpuq.msgq.data.split_at_mut(= tx); =20 @@ -256,7 +258,7 @@ fn new(dev: &device::Device) -> Result { // - The `CoherentAllocation` contains exactly one object. // - We will only access the driver-owned part of the shared memor= y. // - Per the safety statement of the function, no concurrent acces= s will be performed. - let gsp_mem =3D &unsafe { self.0.as_slice(0, 1) }.unwrap()[0]; + let gsp_mem =3D &unsafe { self.0.try_as_slice(0, 1) }.unwrap()[0]; // PANIC: per the invariant of `cpu_read_ptr`, `xx` is `<=3D MSGQ_= NUM_PAGES`. let (before_rx, after_rx) =3D gsp_mem.gspq.msgq.data.split_at(rx); =20 diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 909d56fd5118..02321d5f3f06 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -482,7 +482,7 @@ pub fn dma_handle(&self) -> DmaAddress { /// device as the DMA address base of the region. /// /// Returns `EINVAL` if `offset` is not within the bounds of the alloc= ation. - pub fn dma_handle_with_offset(&self, offset: usize) -> Result { + pub fn try_dma_handle_with_offset(&self, offset: usize) -> Result { if offset >=3D self.count { Err(EINVAL) } else { @@ -494,7 +494,7 @@ pub fn dma_handle_with_offset(&self, offset: usize) -> = Result { =20 /// Common helper to validate a range applied from the allocated regio= n in the CPU's virtual /// address space. - fn validate_range(&self, offset: usize, count: usize) -> Result { + fn try_validate_range(&self, offset: usize, count: usize) -> Result { if offset.checked_add(count).ok_or(EOVERFLOW)? > self.count { return Err(EINVAL); } @@ -514,8 +514,8 @@ fn validate_range(&self, offset: usize, count: usize) -= > Result { /// slice is live. /// * Callers must ensure that this call does not race with a write to= the same region while /// the returned slice is live. - pub unsafe fn as_slice(&self, offset: usize, count: usize) -> Result<&= [T]> { - self.validate_range(offset, count)?; + pub unsafe fn try_as_slice(&self, offset: usize, count: usize) -> Resu= lt<&[T]> { + self.try_validate_range(offset, count)?; // SAFETY: // - The pointer is valid due to type invariant on `CoherentAlloca= tion`, // we've just checked that the range and index is within bounds.= The immutability of the @@ -525,8 +525,8 @@ pub unsafe fn as_slice(&self, offset: usize, count: usi= ze) -> Result<&[T]> { Ok(unsafe { core::slice::from_raw_parts(self.start_ptr().add(offse= t), count) }) } =20 - /// Performs the same functionality as [`CoherentAllocation::as_slice`= ], except that a mutable - /// slice is returned. + /// Performs the same functionality as [`CoherentAllocation::try_as_sl= ice`], except that a + /// mutable slice is returned. /// /// # Safety /// @@ -534,8 +534,8 @@ pub unsafe fn as_slice(&self, offset: usize, count: usi= ze) -> Result<&[T]> { /// slice is live. /// * Callers must ensure that this call does not race with a read or = write to the same region /// while the returned slice is live. - pub unsafe fn as_slice_mut(&mut self, offset: usize, count: usize) -> = Result<&mut [T]> { - self.validate_range(offset, count)?; + pub unsafe fn try_as_slice_mut(&mut self, offset: usize, count: usize)= -> Result<&mut [T]> { + self.try_validate_range(offset, count)?; // SAFETY: // - The pointer is valid due to type invariant on `CoherentAlloca= tion`, // we've just checked that the range and index is within bounds.= The immutability of the @@ -561,11 +561,11 @@ pub unsafe fn as_slice_mut(&mut self, offset: usize, = count: usize) -> Result<&mu /// let buf: &[u8] =3D &somedata; /// // SAFETY: There is no concurrent HW operation on the device and n= o other R/W access to the /// // region. - /// unsafe { alloc.write(buf, 0)?; } + /// unsafe { alloc.try_write(buf, 0)?; } /// # Ok::<(), Error>(()) } /// ``` - pub unsafe fn write(&mut self, src: &[T], offset: usize) -> Result { - self.validate_range(offset, src.len())?; + pub unsafe fn try_write(&mut self, src: &[T], offset: usize) -> Result= { + self.try_validate_range(offset, src.len())?; // SAFETY: // - The pointer is valid due to type invariant on `CoherentAlloca= tion` // and we've just checked that the range and index is within bou= nds. @@ -581,12 +581,13 @@ pub unsafe fn write(&mut self, src: &[T], offset: usi= ze) -> Result { Ok(()) } =20 - /// Returns a pointer to an element from the region with bounds checki= ng. `offset` is in - /// units of `T`, not the number of bytes. + /// Returns a pointer to an element from the region with bounds checki= ng. `offset` is in units + /// of `T`, not the number of bytes. /// - /// Public but hidden since it should only be used from [`dma_read`] a= nd [`dma_write`] macros. + /// Public but hidden since it should only be used from [`try_dma_read= `] and [`try_dma_write`] + /// macros. #[doc(hidden)] - pub fn item_from_index(&self, offset: usize) -> Result<*mut T> { + pub fn try_item_from_index(&self, offset: usize) -> Result<*mut T> { if offset >=3D self.count { return Err(EINVAL); } @@ -602,10 +603,10 @@ pub fn item_from_index(&self, offset: usize) -> Resul= t<*mut T> { /// /// # Safety /// - /// This must be called from the [`dma_read`] macro which ensures that= the `field` pointer is - /// validated beforehand. + /// This must be called from the [`try_dma_read`] macro which ensures = that the `field` pointer + /// is validated beforehand. /// - /// Public but hidden since it should only be used from [`dma_read`] m= acro. + /// Public but hidden since it should only be used from [`try_dma_read= `] macro. #[doc(hidden)] pub unsafe fn field_read(&self, field: *const F) -> F { // SAFETY: @@ -625,10 +626,10 @@ pub unsafe fn field_read(&self, field: = *const F) -> F { /// /// # Safety /// - /// This must be called from the [`dma_write`] macro which ensures tha= t the `field` pointer is - /// validated beforehand. + /// This must be called from the [`try_dma_write`] macro which ensures= that the `field` pointer + /// is validated beforehand. /// - /// Public but hidden since it should only be used from [`dma_write`] = macro. + /// Public but hidden since it should only be used from [`try_dma_writ= e`] macro. #[doc(hidden)] pub unsafe fn field_write(&self, field: *mut F, val: F) { // SAFETY: @@ -684,18 +685,18 @@ unsafe impl Send for C= oherentAllocation {} /// unsafe impl kernel::transmute::AsBytes for MyStruct{}; /// /// # fn test(alloc: &kernel::dma::CoherentAllocation) -> Result= { -/// let whole =3D kernel::dma_read!(alloc[2]); -/// let field =3D kernel::dma_read!(alloc[1].field); +/// let whole =3D kernel::try_dma_read!(alloc[2]); +/// let field =3D kernel::try_dma_read!(alloc[1].field); /// # Ok::<(), Error>(()) } /// ``` #[macro_export] -macro_rules! dma_read { - ($dma:expr, $idx: expr, $($field:tt)*) =3D> {{ +macro_rules! try_dma_read { + ($dma:expr, $idx:expr, $($field:tt)*) =3D> {{ (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::item_from_index(= &$dma, $idx)?; - // SAFETY: `item_from_index` ensures that `item` is always a v= alid pointer and can be - // dereferenced. The compiler also further validates the expre= ssion on whether `field` - // is a member of `item` when expanded by the macro. + let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; + // SAFETY: `try_item_from_index` ensures that `item` is always= a valid pointer + // and can be dereferenced. The compiler also further validate= s the expression + // on whether `field` is a member of `item` when expanded by t= he macro. unsafe { let ptr_field =3D ::core::ptr::addr_of!((*item) $($field)*= ); ::core::result::Result::Ok( @@ -705,10 +706,10 @@ macro_rules! dma_read { })() }}; ($dma:ident [ $idx:expr ] $($field:tt)* ) =3D> { - $crate::dma_read!($dma, $idx, $($field)*) + $crate::try_dma_read!($dma, $idx, $($field)*) }; ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> { - $crate::dma_read!($($dma).*, $idx, $($field)*) + $crate::try_dma_read!($($dma).*, $idx, $($field)*) }; } =20 @@ -728,32 +729,32 @@ macro_rules! dma_read { /// unsafe impl kernel::transmute::AsBytes for MyStruct{}; /// /// # fn test(alloc: &kernel::dma::CoherentAllocation) -> Result= { -/// kernel::dma_write!(alloc[2].member =3D 0xf); -/// kernel::dma_write!(alloc[1] =3D MyStruct { member: 0xf }); +/// kernel::try_dma_write!(alloc[2].member =3D 0xf); +/// kernel::try_dma_write!(alloc[1] =3D MyStruct { member: 0xf }); /// # Ok::<(), Error>(()) } /// ``` #[macro_export] -macro_rules! dma_write { +macro_rules! try_dma_write { ($dma:ident [ $idx:expr ] $($field:tt)*) =3D> {{ - $crate::dma_write!($dma, $idx, $($field)*) + $crate::try_dma_write!($dma, $idx, $($field)*) }}; ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> {{ - $crate::dma_write!($($dma).*, $idx, $($field)*) + $crate::try_dma_write!($($dma).*, $idx, $($field)*) }}; ($dma:expr, $idx: expr, =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::item_from_index(= &$dma, $idx)?; - // SAFETY: `item_from_index` ensures that `item` is always a v= alid item. + let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; + // SAFETY: `try_item_from_index` ensures that `item` is always= a valid item. unsafe { $crate::dma::CoherentAllocation::field_write(&$dma, i= tem, $val) } ::core::result::Result::Ok(()) })() }; ($dma:expr, $idx: expr, $(.$field:ident)* =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::item_from_index(= &$dma, $idx)?; - // SAFETY: `item_from_index` ensures that `item` is always a v= alid pointer and can be - // dereferenced. The compiler also further validates the expre= ssion on whether `field` - // is a member of `item` when expanded by the macro. + let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; + // SAFETY: `try_item_from_index` ensures that `item` is always= a valid pointer + // and can be dereferenced. The compiler also further validate= s the expression + // on whether `field` is a member of `item` when expanded by t= he macro. unsafe { let ptr_field =3D ::core::ptr::addr_of_mut!((*item) $(.$fi= eld)*); $crate::dma::CoherentAllocation::field_write(&$dma, ptr_fi= eld, $val) diff --git a/samples/rust/rust_dma.rs b/samples/rust/rust_dma.rs index 9c45851c876e..7a87048575df 100644 --- a/samples/rust/rust_dma.rs +++ b/samples/rust/rust_dma.rs @@ -68,7 +68,7 @@ fn probe(pdev: &pci::Device, _info: &Self::IdInfo) = -> impl PinInit) { dev_info!(self.pdev, "Unload DMA test driver.\n"); =20 for (i, value) in TEST_VALUES.into_iter().enumerate() { - let val0 =3D kernel::dma_read!(self.ca[i].h); - let val1 =3D kernel::dma_read!(self.ca[i].b); + let val0 =3D kernel::try_dma_read!(self.ca[i].h); + let val1 =3D kernel::try_dma_read!(self.ca[i].b); assert!(val0.is_ok()); assert!(val1.is_ok()); =20 --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011051.outbound.protection.outlook.com [52.101.62.51]) (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 4036F3271FD; Fri, 30 Jan 2026 08:35:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762138; cv=fail; b=IU54KR1Ni0fV4t1mm/Zi17QEwe/K8ApT9DJaXyHGnlccHQEfE6HKuSk1Zgeiqo5a9eju6Bk9sXu8AnG4cq+owQmiW5cyOxZ73Gn7MaHDSgO8TQcRJLudgRSGfzznV87F2piHleAFc/+xbOrksSe8lai//KeROwwX5fDSwL6kl5g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762138; c=relaxed/simple; bh=QMbjE2U+lzgW5rFO3dsmt55VETLhk5PdN8u8R+EY/qg=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=B2KApAXDH6jj2hQHeaZbaITKK1xrVE5TiPmzwS2GJWnWWtWvXILnq18GTy9zP3+YUmiw1npAvx9IQ3LiAUlqmeVXErSIOMXmq2fgZ+V4C2S+/8439JnobgSpoosgKgPJe6yVzfzs+wl+uDzGaAGHhiz5rXx0v1Mu6sqXZVRKrPA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=X7zJqADw; arc=fail smtp.client-ip=52.101.62.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="X7zJqADw" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=r0rBbkQ2vO10ZuxdbxCrDDwX6tcKGdmn/IAmHvcDH26mK2A/CJdRjSsD2UNM2Goduz/NOptRvPrbIFyZreG5xj2uX5vZoryrfOJhQG1dNo+pWRwZhYc/tO313MA67uoK4cG3lyQWKbBhCNkrqStGXFP7VUjysE3zwtBbxcdSOuPn47yr04amOcU3qeDqONDUdrwv1sVpHGpnAttfUTuP/2kToofeWG3QIR4SLt+oc8Wpq7yw/bNA/weeGICu34eSoeHfLU1TQk3IzSdB4kpzkPCkWbH57AtXE7OGTgcoW3nhXkbrUR4E4PCf8PamkAIvS8uG/RcUSPsVeMnLRNBRsg== 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=0PVSLl84T6R4bkcOBRJEdC3f6ytQAkcWCVq/xY9WxCY=; b=bEgAE3ZdF7wX2nUUhYBZDABwyrH2XME8ZQVGWTajwkp4ExGb/++o6BIFMnDHC+FywFwpRtCH14ShNepCMHh8p1Gf4Ev76J7HyfrXaMKok8lnvAY58vh+kBksd0DlvyKwn4OOgQdbDF1xZvUXRThGX8DM53ZoeXq8gZt/2zvxaR5nS4uX5rV19tz8pCKGhDo3CQdktglMLOuZoD5Prkzh+I2KwO704kmOgdGs8CVF8iWikJUc7UrtWImJDtr0oiqstG6/j0qh8/L4Mk0NztopPY+oPBs63im/SnHrpsmAidwjnCD5/+oSpQphX0j6SSroAQNnzMUhmyNSMc15aFZZoA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0PVSLl84T6R4bkcOBRJEdC3f6ytQAkcWCVq/xY9WxCY=; b=X7zJqADw9TZ1vnO9pec+CqaJZfzB/nWifZ5EuMtLKzdKt9yPlgXQtGM5g+crAF5wWTj/1m4aL9tNMdraFLN39wg3YLPFlKwW78El6VawNvtW57Q0X+wdL8jOKhbIHXVJk4xpZ+V6Su+h7JX6B3CsWJDQZn78ONJpCOacPTkui8NhRaWHPreBqqULs6Ia/bxjmraqKFWTc3Ivr3VE/vtqvZoZn/5Lbqe2b3srCR9g9B0ZI4RxnyXYXA7dYcZxTV6ifO3Vy4LKGUV619kh/Sk7f2vM7GKb0Usl7W42EGUqBQRNtfN9PuESA25T4xpkAnpkJBa8njqz0/hLrFug49jPWQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by DS0PR12MB9400.namprd12.prod.outlook.com (2603:10b6:8:1b6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 08:35:31 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:31 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:05 +0900 Subject: [PATCH 2/9] rust: dma: parameterize CoherentAllocation with AllocationSize Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-2-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: BL1PR13CA0410.namprd13.prod.outlook.com (2603:10b6:208:2c2::25) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|DS0PR12MB9400:EE_ X-MS-Office365-Filtering-Correlation-Id: fb1bc477-8c91-4b88-7470-08de5fda877e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Q28rMHU4NHRqdDA0SVlxN0xlU01KUVVvTVVMaFJXS2N3THRqSVFQNWhjcVk5?= =?utf-8?B?dnpPUVNnRzJ6TmVlMUI2SU8xeVhHNHZDbkpEL05yWjNFdWtXZVhRMGZOMUtS?= =?utf-8?B?ek5xR1AvSG5rTVI5VWVrOWZTNHBqQ2g4WFVDdit2Y0xVQXBBMXh3UGZnL0tZ?= =?utf-8?B?bGdwVHpmTUwrdG9OcmFtc25ZMXFlL1FLamRtbklqaW02TDZUV1VZUWdPbnkr?= =?utf-8?B?SUhJd2hwWElUcTBQeDdPaEpDZE8xaTlWV1lnTkd4SURMY0p6VVp2UU83UWkv?= =?utf-8?B?TldsREdITzN3TDF5ZExJK2g3KzIwTmJGd1IrTy8vT0p2VUlvenQ4ZU9mdEJt?= =?utf-8?B?eG14TGVPcHJZQjdrbU9DaE54K2FYMjV2bjV0WHJIQ1FBbVRCa2NqUlQ1aHhQ?= =?utf-8?B?cmZzLzl2RUFYR2IvL0krZ2VWWlQ1OWlyaHkxM3l0VDRTb1hiUnJuSmdmSVNO?= =?utf-8?B?UDVZVVVHRHMxdGZaTHYxMi9oMTJWM2w1T0RobnZYTjFkOG41eTY2Ym5Eck10?= =?utf-8?B?NDBGLzEzZUliMDhsYmprTUdJeE5wWEVSWjBTb050d1ZEU1BEVnVyenhHWG9S?= =?utf-8?B?S2pSdy9PTE5YRWtiN1JVUnozdEpXdEFjWXRtb05TNnJkb3pMWGJTY0UrM2NO?= =?utf-8?B?bno4N1BLZy9IRVFwd2l5QWhZWVZBa1Nqd0xkWHJhTXJydjZLOWlTQW1tMGNw?= =?utf-8?B?MEtJdEd1aExOaHg1VUdTaGFRTVA5ZVkzRHRVa1FKWFBsdG1QckZCN1kxZnZz?= =?utf-8?B?TlFIeVpKd2VUdDFVT0VWRWlLMnJhdjVtdXhEUW1EN1YzYkNRRG95WkNUVWc4?= =?utf-8?B?ZVpDMWdOSXNidjZQaGphR3Q1ZXNNeGh6K3RjWVIydCtYNE9KUEhmY3ZacS9N?= =?utf-8?B?dHZlOE56Z0gzVWJzT1BuSHlleE82ZEhpd2pFajJYd0s3RjRQN0p4WnZlNU5L?= =?utf-8?B?UWZLZUMxRkJOTkVGenJ6NnlzeXlONGpnWmZ2bjZmZk1Zc3FWeEh2UEpkWGtX?= =?utf-8?B?REtJY051bTFqdnV4eUFjUVJCNzVKb1NxVGpKSG1DbjFqRjFudUNWQnQ1Vm93?= =?utf-8?B?OGpxUkFDT3N3YVNkUFU2WGN5YTdndi9kQUJaN2JQS3JaN0FtUjZ6U2F5RlJN?= =?utf-8?B?YWgvODgxK25GckRKSGhwOXkvTTFlNkNkSE10M1B2c0pvNmJlQTZLMmZjYUFP?= =?utf-8?B?TGZvVFZ4VVJGbzcwREhPWTlxcU1ZaWQrVHp5UWFQaU9UT3Q4SjZzN0JMbFlB?= =?utf-8?B?N0ZRbUI1Vkk0ZGFvUWdWc2pYZ1YwRzNsbERYMnJQSkhpZDJJZDFZaTcrdnRy?= =?utf-8?B?b3hJMURJeFVMeUhyMThsZmRaM01nZ0RZUHA5MksxL01CbG5nUFFGcGpob0ow?= =?utf-8?B?ZCtWNThISzlhRGVNdlEzTDNBUzZZTXBkUWZLZkl0LzNpeXVkY0tmT2x2S3Aw?= =?utf-8?B?cTQ0WVZ2cFRCb29lUkJOVytuQkk4d01nR3RXaHlNZHNieU4yNGJOVHFINXVY?= =?utf-8?B?bmlQNkovU01LN0wxY25uZEs4bDE1Z2dsUnlSL21mVHY1ZFBPWFlBaitaczlV?= =?utf-8?B?bk9LeUtYT0NmUmY1aEI2TklBa3VLVzAvTUtLQitiVHl0N2R3SEEyMFllR3hu?= =?utf-8?B?STVYWUpxTGFRSTdvWi84dCtmQzdkNjJHU2ZmNEsxZlhyWWdTdktEN0NMTnF2?= =?utf-8?B?RUhzUDRQZzZtSStoU0R2L2dhSzUyQnRHd3pSM3p1eEMxdEFEemlRSFJnOERK?= =?utf-8?B?bTF3WloxdTY3Sm94UkwrMzYzcmR4TWZvUGVvbjg0RnpwaWkzWkR3MUxQd1hx?= =?utf-8?B?TExhSmtvMTRXNlFPb25NM1NhbWt6bVQxRTRHTkViUk9xclg2bnhreUVNTFBu?= =?utf-8?B?cEhyUmlHZUV2aVVwZjZaMFlJYktlYXowdGc5UGE5Zm1ET2tMV29YTVZxUERN?= =?utf-8?B?eTJlcHdlSFQyRTkwWFlQWWxsNHJzaVpqbWFPbzdHMGlRWHVETjJWUVNpUmZS?= =?utf-8?B?SCtSWTc1V1Y0RTZIYzgrQ2YweFF0aHlqTUZueUpiWGdMSlNQak5tc1R1UmZx?= =?utf-8?B?UHlKb3gzdXF6Nng4OUxUeC9HWlZ1Vm96M2grWE5pdUNFMTJweUJ6c2ZBM2Jr?= =?utf-8?B?bTgwdmxob1d2c0gxekg5UkZ2ZS9HajkxOFc1U25jcHFmVFZtNmMwbldRVTV1?= =?utf-8?B?MXc9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?THZtZzl6Kzhua3AxbXpTS2lLRFVMZ3NxWlRQZUJYSVBoNTdOQ3lYaUw5eVlv?= =?utf-8?B?ZHZRSlRLZ3JmZFVSZFV2VnFYaGxleDY2Nnl6c3dzWVpkRzV1a2lodWx5bExI?= =?utf-8?B?cmVSOUY0UTY5L0I1S0xmOTFOTnZkUHhwbHpXc3dFNXhHOG4xVWJWSUVKTXNz?= =?utf-8?B?WkNCdklhYWFGcU9ZSzR4K0wwUXVxLzZaeGxtK0g1UW10eFRsVWRLTE8wWnhh?= =?utf-8?B?eGVRRGNwWDZDOWJPSVZhZGR2SVJpbFQ0VHlyQnpXdFEzbWVBTE1ERDFXb1Zm?= =?utf-8?B?V00wcklLU09sNE4vRmF4bUgvaFVXMG9tRHltRE9pLy9GVmwzTHdJQ0gzYjY2?= =?utf-8?B?STdnc3d4Z1E5MUQrcTBpRHg5bERCVk5BZU9JMzM2S3BsUVljd0M0K0g1ZGlN?= =?utf-8?B?VCtQVlFreHoweDZ4ZUNQMy8vb0ZoMFFXRmFaNjRyeFRFd0ZSYVVJSkJiSzBt?= =?utf-8?B?QTRaNVhoRlRHb2taZ1BxQVlHeFNWSlRNQXJIUjVnTno1Wk1HNTBkNXkySnBJ?= =?utf-8?B?cnZIZDc3ODhGRGJsdm9yQ0NUdndZMzBXTDZzbUoxd3ZQelVZZ0tpcFdMSi9o?= =?utf-8?B?aTBEeWhITUVMQWUraHVuclBpdkVRVU5zdkQ3Y1I5Yk43cnJFVGxDSFVwY0F6?= =?utf-8?B?Wm4vczNFY09KcDhKQjY5UERIQWpPbERNQk0wZHI2SURwWDh0RDZ1Y3ZmUmhz?= =?utf-8?B?Y2JyZ3RFaVpYNW9yU1UwN1c2dFk4QlF2M0xrdnVWVGZRV0k4ODAvN0FRSDRa?= =?utf-8?B?cEpxRTJXc1JuakhMSVJUWlRhUHZRMS9xUXgyVjZNR3BkVzZtZlc2cVdLa3Vq?= =?utf-8?B?bWdoNVNOd2pxdmFQdW5BQXE4dXFxeFdEKzJ3Sk1RTjZiTUN4b0RyTDRoN1Fj?= =?utf-8?B?MS9Pb0VzOW51b1JqSmMyVHE0Mnk4aTZMMDVVZnhiZ3pIdk1QTDNFWGs0MERK?= =?utf-8?B?R2xmRnZjYkxZdzZzQzBBUHA0SkVJSGtvaUhmWjZ3SzBpSlBjaDFtakpuMG9F?= =?utf-8?B?SDMzck43Q21EZjY1VEJDK0VpZGh1RlpaQUhoK2c2bHdLVFhHdWFCbFI0L1RY?= =?utf-8?B?cjlRM2xQZmQyalFaQVc1L0xKVFphbElGd2hYelRDMlplVEJSQ0tQZWpzWXBv?= =?utf-8?B?VnIwUW9JK3NjZXdYMWw0c1o5ekdVa2lyWk5rQ2c2dmJwK2NveHl2bUpkcFNC?= =?utf-8?B?QWwyNFJhMEF1M3dyN2dnZmx3TnJ4UHIzRDByYlFETWhORW1kKzEvMERGSExX?= =?utf-8?B?Rkt4d01ld1ZrRVlZQStsNWVPZ29iaHBLMmJrMGpsRGNsZlpycWFzejhlMW85?= =?utf-8?B?SDVVUTBCYWhwMHNDY2JXUnRCRi9UWE9ndFlwVFNzdkNaTFdBUFhmMGxRdC9i?= =?utf-8?B?VjgyUktUREtISWsveE5ORDQrWDBzWWRtYlRkUEFaRWxFNWxUdUloNllXR2RN?= =?utf-8?B?Q0xUc0Z5T2NDZ2NpVC9qV2dyMjJ2dGtabnRMYUVETVI5MnpPU1RFVGlsd0du?= =?utf-8?B?Z0UvNEkzdk1ZSk1YazhvcXdBbG9pNWlQZUZGS0ZyOG5oU1RtREd6d2RTSnBx?= =?utf-8?B?bDNwZ0lJK2svRnBnaE5ybFVlUEcyK3UxSFZjcVB0NnpKM2MxZjBLZEt1U1RQ?= =?utf-8?B?Nk5mVHRhWk9ST2gxM0IzK2ZWT3FzeDUySnJjMnFLaStpeEdLUk0rQzdxK1VR?= =?utf-8?B?ZXVnRGlLekpjaEwzYnhSNjU3ZHY1a1NQWE9VWG9KWlpZRWx5emp6enZsOGU1?= =?utf-8?B?N1JsbTBlaDhHODdTQjdhUjBXR0VDMjZRa2x1c2xSS0h0THUrdnNtUjhRQkdu?= =?utf-8?B?MCtEVVExdGFYaXowdFp3M2tMZG9JcnJlNzd0Z2pSb1JOQkMyRHNBR05WbE8w?= =?utf-8?B?RERtMStkblZINmNQTjRNaGsyZW9hTW4raHlYbTd2MVNBYWNhQmhMSWNsUHBK?= =?utf-8?B?ZXlNWStDTTZsKzNtcEZFNXQ2YU9aWlJYcldTa2VBaHNaU3FVcHJDUFdvUW9K?= =?utf-8?B?cmpKNnErOVpvenZLVDRIVDlsVURRTDZTb0tHd2VOTGxWY1RRYkhwenhkV1Ro?= =?utf-8?B?b2FML2tpK1dPTjhiS0RjT3BESzIvbldxVDRmRlAyb09TaS94L3lBQTh5Rmpv?= =?utf-8?B?dmh5aEtMN2RSV1BCenUra3hKYUZxZVJiaElhSWpDc0lyMTdCVkxyYjBJUkNp?= =?utf-8?B?dWJLMUNQVTZoQVRNZlVXSVF6NjhSQjY3UGY3WjM2ZllnYmlhN0dVcmZjbWww?= =?utf-8?B?dFIrVndpWG91ZGFxTDR6QnZhdWhMb2gxN0I2SStkWTFCQWtHNkZQcldXSWtt?= =?utf-8?B?R0JzTWhHcHNYZjBEekRKMWZWMWFMSXlYcGNjdENraXIrMTUzZ1QxaU5PclFL?= =?utf-8?Q?EJa9KT9GdhIbHeeEdZsn/iPjHpa2TX8LAaKi3iqj0DmWk?= X-MS-Exchange-AntiSpam-MessageData-1: Xz40MZ/xyFuUMw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: fb1bc477-8c91-4b88-7470-08de5fda877e X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:31.6513 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QIRXtNaF0R7/GcnAQQaObxgGHugWhcidZyChaHbQ2LIwJqcDrhxJQr4EW+XaIaeFecjYEJcVHYWHo6vCCOIHwQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB9400 Parameterize CoherentAllocation with AllocationSize. This lets it carry information about whether it knows its size at compile time. This follows a similar design to Device and DeviceContext. This is useful to be able to read/write without having to handle a Result, and to move indexing errors from runtime to build time. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 185 +++++++++++++++++++++++++++++++++----------------= ---- 1 file changed, 117 insertions(+), 68 deletions(-) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 02321d5f3f06..6e6d91a9cd62 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -12,7 +12,7 @@ sync::aref::ARef, transmute::{AsBytes, FromBytes}, }; -use core::ptr::NonNull; +use core::{marker::PhantomData, ptr::NonNull}; =20 /// DMA address type. /// @@ -344,6 +344,29 @@ fn from(direction: DataDirection) -> Self { } } =20 +/// Marker trait for the size parameter of a [`CoherentAllocation`]. +/// +/// [`AllocationSize`] is a marker trait for the size parameter of a [`Coh= erentAllocation`]. +/// +/// The specific types of size are `RuntimeSize` and `StaticSize`. +pub trait AllocationSize: private::Sealed {} + +/// Marker type for a [`CoherentAllocation`] with a runtime-determined siz= e. +pub struct RuntimeSize; + +/// Marker type for a [`CoherentAllocation`] with a compile-time-known siz= e of `N` elements. +pub struct StaticSize; + +mod private { + pub trait Sealed {} + + impl Sealed for super::RuntimeSize {} + impl Sealed for super::StaticSize {} +} + +impl AllocationSize for RuntimeSize {} +impl AllocationSize for StaticSize {} + /// An abstraction of the `dma_alloc_coherent` API. /// /// This is an abstraction around the `dma_alloc_coherent` API which is us= ed to allocate and map @@ -361,6 +384,12 @@ fn from(direction: DataDirection) -> Self { /// region. /// - The size in bytes of the allocation is equal to `size_of:: * coun= t`. /// - `size_of:: * count` fits into a `usize`. +/// - If parameterized by `StaticSize`, then `count =3D=3D N`. +/// +/// # Allocation size +/// +/// [`CoherentAllocation`] is generic over an [`AllocationSize`], which le= ts it record a compile +/// time known size (in number of elements of `T`). // TODO // // DMA allocations potentially carry device resources (e.g.IOMMU mappings)= , hence for soundness @@ -373,79 +402,19 @@ fn from(direction: DataDirection) -> Self { // // Hence, find a way to revoke the device resources of a `CoherentAllocati= on`, but not the // entire `CoherentAllocation` including the allocated memory itself. -pub struct CoherentAllocation { +pub struct CoherentAllocation { dev: ARef, dma_handle: DmaAddress, count: usize, cpu_addr: NonNull, dma_attrs: Attrs, + _size: PhantomData, } =20 -impl CoherentAllocation { - /// Allocates a region of `size_of:: * count` of coherent memory. - /// - /// # Examples - /// - /// ``` - /// # use kernel::device::{Bound, Device}; - /// use kernel::dma::{attrs::*, CoherentAllocation}; - /// - /// # fn test(dev: &Device) -> Result { - /// let c: CoherentAllocation =3D - /// CoherentAllocation::alloc_attrs(dev, 4, GFP_KERNEL, DMA_ATTR_N= O_WARN)?; - /// # Ok::<(), Error>(()) } - /// ``` - pub fn alloc_attrs( - dev: &device::Device, - count: usize, - gfp_flags: kernel::alloc::Flags, - dma_attrs: Attrs, - ) -> Result> { - build_assert!( - core::mem::size_of::() > 0, - "It doesn't make sense for the allocated type to be a ZST" - ); - - let size =3D count - .checked_mul(core::mem::size_of::()) - .ok_or(EOVERFLOW)?; - let mut dma_handle =3D 0; - // SAFETY: Device pointer is guaranteed as valid by the type invar= iant on `Device`. - let addr =3D unsafe { - bindings::dma_alloc_attrs( - dev.as_raw(), - size, - &mut dma_handle, - gfp_flags.as_raw(), - dma_attrs.as_raw(), - ) - }; - let addr =3D NonNull::new(addr).ok_or(ENOMEM)?; - // INVARIANT: - // - We just successfully allocated a coherent region which is acc= essible for - // `count` elements, hence the cpu address is valid. We also hol= d a refcounted reference - // to the device. - // - The allocated `size` is equal to `size_of:: * count`. - // - The allocated `size` fits into a `usize`. - Ok(Self { - dev: dev.into(), - dma_handle, - count, - cpu_addr: addr.cast(), - dma_attrs, - }) - } - - /// Performs the same functionality as [`CoherentAllocation::alloc_att= rs`], except the - /// `dma_attrs` is 0 by default. - pub fn alloc_coherent( - dev: &device::Device, - count: usize, - gfp_flags: kernel::alloc::Flags, - ) -> Result> { - CoherentAllocation::alloc_attrs(dev, count, gfp_flags, Attrs(0)) - } +/// A coherent DMA allocation with a runtime-determined size. +pub type CoherentSlice =3D CoherentAllocation; =20 +impl CoherentAllocation { /// Returns the number of elements `T` in this allocation. /// /// Note that this is not the size of the allocation in bytes, which i= s provided by @@ -644,10 +613,87 @@ pub unsafe fn field_write(&self, field: *= mut F, val: F) { // the UB caused by racing between two kernel functions nor do the= y provide atomicity. unsafe { field.write_volatile(val) } } + + // Allocates a region of `size_of:: * count` of coherent memory. + fn alloc_impl( + dev: &device::Device, + count: usize, + gfp_flags: kernel::alloc::Flags, + dma_attrs: Attrs, + ) -> Result { + build_assert!( + core::mem::size_of::() > 0, + "It doesn't make sense for the allocated type to be a ZST" + ); + + let size =3D count + .checked_mul(core::mem::size_of::()) + .ok_or(EOVERFLOW)?; + let mut dma_handle =3D 0; + // SAFETY: Device pointer is guaranteed as valid by the type invar= iant on `Device`. + let addr =3D unsafe { + bindings::dma_alloc_attrs( + dev.as_raw(), + size, + &mut dma_handle, + gfp_flags.as_raw(), + dma_attrs.as_raw(), + ) + }; + let addr =3D NonNull::new(addr).ok_or(ENOMEM)?; + // INVARIANT: + // - We just successfully allocated a coherent region which is acc= essible for + // `count` elements, hence the cpu address is valid. We also hol= d a refcounted reference + // to the device. + // - The allocated `size` is equal to `size_of:: * count`. + // - The allocated `size` fits into a `usize`. + Ok(Self { + dev: dev.into(), + dma_handle, + count, + cpu_addr: addr.cast(), + dma_attrs, + _size: PhantomData, + }) + } +} + +impl CoherentSlice { + /// Allocates a region of `size_of:: * count` of coherent memory. + /// + /// # Examples + /// + /// ``` + /// # use kernel::device::{Bound, Device}; + /// use kernel::dma::{attrs::*, CoherentSlice}; + /// + /// # fn test(dev: &Device) -> Result { + /// let c: CoherentSlice =3D + /// CoherentSlice::alloc_attrs(dev, 4, GFP_KERNEL, DMA_ATTR_NO_WAR= N)?; + /// # Ok::<(), Error>(()) } + /// ``` + pub fn alloc_attrs( + dev: &device::Device, + count: usize, + gfp_flags: kernel::alloc::Flags, + dma_attrs: Attrs, + ) -> Result { + Self::alloc_impl(dev, count, gfp_flags, dma_attrs) + } + + /// Performs the same functionality as [`CoherentSlice::alloc_attrs`],= except the + /// `dma_attrs` is 0 by default. + pub fn alloc_coherent( + dev: &device::Device, + count: usize, + gfp_flags: kernel::alloc::Flags, + ) -> Result { + Self::alloc_attrs(dev, count, gfp_flags, Attrs(0)) + } } =20 /// Note that the device configured to do DMA must be halted before this o= bject is dropped. -impl Drop for CoherentAllocation { +impl Drop for CoherentAlloca= tion { fn drop(&mut self) { let size =3D self.count * core::mem::size_of::(); // SAFETY: Device pointer is guaranteed as valid by the type invar= iant on `Device`. @@ -667,7 +713,10 @@ fn drop(&mut self) { =20 // SAFETY: It is safe to send a `CoherentAllocation` to another thread if = `T` // can be sent to another thread. -unsafe impl Send for CoherentAllocation = {} +unsafe impl Send + for CoherentAllocation +{ +} =20 /// Reads a field of an item from an allocated region of structs. /// --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011021.outbound.protection.outlook.com [52.101.62.21]) (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 C2BD031AAA7; Fri, 30 Jan 2026 08:35:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.21 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762142; cv=fail; b=d00lAzuS0en0n2Y/EhF1tahXsEm03cILzKBkwrrtQ5QOYdgsglhYBFdWfMwj6pHKMeqzEQ8P33XYJrDyvyVui8gSbcjEdoUp6b6ASm5T6fGW3AH+Q3bGdmxXrLi9F/8qV0wtaPgYXZOexqhAOMjTUpfBrS4J7w8O/nRyOdInnWo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762142; c=relaxed/simple; bh=EANHL0hsrvYBkgQaKdLzeh2Vf47DzJGIUFrikyVV1Bg=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=A4/eFAdmMxJg4pI7rts+FfnP6dqGNF4JixLaJvoE+grikyYbU/PdwUT5ClsF9Yka8UQeiO5st3+DmtrYC9e7b9CiR+OPz0ia+25HK4NX6/8TWGc+ehqPug5jqnZs95xLY/6wiu2KpuAogm9oUzjlAlESVPfhlF+RENB4VtSE8xo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=dUljGZ44; arc=fail smtp.client-ip=52.101.62.21 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="dUljGZ44" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hCb9tYBZLYgZfKfUhXhSOUw445tjS7hFXZqbkSdDcJDu2piiu5CLfqPBDtH5Wo+6sgfQfDWXVbcO2ZcWv6CGOue/bQtD4aaMkYBWRLmNM6KcxgSkmzGzGIY0RhM69p+k/HvRUhFbr+8u1Zrsy606uU0YNLpW721zgXt/T0ukh7NXaIGe0ZPn/CiGA2kctENUH+bXMw1ypp5E9s6bAB1bRimf0iEcAsGe0R18hmx8IRJjL8sddjYF6vq6M0UtUV2CvX7Pp1sh7f7dAnXgGBSIwmE5EsvQtUrfZeJpmWQdg3oyQVfGjr+C1DCtJugbUdazG40+2UmxxFgC6HJbiAJsUQ== 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=9y9ODM4+ldeghrT49aub4SQ57dU9CY/QpzXDKno35mE=; b=XAZEdAJA8/+gCwiBNlVyHsPkeuKxMndd4tzi7EOPgxUk9/dEN7UP996XFVI7W+VjP+gntDaGw2Tooam1x7xtzcfslT4ASBkXWUTKpvFfNjrf4S5jZCzKQ3WY5DpUPc83iRflhbtgdKgbVq+f+9uZeFah5lGYVr6SOc1IbKTzNlUu4iN0DmJ5NEU4JTtlLGBlmK3RCePv35f4QMVYiK8lorMyTwqRrwy8iaWvuEr/pawBcpLhL6wZ3NdHEYb1gXbkOjFGZyhC/JLpPD07WA7CHI+oNeFscfFWvCcb2sW8vYeebt95YE8ZUkSkx5ttXGB/PyI7o8Z3eKjC2VJjAxEdGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9y9ODM4+ldeghrT49aub4SQ57dU9CY/QpzXDKno35mE=; b=dUljGZ44A+iD3N3b0a+2eqX/5wRVRfTlnMYMtCdsMEXQ1HLBHT6ZQeAA8cJ1UbThOwjDaeEAkQ0TQ2rGpBztg+SBdfezq60CjAMU4Zfm3o+8Hr/TIVq4NPxe8R0o3i33hV0bxYHl42CYmWgP+AGzF8x6kqvshMNA6iMtVEDep5tQBLa5ufeelyvV/8np+0D1x6RnVCSNv6wvmruLjgzBetffDhGdDItCCu49qpr7dOQUFcaMzxh6O+5HnIyij0/YscvioE3xoi8JF+a+1XU29XLBZfZMvdbaePWOSbhnRCtJoeiP3TqD4GBtwn6qyCMDWKbK7vq2ry0jCaxL7AIX9Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by DS0PR12MB9400.namprd12.prod.outlook.com (2603:10b6:8:1b6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 08:35:35 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:35 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:06 +0900 Subject: [PATCH 3/9] rust: dma: add CoherentArray for compile-time sized allocations Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-3-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: BL1PR13CA0174.namprd13.prod.outlook.com (2603:10b6:208:2bd::29) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|DS0PR12MB9400:EE_ X-MS-Office365-Filtering-Correlation-Id: 77b79c9b-89d6-45ce-0b26-08de5fda8981 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?eWVXUG84ZGxrWStNWW1CZzNVNlpZMVZFREYyNWZtdjVxM05hRTllV0dkNTlV?= =?utf-8?B?SEE0c3owUGZnZ3lLSFdzZmZsZ0dxWEhaWlJrYW91K2JyREx4UEFweERxUHdo?= =?utf-8?B?UzBZcWxNWk1MQjFOSzZ1VGFrekNhU2FaZFlXY044TDlRdStPdUlmdkZnYUls?= =?utf-8?B?VE1xYlBiUitCYU5wU2RFL0djbU5SRHNWeExlYnVCYWNqWTR2YlJGY00ybzZQ?= =?utf-8?B?ZVAxT0UyVDRYa3NXV09NVlJvKzVVaVExNkRCWGdTODF1SW5ESHVPcTFpSnRZ?= =?utf-8?B?OW5vVHhhMzhXc0o3T3NFNFNxVGlPbThhT2ZVbGZpbjF3STFFRkQ3R0dzQnhh?= =?utf-8?B?YnBsZnhEeFd6NlRFN21aWWRrRUdDdUtEcEdnaytxcDFZZ1F1NWwzRUZPa2gz?= =?utf-8?B?eG1RVjNoQ1c3NFpvSG50UHlpRU9aaVpCSFVOY2MwSVd5UUE1UkxuN3RiTDds?= =?utf-8?B?dDFmV3dLOURzVHJSa3dQQk5LZ1FoendHTk1iZk9leTZMT2RySUpiZnFaZUFY?= =?utf-8?B?M0Y4ZzlhVEtOc1JtV3UwMDNYWmVMWFNiUDlBay9DZVBwYkNXQVNGWU5yc2Zw?= =?utf-8?B?OW00VUpiNUs2amk2YUxqRTJBQ2ZmSDVyUkxGNEx4M3o5QmtyRy9XU3NjSlBW?= =?utf-8?B?WUVVWklCTnNxUFJTaWlLMWZVMlFuTFRSYlJiSHQ4cDJIcHVmd1VOOElWN0Jy?= =?utf-8?B?SkViRHV4WTM2dWpLS05iMW8rNTRyMWZIMnFaTmp2MDIrTGNFSHBBZFR4K0JM?= =?utf-8?B?T3pvcUxBUkYrTDBmRTFZSUsxcVlRNnZtZWNNQjQ2bzVJVkZISXQ1ZjVRYXdr?= =?utf-8?B?YUM1eCtXTkk4RS9qVUNVbWJtQjZITENNSFFJeENlQzR1WHNlTXNjTkRGMmEz?= =?utf-8?B?aEVxTE9aNXVobXZ0TGxNVW42YVhka2E3bE80QS9KTVQvWFVCRmRzY1JmSHVS?= =?utf-8?B?a09OSFpNVTlJdVBXKzJPR3ZCdE15cGc3ZDlmaWFYaGthaGxCNFBmM3NmbVd1?= =?utf-8?B?SFFNQWx4U25UZm52K0w5QmRkNWMyWVJOczlvQVNtS090aVU2cUlmbWlBQkRT?= =?utf-8?B?d1ZRZ01WR1c5R3h6RHh0aTlZVGJmT1JlRWQxeHNoL3duWnZoQUNWd2xXZzZP?= =?utf-8?B?Qm56MHl6WkhmazhYQTNNMXZid3VsM3JqeGF1bkJDU1h1dFJadnpFZkRFSU5F?= =?utf-8?B?NmQ2YksrYk11Q2JqTUFjRW5GR3AzNHZZeFloNXpmNTlXV3JBSVdQWE4zek5U?= =?utf-8?B?SmNnWXc5NWpHTWRxbnRyWGVkajd2ZU9zTW85Ry9rdWNVdldxL2MwS2NtZk4x?= =?utf-8?B?eVZ0eFFQbHlEMEJkVVZhUGdZblppTCsxeTFZWGRpVkdnVGVNaXF6RTJ6NGth?= =?utf-8?B?MTl2WGkxQXR3bVAzNTVBZ3NpbnZNOGVBbVAyc2ZzTDY2ZzFVOC90cXNzSExp?= =?utf-8?B?ZnRFQTd2RFdBalNoR3VXa1VzZzcweWo2OHhDRzBFUGtzOU54THZmdWxYZ25z?= =?utf-8?B?OUp0empUUENVWXZnWlUvVm00Slg1TWJPTGFuZmt5MjhHVS9rRFlBTFZ4dkdP?= =?utf-8?B?MW5PcHJXc29yOEVvNU96SkF5eXRJNUk0Ny9LZG52ME9MZEt4R0FiMmh4d0Z0?= =?utf-8?B?WkxVdWd4RkVRQytIa1BSdjZhU1NhU05PbVJ3L1pXSWt1ZUtjVmdjaFBkM0lP?= =?utf-8?B?cEcyRS9URTFNOUFGSlNuZys4UUw2Mk1aTWFIMFMxOUVXUCtsTXphNlVqU3NS?= =?utf-8?B?RzdjaFFBV3dNVHVWTHVQYTU1amJNTHZrWjN0TU0wZ0JwWWh5TGVmZVRyUklo?= =?utf-8?B?QWVzQkdmVFZubC9rSmtOaE4xUjMrQVVteHBkSmhLd2RET24vdlJPNWVhcGtT?= =?utf-8?B?WHlKV2tSMHRBWGk5cjJqZmtNVVF4WC9xTndrVEIxOUFiZzhOMXNFSk83bUVK?= =?utf-8?B?VTgzcmo4VnhlN1lheEpDKzBZa0R5YjhMa283YmZPWXowa3VQTExCTVo0Q3d5?= =?utf-8?B?REoxazU3R2ROQnFubkJzTm9FRHRNM3FocjFkSUJ4RERZSnJGNG1JMC9IcXJ6?= =?utf-8?B?WlIrc3pnbHN0N2c0cmdJNzJkVjVnS2M0a0JXOWpRWERNMC9zVko5VUJhcWJE?= =?utf-8?B?TU5zTUZjZjVuMy9kb2FLN1JRaVcyMUR1aWdmWEtvU2ZCVWhXQUhFUmhVUEpi?= =?utf-8?B?QUE9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TDZxOFVubGs4YTI5L2ZPazZuVzNldkdkRkc5YnNTeDNZQVFNdkVKaDY5K0dl?= =?utf-8?B?YTl4SE9HcGZoeWdtSlNnTDUrYjNzZlptWkltMkdRUWNXMklMSTh5YTRyNjZZ?= =?utf-8?B?TVYwMXY4aW9GUVRkV090ZnA3WjB0S0p3d2Zwak1DSnkyUFBOZXV1RUlPQkRi?= =?utf-8?B?KzdpTitlajZGYlQrbEJ1cnROODhVTThrT0J5ZlRHckRnbkRMZDkrT0ErcDFL?= =?utf-8?B?R2U4MEhFUTZ0OGErRHhoeXU5bWM2dGFTMzFYTWYyYm05VFJnYlNlOTh2dUlW?= =?utf-8?B?d2tLLzBEZXN5SzZmdXpoL2JWSnM3QVljeWRQN1ozQS9TbkNVWWxwd3RhWW1Y?= =?utf-8?B?eG1jNVgxcFltRlBRM1VSOGZ2RWs2SnRtdzhncTJzR0tjaFhYOU43YmcrT2Ey?= =?utf-8?B?K1Y0NWVLWUplZTYxQ2x5bWtzWFkxam1sV3dYT01sSnZqZ0tBMW5NWVViOEhX?= =?utf-8?B?K1RFUnYvODVtSmtlK0pVRlBmeUZIMisyRVIvZEVMVGdsNTVOZS9EblhTM1lp?= =?utf-8?B?ekhwS2RoNXo1THZ2T2xJUWgyNExnTTg3WGdQUzd3R0Fzb2xJWS9sQVlVdHlp?= =?utf-8?B?RFVnV2Z3RjNNbDA1WHMzOVo4d0ZyNVlFb0RBL0tDSHNRRmFNY1dLdk0xNVVE?= =?utf-8?B?b2d3Mmxjb1lEWWdudElvYmY2QitaeVp6TE9BOEgyeXZGU0Q0RUhlU2F3MjZN?= =?utf-8?B?cUtnZ1ZweGpOSjdPY2ZYcTdJSFhKQjNESlFoaldsTHVSOHRUVlFEbVhjOG9C?= =?utf-8?B?YnlWQkNYd2ExYnExczRLdUtsNDNKN1FmYklFcjM1RHo0eU9aRE1oNWFFNkZN?= =?utf-8?B?U1NlZUlzbzVOTzl3emRDdXFKTUV4cS9HNFhVSkszd01ieG0xckVieEMzemIz?= =?utf-8?B?ZTBwSDRDM3N6aml3T0dUOU9McnpGbGNJOGNjUXczNW5DOTdSc2VSNFY1REsr?= =?utf-8?B?YnNyZjhHRnYrbzl2eW1sWGZKQlFGRFl4ek95SDYrcXFGclBQUjNNS05JV1c5?= =?utf-8?B?YnBrck9wMnEyanpNSnpUSExPSmlOOTY2V1pkRFE0TEg5dTZPVDJkbDkvbTUw?= =?utf-8?B?NVVuME1JM0pxOUY0bmJqU3hTazhTaURYMWx0Tm90SVhDdGZWMEEzY0FkaU9O?= =?utf-8?B?My9iUDJTb2dCZTBURzA0UEJPVWx6aHE1ZnFRckpxcTFLcDNLdUVLT0I4Um94?= =?utf-8?B?Q2p4VHN4QlRRblp1T1dKYkZKcTVZMk5SSnVjU0RiR1MvcXA5SnZ5anUreWxn?= =?utf-8?B?SGpEYUhUNVhPSzZVSnRhbjhsaG1MYUhEbWluRGczdUFibFB6ek5YN2M5R05K?= =?utf-8?B?Wm03TGFJMndFbWNTS3JmOUtBVHVsZFJqbWQ5b3BROGdpU1RqcXVVOVZYSmtS?= =?utf-8?B?cCtpcVBIUjdVZUVpMUtUV2I2Rjh3Z29wcXI0dnV1ZjdvZ3hySmNReC84R1Jq?= =?utf-8?B?cDB5VHlobFZsQk53UkJaNFNmYk12WkYveWJoY2VNUDB4L3hCTzJlZkNYV1hw?= =?utf-8?B?b3l3M3k4elI2eHltaGorM2hYWTYxSnY1YW5lTXdYYmZNNDY0UEtRN1NkMVRR?= =?utf-8?B?OVVnVkhNVGhkcmV5S3laSk9SOXdlWDFGVkZJMllwbGRadWIwSEt3Ky9CS0hu?= =?utf-8?B?RndiL0IrYldXYi9ucG05NkI4aGhlZU9aak5Xc1RTa3Mxdy96NmVHR0ptOWRX?= =?utf-8?B?TForU0ZRbVlxRnpUdW5EUkFFUXRSTldHTHgzeXpMTExneEozUVZMTE95UnAx?= =?utf-8?B?OTN5bG1MSWJzOXJCVXhlZzVpa3lsVThod3NLejZBU3RLc3d0R2JYdXk4eWs3?= =?utf-8?B?WEZXNmkyWVlVeHpRSDNjRW1pbDlkMlg5VXMvdHFjU3FsS0ZhVTh1ZENhN28v?= =?utf-8?B?cHVFTzdpYmh3eXB6ZDJ2Y2NXQlpSYkNlTkNOaFBVQWZhZW9aMHZLOWY1Rmk3?= =?utf-8?B?Z1FJMGtYWHZRTnlKckJIbmJwdXhiamFJZkhFeFAvcjlXK21IWlEyY2Y3bGdt?= =?utf-8?B?MmJGMFJlamVrN2N2RTBTTks0L3lPVzF2cGlrRkZXeThDenVoVy9FamJaN2sr?= =?utf-8?B?REV5WVNPRlF0ZHlJUzRWMzNxZmI5TkRtR3ZSdEdhUUF5Nys2dzFwdktwYVha?= =?utf-8?B?OXFZNk1MSERJOFl1K2FNODl0M1ZvczByajFBdTJ2V2pjd0l0eG9HUXhaaFB2?= =?utf-8?B?cytiWFgwNGZ6ejdlK2xLTWpON2RTa0k2aHRqVjBXbGg0a0tKb1cyZ3BLUHM1?= =?utf-8?B?Q1F4WHMxNEo4MjdTdk04V3pzdXNMOStUWjAzNlBGTUxVUW1saVhNZHRMV3pi?= =?utf-8?B?ck04RXU0RElEaUFiTEtsUiszTURqcGltamVidjFaNktaZVVjZ0lBSDFkVlk3?= =?utf-8?Q?/GhpzDjxoMuoiRB6aUqsvHUDlsbwwV5ci8mbVdt/KN2p9?= X-MS-Exchange-AntiSpam-MessageData-1: 5n8ituzASDtPAg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 77b79c9b-89d6-45ce-0b26-08de5fda8981 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:35.0093 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Dnb4kOo/arHVayXugeHeS7bM+xeRjDuqR50cHltJdIYE3DVA093WapWibECD9ymK7X3JMd2dW/buB55oPzIGTg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB9400 Add a CoherentArray type alias which takes the size parameter directly, without using the StaticSize marker type. This makes it a bit nicer to use. Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/dma.rs | 8 +-- rust/kernel/dma.rs | 127 +++++++++++++++++++++++++++++++++++++++= +++- samples/rust/rust_dma.rs | 8 +-- 3 files changed, 132 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/nova-core/dma.rs b/drivers/gpu/nova-core/dma.rs index f77754f12f02..c217cdb14223 100644 --- a/drivers/gpu/nova-core/dma.rs +++ b/drivers/gpu/nova-core/dma.rs @@ -9,13 +9,13 @@ =20 use kernel::{ device, - dma::CoherentAllocation, + dma::CoherentSlice, page::PAGE_SIZE, prelude::*, // }; =20 pub(crate) struct DmaObject { - dma: CoherentAllocation, + dma: CoherentSlice, } =20 impl DmaObject { @@ -24,7 +24,7 @@ pub(crate) fn new(dev: &device::Device, le= n: usize) -> Result, data: &[u8]) -> Res } =20 impl Deref for DmaObject { - type Target =3D CoherentAllocation; + type Target =3D CoherentSlice; =20 fn deref(&self) -> &Self::Target { &self.dma diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 6e6d91a9cd62..43ed0dfdbc08 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -194,12 +194,12 @@ pub const fn value(&self) -> u64 { /// /// ``` /// # use kernel::device::{Bound, Device}; -/// use kernel::dma::{attrs::*, CoherentAllocation}; +/// use kernel::dma::{attrs::*, CoherentArray}; /// /// # fn test(dev: &Device) -> Result { /// let attribs =3D DMA_ATTR_FORCE_CONTIGUOUS | DMA_ATTR_NO_WARN; -/// let c: CoherentAllocation =3D -/// CoherentAllocation::alloc_attrs(dev, 4, GFP_KERNEL, attribs)?; +/// let c: CoherentArray =3D +/// CoherentArray::alloc_attrs(dev, GFP_KERNEL, attribs)?; /// # Ok::<(), Error>(()) } /// ``` #[derive(Clone, Copy, PartialEq)] @@ -414,6 +414,9 @@ pub struct CoherentAllocation =3D CoherentAllocation; =20 +/// A coherent DMA allocation for an array of `N` elements. +pub type CoherentArray =3D CoherentAllocation>; + impl CoherentAllocation { /// Returns the number of elements `T` in this allocation. /// @@ -692,6 +695,124 @@ pub fn alloc_coherent( } } =20 +impl CoherentArray { + /// Allocates a region of `size_of:: * N` of coherent memory. + /// + /// # Examples + /// + /// ``` + /// # use kernel::device::{Bound, Device}; + /// use kernel::dma::{attrs::*, CoherentArray}; + /// + /// # fn test(dev: &Device) -> Result { + /// let c: CoherentArray =3D + /// CoherentArray::alloc_attrs(dev, GFP_KERNEL, DMA_ATTR_NO_WARN)?; + /// # Ok::<(), Error>(()) } + /// ``` + pub fn alloc_attrs( + dev: &device::Device, + gfp_flags: kernel::alloc::Flags, + dma_attrs: Attrs, + ) -> Result { + Self::alloc_impl(dev, N, gfp_flags, dma_attrs) + } + + /// Performs the same functionality as [`CoherentArray::alloc_attrs`],= except the + /// `dma_attrs` is 0 by default. + pub fn alloc_coherent( + dev: &device::Device, + gfp_flags: kernel::alloc::Flags, + ) -> Result { + Self::alloc_attrs(dev, gfp_flags, Attrs(0)) + } + + /// Returns a DMA handle starting at `OFFSET` (in units of `T`) which = may be given to the + /// device as the DMA address base of the region. + pub fn dma_handle_with_offset(&self) -> DmaAddres= s { + build_assert!(OFFSET < N, "Offset is out of bounds for the allocat= ion."); + + // INVARIANT: The type invariant of `Self` guarantees that `size_o= f:: * N` fits + // into a `usize`, and `OFFSET` is inferior to `N`. + self.dma_handle + (OFFSET * core::mem::size_of::()) as DmaAddre= ss + } + + /// Returns the data from the region starting from `OFFSET` as a slice. + /// `OFFSET` and `COUNT` are in units of `T`, not the number of bytes. + /// + /// For ringbuffer type of r/w access or use-cases where the pointer t= o the live data is needed, + /// [`CoherentAllocation::start_ptr`] or [`CoherentAllocation::start_p= tr_mut`] could be used + /// instead. + /// + /// # Safety + /// + /// * Callers must ensure that the device does not read/write to/from = memory while the returned + /// slice is live. + /// * Callers must ensure that this call does not race with a write to= the same region while + /// the returned slice is live. + pub unsafe fn as_slice(&self)= -> &[T] { + build_assert!( + OFFSET + COUNT <=3D N, + "Range is out of bounds for the allocation." + ); + // SAFETY: + // - The pointer is valid due to type invariant on `CoherentAlloca= tion`, + // we've just checked that the range and index is within bounds.= The immutability of the + // data is also guaranteed by the safety requirements of the fun= ction. + // - `OFFSET + COUNT` can't overflow since it is smaller than `N` = and we've checked + // that `N` won't overflow early in the constructor. + unsafe { core::slice::from_raw_parts(self.start_ptr().add(OFFSET),= COUNT) } + } + + /// Performs the same functionality as [`CoherentArray::as_slice`], ex= cept that a mutable + /// slice is returned. + /// + /// # Safety + /// + /// * Callers must ensure that the device does not read/write to/from = memory while the returned + /// slice is live. + /// * Callers must ensure that this call does not race with a read or = write to the same region + /// while the returned slice is live. + pub unsafe fn as_slice_mut(&m= ut self) -> &mut [T] { + build_assert!( + OFFSET + COUNT <=3D N, + "Range is out of bounds for the allocation." + ); + // SAFETY: + // - The pointer is valid due to type invariant on `CoherentAlloca= tion`, + // we've just checked that the range and index is within bounds.= The immutability of the + // data is also guaranteed by the safety requirements of the fun= ction. + // - `OFFSET + COUNT` can't overflow since it is smaller than `N` = and we've checked + // that `N` won't overflow early in the constructor. + unsafe { core::slice::from_raw_parts_mut(self.start_ptr_mut().add(= OFFSET), COUNT) } + } + + /// Writes data to the region starting from `OFFSET`. `OFFSET` is in u= nits of `T`, not the + /// number of bytes. + /// + /// # Safety + /// + /// * Callers must ensure that this call does not race with a read or = write to the same region + /// that overlaps with this write. + pub unsafe fn write(&mut self,= src: &[T; SIZE]) { + build_assert!( + OFFSET + SIZE <=3D N, + "Range is out of bounds for the allocation." + ); + // SAFETY: + // - The pointer is valid due to type invariant on `CoherentAlloca= tion` + // and we've just checked that the range and index is within bou= nds. + // - `OFFSET + SIZE` can't overflow since it is smaller than `N` a= nd we've checked + // that `N` won't overflow early in the constructor. + unsafe { + core::ptr::copy_nonoverlapping( + src.as_ptr(), + self.start_ptr_mut().add(OFFSET), + src.len(), + ) + }; + } +} + /// Note that the device configured to do DMA must be halted before this o= bject is dropped. impl Drop for CoherentAlloca= tion { fn drop(&mut self) { diff --git a/samples/rust/rust_dma.rs b/samples/rust/rust_dma.rs index 7a87048575df..97711a99ac8b 100644 --- a/samples/rust/rust_dma.rs +++ b/samples/rust/rust_dma.rs @@ -6,7 +6,7 @@ =20 use kernel::{ device::Core, - dma::{CoherentAllocation, DataDirection, Device, DmaMask}, + dma::{CoherentSlice, DataDirection, Device, DmaMask}, page, pci, prelude::*, scatterlist::{Owned, SGTable}, @@ -16,7 +16,7 @@ #[pin_data(PinnedDrop)] struct DmaSampleDriver { pdev: ARef, - ca: CoherentAllocation, + ca: CoherentSlice, #[pin] sgt: SGTable>>, } @@ -64,8 +64,8 @@ fn probe(pdev: &pci::Device, _info: &Self::IdInfo) = -> impl PinInit =3D - CoherentAllocation::alloc_coherent(pdev.as_ref(), TEST_VAL= UES.len(), GFP_KERNEL)?; + let ca: CoherentSlice =3D + CoherentSlice::alloc_coherent(pdev.as_ref(), TEST_VALUES.l= en(), GFP_KERNEL)?; =20 for (i, value) in TEST_VALUES.into_iter().enumerate() { kernel::try_dma_write!(ca[i] =3D MyStruct::new(value.0, va= lue.1))?; --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011065.outbound.protection.outlook.com [52.101.62.65]) (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 CDC5732C309; Fri, 30 Jan 2026 08:35:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.65 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762146; cv=fail; b=FUFTk70Zyi5TEgIKF7/vaKjttYZHR2DwYsdY+Usf2ZpBz4J/oiVZ/rnEPfwOCJ3feTqSOXWstSaEDxeMRpgk3Q0l9067aczEz495k1Yy3tmEXtIHs3HDUfTIKVpjiEnrSg1hNIQ99ArZpWEPatam/IQRJnsGjvtmxVGWU+XIyPw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762146; c=relaxed/simple; bh=/6uqpPB8eAcBfH8/jAiuMTZpGTV3FkTQwGPh+66h5aI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=SjLt8K/6GG6u/9Q8RqXP8nAPSNJOXU7IHFN5b0UMBrv3dTzE6kC84gL6h1jmZ/EX7xOULnIi2Ke5odhmjSKnf/pMtAv8CZe7fVfegIU+ROUyUN/pDl1gH3q2G7EZvsL5TeymVUPmjcqLmhmvG9oVUDoKSaP0PCVsVSAVzXhAsK8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=stU6yBWi; arc=fail smtp.client-ip=52.101.62.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="stU6yBWi" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VkKOTW55XpeYNxL6COYyn0oBAES3adPc2AlxIHYHGESi4Ji1lim0RUIHFprWyV/pCoZJZc5VU+L/s99T2NOIvzCkICyk0pkJutvljZK/6y/FyeXDPuqKbYY9bMBwOhECoSWXLOwMiKlPtf1oUibzVjD+3mhbeWmPkX20MB89uNjGy8vtx63QdlFhlrslSKarJheXN3QgIx+rzxR3H60ieBoblQCHgKKE5NmXEH08sDir9FGgO/T1s279afmdRB+MAIH3OP1FyeUDXxvckxdUgG4DojLhx1Mp8yu2AO1YaWdHU9JkQmai5g0kB5ZtTwMFf0EGCx1/HBUwRyRmycEaHA== 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=TVoiJdbnxUYzw6TIPr0BSTyC5M9MJM6Z3zq76CCkcNY=; b=RB33+wC8xVxCKAIbF5zHFg+rbWXhD07iBJN/LUEG2tzURG1ECe0Q5CBX8bJeNjDd5STwsae8AVSQwihS6ocUfN+agZQdmyXsQILdDqNuhZrC3Q5Oj+r5HnMfiXeXlMLNpOtsrQ406M8ad2A07HGfDC6qn98BwASNEPNmhP2nyjB/zu2ulMi/Fq9dt2U2ihrssPF3uvbiQOBR/QQgM2YIufOYXCIdictC7EkQJVjtMkWFNP++ZnJ/UkMaIoxXCDa55RvF1svwxGs/8Jv3yU9c0b7rAICr7SXBJFghi3ts8awCg/IeLgLjZXaSNG/vRARr108wg6DTcdGYgGc7zxh03w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=TVoiJdbnxUYzw6TIPr0BSTyC5M9MJM6Z3zq76CCkcNY=; b=stU6yBWiT+PlERjr/IETYxmrgB9dX+BT+uNvZibaaVb/w5lvbBYkXTi6LoppCZA4pkFEF/bUGa5jHuFPVav6TI2bWDN2EvsOVCVRfcqc6K9UodC6Sj3lVoOHzI38uVyTR5X7G/9fLR4IeNKg8BcmW842gBq7veAWGV+/rmGLvtnbXvydh1iU4bmJselMNPPbxMjWzd8sPi4mLsW2Rp0hp4xUO6ThVmn5ybNprSf2VrlzwD1s8XGpKXM5k2/bPftzi562gdUXJH2PPQUC7z7aMqdfR8XeLOuBEaqYhrbanWFj550BIAwoso2DHuSCi5SC6RUSfdTC/+BpHSMj53IF3w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by DS0PR12MB9400.namprd12.prod.outlook.com (2603:10b6:8:1b6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 08:35:40 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:40 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:07 +0900 Subject: [PATCH 4/9] rust: dma: simplify try_dma_read! and try_dma_write! Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-4-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0011.jpnprd01.prod.outlook.com (2603:1096:405:26e::7) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|DS0PR12MB9400:EE_ X-MS-Office365-Filtering-Correlation-Id: 40afdc99-7daa-4454-2c70-08de5fda8c98 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?U2Uvbk1oVDYxWHBueVVER1BQNy9QUUNTQVRKY2FzQmxQUUVvQUxkMnhYcGE5?= =?utf-8?B?V0RSNGo2L0JKaHRCOGdyTG9Ba2ovK2RCUjN2L3IxODQ1UmoxaWNoZXRFMUhp?= =?utf-8?B?bC92SmZWT3hDS2FMUTlMbG04VDRtSm1GUEc5S2NFOVhuZGQ5UjV4V0dKRnNu?= =?utf-8?B?b1RkVFlnQWRneWVsMVZObEhaUEVPMXpTWjYwclp2OUtqVy92ell3cm10Q1hp?= =?utf-8?B?dDhJS0V5MGlaYmFBeUZwcENtQnErMWVOWEZqRU5HTlJ5amdLYkhpVFhYcGtD?= =?utf-8?B?M044bEhGWnZuaDNNM2wzeEk1K1B4cmtSNStiRjdOVlZCU1lRL1Y0ZENadTI3?= =?utf-8?B?ZHR6eXhRQURJWVdvQ0dhMmlGUnZCWGhkQzJGRmNxdnB5YXZMQW9xNHQxV1R5?= =?utf-8?B?djd0TC9LMm9wM2h1Y1NNSmY2d0ozMTFRWnZkNTVOeHczMmZTcnUvSVdwRjlE?= =?utf-8?B?eHdCUjJiajF2anI4bEFuZjZxWlZKdFVLZ0Q4LzBYOHk2a1dNczB2SFdNd2Nv?= =?utf-8?B?Vnk5RlhGOERqUnVTa256YUt1ZmZGOFJYQ0hjWWhFYXJ6NmpjSDkvazZ1Q3A4?= =?utf-8?B?UC95RU5vaTc5MDRxY0l3NGJqNmdmTElVZkcvWjlpSWQyazdjOThtR28rcjJR?= =?utf-8?B?aERrQXkrNGFDU0srd293Q3B1Ujc3ak1xWm5NTjRBL1BTMEFnN2FmbURnSUdS?= =?utf-8?B?RXVxVVNkZ244djZuQUpuNGJxWURiUjVBUmorVGl5aEliK0xGbEdXbGRFbWwv?= =?utf-8?B?TFhaTmRQcVJ0ckttNXVyODNwbFk4cWI5eVhjblh3S1FROWFKKzQrMUR0eFk4?= =?utf-8?B?a1JQSTlZWlBqQjlXTGtOdE5sa1ZlR0lWMGJ1K0dQMVhPSmlTV3F0MVR3dlMx?= =?utf-8?B?L3Bydi9yelh5U1gvbGxPNE0waHE4N1NmSU5SZW5YZC9halR2OVdkTmM1WEtK?= =?utf-8?B?N0xvS1RGczJmUk1MRDdpNkUrVXRnL1pxVWJ4VEdJdWtUd0Rqa3FvVnRKS3Vx?= =?utf-8?B?VjNjdkdhS3VCOENpR3hYb3F3SGdtL0Y1MVRLNGVpUkIzWTFZRDh0dVRkdmJt?= =?utf-8?B?WXdyak9CSzdqYTU4TWVPZzJBOS8xOWhYeTRnNkxsbE9pRk5qQXFnMnU5cytG?= =?utf-8?B?ZVpsV2RZdDlJMVdoc3djY0poQWo1SUhHa2syZXJBRGxvL1p5UTl5NVhFVE0x?= =?utf-8?B?WnRzR2IrcW9ubVFWcTJrNlJQR0dyQzZMQ0Q4ZkdvWVpxT0JpK212V20vMm9Q?= =?utf-8?B?d3d4OVdmZEFER3NPZXhJa2VXSk56dHBTMlEwaDJ3WWFRdHNzZ0hNaUJNSnRl?= =?utf-8?B?azR0VXRnK0J2ZHUzZE1EdW1ZcVFDbm5oSGRXWW5TVUdNSFpMY3I5di9PejdO?= =?utf-8?B?MEtGTjlhYkVXa1lqazVYTHc5eW9iTGdsYWFkOG9EZ1F0WUpYeVhPRVgrMlpO?= =?utf-8?B?N3dsWkpkeXN1QzBOS0MvTWRUS2VtNG8rZlpzVmNISVg2cUVsUmx0dUkwRXZl?= =?utf-8?B?T1pnUHRUQ0R2RDhpT0FENG94ZDFkTkl5VzJvQmUwZzRDVjBxZ1JZMnZ5WDQr?= =?utf-8?B?ZDZ6cmM0OVpzZ0JJTmFiMG1ha2phWExFeW9aKzU4Ry9JZ0RXOW8xSHNvY2M4?= =?utf-8?B?dWVuS2IzSFdiVkJQSkdzSHRSMG5pNXltUW1Gdk1ENkNZOU9Ea0lTWnpFZCtY?= =?utf-8?B?Y3hsSWJ0TDNMMTlrY2EyazNadDdXQTBxVE4xWGZlSjg4L0V6bGFOT3VtcXJ0?= =?utf-8?B?bm0zSThpT2R1NFJOQVQ1eWRTRk1hSnoxNmEvalB3Yy9raHpmM3JPbE1ZTlBC?= =?utf-8?B?NE9icjBDTG1hYTFXak40Vnova3dZVm5QSTl5U0UvMHcwZDdQNE0xc1ZRczJ4?= =?utf-8?B?YWZHQlg4VGx0YWxnNFJRVjlDUU1mMHkzeHNQTTVaaHpZNlJGOEdLU1JOSi9h?= =?utf-8?B?OTB0L0t3NVNwVE1pQnJ5d2tZaXhqM1Z4azYrUjJSYkQ2Mlo2ckF5bnVtdHVM?= =?utf-8?B?NkQ1UjJiQTloRFFoZUFRK2VNajRMaTdVVDd4dzJ6Z3JtZkJJVXYvRVVXQi9x?= =?utf-8?B?cm9FS0ZNZ3FNMUFpYlc0RHZaemdKbmZaTW9JSklOdldDd2dMMnBCOG9tQXBh?= =?utf-8?B?M0dQV1dmcE91aWRZOW43SWNBbXdhQnJOV3lHMjlNS0FqMUZ5WW9valNtRFlk?= =?utf-8?B?SWc9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WTg4R2RjeHIvTFY3THZiTkxjdjlwWDRtd200dEZCZFBES0Yzc01jMEZxdWRN?= =?utf-8?B?M1JzektyQkE3VzBQMFE4eWxta3JQY2VHY2lHRStmeFZyRjRzREdoMUFYa2xS?= =?utf-8?B?UURweERIZE0vWWNETkpEbnJYTWxjeFpLbnBLR09DN3d4T0YyYWFNb3QrMUMv?= =?utf-8?B?NlJFM2VNMGZBMk1jdlBwV3A4c2c0MjdyYndYbUJVcTBkTlhaVTk5OWk1RkF2?= =?utf-8?B?VmErNmluYVVZZnBXUW5POHNmZ0doNkMvUmJOMEVVdXcrd1N3bzZ1UVYya3VK?= =?utf-8?B?WkdhYjNIb2ZwUDJuTk44NGc5Mko4dFVLWlkwWStRbVVnM3FOdWxzOFpmUzJO?= =?utf-8?B?NnJDMnptOENWTWgrblRoUTZNbjdYK3JJbHp2SzZFVWlXSVVpVVZZNW1reUhz?= =?utf-8?B?TUZTc0JocjZ1Vm05OVExYWxCMXJBYTJRK1BsSUNmVEk5clcxcktkdG84RjJN?= =?utf-8?B?Y01OMUlrTEt2OCtXbXZoZDUvcTF3aUdxTDVyUC9jdlFsWGxDK21aalltWkdm?= =?utf-8?B?d2FrbDN1YmJrOStaYUd4RXAwdzVEaHc1QzI1VWtWVThndGtQUGp2SHFweGdR?= =?utf-8?B?Sk9mV2d1K0YrL2lxWEFiQnQ2NDg5MWgwYXByTFhGakR2UGpPd2prS3haVDdO?= =?utf-8?B?ODlmOXVVTzd2WlZRdDZ2elVSSHMwL2FVczl0VHh5MHh6MXg5aXRXZlVCOU0z?= =?utf-8?B?M0NXN04rNWVRcERxQTJjUFpKOEpIVkxjMnoxWUxYR2puNHdFRFdOUnpsd1h6?= =?utf-8?B?V0RoVHU2eENWSUNjdjNkQ1NQT21wK1JYREVyTm9lanJnamdnWEU4dGs5d1lz?= =?utf-8?B?N3Jjc3JXUGFMTW9nY0E1eHVrQTNEczM3cmNyQWdzK1dyZ1hDeFZiZWMzbGli?= =?utf-8?B?dGcxV2dKKy9UQ2FYdUV4b1ljV0VHVWN2VGpOYWxoNnJMRFg0Q3Q1UnV0c3Yy?= =?utf-8?B?V3NVRXNmWXUvM2xtc1JvNTBGSE5zcE5KZmZZR2lwbVA0NGx3Q1l3VkdRTDFn?= =?utf-8?B?a25CdVFWeS9PUGsrZ1FFWjVLK2lKWkpYaU9WOXlEbzNOWjhUUENEbWJSenQx?= =?utf-8?B?NXc2VkxHTnMyWlE3NHc2MFpjZEtwcE5BYW1zTGJYOHNQNkordXZhT1QzRmx0?= =?utf-8?B?K1N1elNJZnp6VTI1N2lzWm92aldKYiszQVAyVHVIYi9OeGxBbm0xWVd5SXE4?= =?utf-8?B?YUFZY3hVTVNWQzROMlZ1QnlxOXBndHUxUlFRb1Npblp1MVlMWklLNHdMMm0y?= =?utf-8?B?OGF3RmRlTlNPclp1ejJqLzJaa0NHU0hwY01ldms3K3pZK1dxSHVEaVpLZVhS?= =?utf-8?B?VWgrTUJPVDREQXUzUEE2OWE1N2p6eDdqRnJDbWU1Q2MxR2YxRC9tbE5YcVNF?= =?utf-8?B?NlRhYmlnVmZvVkxreUNYd2FvTmpnVXFaOGZBL1BYbkdGR0dVK21HY0VKOWdM?= =?utf-8?B?QW1IeDRvbThxeW91c2NyWmZNUW9TZkptOWgyOWlJT2YvbmhpRjZCdVpqaG9p?= =?utf-8?B?Rkc4MUU4cnBMMVp5K29rbkhkeDN5Z00wOWRzNUxhNHVvN25GcGFDOFNYbjQx?= =?utf-8?B?MTFyN1lISDlMSHRuVDBkd0o4SUNZRXQ5cTBXaVMwbElUcExiNTFNa2NwaFFX?= =?utf-8?B?dFRZU0VXbENlVzE3SXQ3QVFpQklWbnBZZkZ5UGJsTnhkdGR6NHhTZ2VvRmhQ?= =?utf-8?B?MTA5WUZOcm52ZVlLemg3YXE1SEtqazcrZzZvT3VMM0txWWNZSDN6WlJjQ2dZ?= =?utf-8?B?TFV5b0xVcUV6NG4xNVBWZm4yeVEvdGFvMHlSU1BOcnUyWUR0NTBjditxTE1U?= =?utf-8?B?ZHg5R25YZE5aeVptbEJoZ3c1Vk4yVjIxQXJ2ekhFOEJqWjJnVUxQSXdTbkh0?= =?utf-8?B?d29JTEhvbU1hVUQzOHJYMHpmMlgvM0YxL1pmbG5jbE5sY083UW5mVEhIMkgv?= =?utf-8?B?M3FYN2RGU2pNY0tIVWU1UUVSekdyM1IyNW5SclFZWWJEL25xQmUzYVRtVVMv?= =?utf-8?B?K3g4MFVhSnRrM0phOVJBb09QMFFRa2hpMmQ2TW9STVFDSVcycEtkcVM3Mm1i?= =?utf-8?B?cjd0NWt3L3dMOWJtdDA5bjRGZ1dZdmx2dWQrR0owaHd4TmtZZGhyTGJzT1FD?= =?utf-8?B?V09GZEFMNXloL3U3N2Vwbjl6cE5RNXpHditlbENGNTZWb1pnSEFjeEZmZXMy?= =?utf-8?B?bjUxdWord0I2dkxBYmFtYTNtQ1lIRTlndnFiZTdISjdFTUJYL1NCNkV0SDEz?= =?utf-8?B?bUZZZVJvZkR3WVp4Ni9SQ3ZkbUFMcjlRWW5WWHRCM0RtOGN1Z0hUSWMwOHdO?= =?utf-8?B?RlJzYmZvOVFqOW1WeWFHZm44RnAxcElhVXFjZEVwK3p6c0tQZmY2WlBWeWds?= =?utf-8?Q?R9S8zdocEJV5SN3F1EP8wOCtEuJmBKCHywzqP+wxo1sAr?= X-MS-Exchange-AntiSpam-MessageData-1: OIVugtY6QO4NzA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 40afdc99-7daa-4454-2c70-08de5fda8c98 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:40.0733 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yWVcvTiJFSNid0ejDlGfV5TijfAVTryHEdz5Muh/Ms35Ad0H0Y5QMOTFt3D5I+t65L1j2x7BbYN9IJZ0u9hgkA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB9400 Remove unnecessary branch and unify branch order. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 43ed0dfdbc08..03fc001eb983 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -875,9 +875,6 @@ macro_rules! try_dma_read { } })() }}; - ($dma:ident [ $idx:expr ] $($field:tt)* ) =3D> { - $crate::try_dma_read!($dma, $idx, $($field)*) - }; ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> { $crate::try_dma_read!($($dma).*, $idx, $($field)*) }; @@ -905,13 +902,7 @@ macro_rules! try_dma_read { /// ``` #[macro_export] macro_rules! try_dma_write { - ($dma:ident [ $idx:expr ] $($field:tt)*) =3D> {{ - $crate::try_dma_write!($dma, $idx, $($field)*) - }}; - ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> {{ - $crate::try_dma_write!($($dma).*, $idx, $($field)*) - }}; - ($dma:expr, $idx: expr, =3D $val:expr) =3D> { + ($dma:expr, $idx:expr, =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; // SAFETY: `try_item_from_index` ensures that `item` is always= a valid item. @@ -919,7 +910,7 @@ macro_rules! try_dma_write { ::core::result::Result::Ok(()) })() }; - ($dma:expr, $idx: expr, $(.$field:ident)* =3D $val:expr) =3D> { + ($dma:expr, $idx:expr, $(.$field:ident)* =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; // SAFETY: `try_item_from_index` ensures that `item` is always= a valid pointer @@ -932,4 +923,7 @@ macro_rules! try_dma_write { ::core::result::Result::Ok(()) })() }; + ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> {{ + $crate::try_dma_write!($($dma).*, $idx, $($field)*) + }}; } --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013058.outbound.protection.outlook.com [40.93.201.58]) (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 8B2C832ED48; Fri, 30 Jan 2026 08:35:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.58 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762152; cv=fail; b=AYND7ewydbxbUYcg5+oI1xcoPTOVqn5UVbcbdRWFMNhMRah5yv2cJG0274/j9WKpuoBoUmWQi+DAcJT4jAqDTbnJyAY6fmdtuRzJWKQHFeZx2KkfyxXFtfdcEhk/qg0tR9W+XjCioeGIcCGi2CrMmYtfqpOqZr5so9e635mCeCM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762152; c=relaxed/simple; bh=ltGkXWdtMbgYojhTrKJestZtms1r+8EwTYvSYtCd8iU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=bbiI+Gn26FisaFNTz8eh183GNT9hW6wP0BTkwFPXrHyod4ZgmT6+iFTAIOslA+m4fgk2LHDkz0WY/DMlwhvzPr0qhx7Wq83pPqQ1RzwqNOpKp1rfjp//zqhl+w5eMinhW5xLjpk2Y56+WRHFaQNSOE5lh/Yui7fEx/a7602OsME= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=lhjtGQci; arc=fail smtp.client-ip=40.93.201.58 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="lhjtGQci" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bjTgju9BYp7PuVNl3LaQm6OLEn7oZeJp1FF34OB+NtCWm8mdA7+iqyt3YO94ll7WCXKMxTSnsNwrP0K5KgSQgg05P+p+yXy8y4bW0cED03vxduC58Nmlche3uTeO9tEDEZ7X9JUYyHglDp2ZDJlnksq4zhEamqz1FqVRuTUHWdew7ATvwJd86IjoF9epoOqzs2OycQQVKTPyOCS9VO8xluxYK1FTjzwwZMz1so3cKnLvhW7FTafRHWsYfGSxKpHkkdPXZqCgemWa5/nVxm+LP3Xpg9iIZ5uJ933QbIcDEEz8oqtlwriFp46MLF3YOQgCcdkJNayUWbZVHTIzmbnfZg== 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=hJd4VbjvDvJ2z2+3N1UXraBd7OGjX2o33ATkIU4iR7Y=; b=PZiz2GNqu3RhdGUc5A6Zn0qvYLBmBUDIDW4b5kmCungKxaq4qdoN2bda6klBnuMDvySIXRPCT21PplLME+Tq4rMcr4us6pq+4JUBX5KpVfp6QGw7aOjoffsjm7Lhplg0LnOICyL2d01IubtdkFCrcBcOTtAl/4wpl28dbu2m57WpF7pYkDxMMef41dg3bnzE6fRB7V4DqECB3pxcgqb0J4cexJgPi+iZfFlUeoU1PhZSLgw6eoobHuRNe106kMahDGhIs9ZdiZ36wR5iZHqOP9MYaohCclY2/oxCiKx2hSuKQgYOG0W8k4YP9pYgu9LaR6a/YCi0mYAreN7bogWhvg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hJd4VbjvDvJ2z2+3N1UXraBd7OGjX2o33ATkIU4iR7Y=; b=lhjtGQciYamJO6BpZH991bJluoPI2z/flFNfXR08soUMPAIi0CNxnxkpfAsPvOeZqspfS6l3z7vYNWaNTqWjTqSiYgXvqVwKivZyYWlX+/ZYZrpcyiiAanQpkQRwMgSzcJnnPTfSZj/lQqhMJOWni2zyskHqm7A0akqeB1qKSdCX2luTxDObbEBURFvr6DPv5tb/VpFZJkJRa3i2I1bz9MOAfni+eXyl021E5cdDLDKE9wYUE/KkQE2FS9jQKLGaS9LujL1F5NTnlusvpo5kpqiaP60r9+iMiOK8vGLUG/7WL8obhMYyW7h0Ev5Va1IWTLwhcWewEOJjCyfRVnEFXw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by DS0PR12MB9400.namprd12.prod.outlook.com (2603:10b6:8:1b6::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Fri, 30 Jan 2026 08:35:44 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:44 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:08 +0900 Subject: [PATCH 5/9] rust: dma: rename try_item_from_index to try_ptr_at Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-5-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCP286CA0218.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:3c5::17) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|DS0PR12MB9400:EE_ X-MS-Office365-Filtering-Correlation-Id: fe432342-a71e-402f-e720-08de5fda8ef0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?ZmFTZWFzOUxaYjFUMEM5M3NTN3dudktyNWcvMnFxVkpleC80OEZsMGRxT21M?= =?utf-8?B?SEhYMGlOdlV0WUIrcDQ3VGZ5dC85V3ZYTk9hdVNIUnpxdDFUcTJUb29EcTZw?= =?utf-8?B?N1hNeVQraDVBN3R0R0t2c0NyMTl3MEkvb2ZmR2RZcFkzMzRVek14ajQya0Va?= =?utf-8?B?b2I1cTV6bm8xN0c1ZjZCeTVkK1NadkthMWcwTlBISkhHc3Mvc0VkblV1bFR3?= =?utf-8?B?S1R0UXYxTW9aQnZzVE14VGpzU3hIbS8xY1IzL1VrUmtkdStKN0gweDBsZ3g4?= =?utf-8?B?RHM1WjlCSkNZQ1NSRUN0TXpneU92UDg5eGg5RGNCeWszK3MwZ0dNWUc0SnZT?= =?utf-8?B?SGw4Wm9mdVk2eUdvaVBRQlNJbVZ4WUlSNGpoSithcXJSMk5jdS8xY0FPYjJ2?= =?utf-8?B?T2oxd2d0d21ZakFKZWJMRWNEYVQ0NnBvbUFJamttWjhFby9UajdUYno1Wmpj?= =?utf-8?B?aWpKT3NGNDVLZ3J1WGdSUXVwRUMxaTFoV203cFJyR3FqRVYzeEtuSjE5eldV?= =?utf-8?B?dVNrZDN5Y1FBblNCbGw2cUdUZlBCbi95YXJ0NkNUenRmNmd3YURIaERDN0x0?= =?utf-8?B?Q3lZY3IwT3Vrdmk2S0EwVENSZmFFeDZYRnZPUGFUNzlVVXM5VVNBZUdPYlVo?= =?utf-8?B?TjVWTVhjYnpyZlF4TjJRU3AwQWhYRGt2eGl3WmFCRCtjT3dFN3pLaWRaS2tK?= =?utf-8?B?SFE2VUdWaXFUaXluOEhKckZLLzlORnFtdmc3M0NXQ3NYR3U5RzZYaGNIVUlv?= =?utf-8?B?Vk5PcWFYY2hOMldvb0lHaS9yOFcrQXRuZWFPN09qZ0JCNXVNcjQ4K0pyQjRK?= =?utf-8?B?Q3RDRmMyL2NsTnVYcHpSUW5FTHBRdXoxajc4U3F3dmpwTXdOVnkxdEYxSTdt?= =?utf-8?B?bHY4ZUxxWmM4bjJIdDdBTUtkakdGbk5oVUJWUlJVZ1NnUmxRQkNDeFBlb1FS?= =?utf-8?B?S1dmV28yTFZTQXFDeDRCTmVzZkxCQWM5dFlFa0tRYkljVzFFbzYwR2NqOUJ4?= =?utf-8?B?Ty9Ta2VjRWZHVGlhQVZ2NDYwTkhXaWI5RGxNVjZxaFdrUTFZVy91ekovTmtD?= =?utf-8?B?UHBJdDFZVis0YTh3dGxTU0dGbmR6QmNXQ29PMC9UdmJrc3llOFJaeDZncmNu?= =?utf-8?B?cU5iMmVjRXJReVM5ZjlkYkgzQnBSRldIWFpvV0toSlN6L2FHTFNMaEZ5SjJX?= =?utf-8?B?amduYUI1a1RwR3B2aXQyWlRXc0tvdVlNK0VXUFBIQU4xWllZRnhsZGFzWjdo?= =?utf-8?B?UjdEb0dZL2FDSFRhSE8rcGJyRmUyOWZ2cXVsR21VN3ZyL0hYOEFHMDQ2TktW?= =?utf-8?B?NlBVOHdISFpaanlaOUhBalBPZEJzQ1VIM3BPMlk2TUFDR0VDS09nRUhZZWxy?= =?utf-8?B?dkUxbUVCVmNCWDZVaWdLVXVTNDk5eVVISjFoajhtc3A1L2p2QkFHYlV5Q3RC?= =?utf-8?B?OVRsTzd2SGFFblVaMDF2YXQ0dFEySGtKa0lHWm94bjhkSTRHcnF1bzNxUjdx?= =?utf-8?B?Q0o2QVo4TGlaY05UcmhkMmozallUZjVUSU1pb1B5eUZWRHNYa0lKRTd1dzJ3?= =?utf-8?B?emhjQm96N0NXcU1QZFRjNXIyTXR2R2ZnSWtUR2xQbDZ3L3Y0NU9jU2pTdUlX?= =?utf-8?B?K3J2THdyUDdxZGRFSjRFMWJpeWVKWG1SbE82UEk2NnRIUVo5SDROYVh5TjYz?= =?utf-8?B?bFUvMEE4QlN0d253c0poOVpCR3RNaENMSzBsVnZEa21vSWt5bjA3bzlZWEE0?= =?utf-8?B?RnZIbmYzd25MTkllaFp4WmYzaXhyM0NrbzQyUkl0SGRydEtlVmxCWDRNbGlr?= =?utf-8?B?RU9UVU9vb2l4VVFjMGg4ZysxdnVVa011cjVvTVVzaUtCUzJRTUFMamdEd2tF?= =?utf-8?B?QzNBUWRWVkJRQmY1VVBIbVZ6ZUQxK0NUb3BiaGVGbFZVbHVocVNOYzYrdXlU?= =?utf-8?B?MzNWV0RwaFVJc1ZXWVRpNlNOVkNuWk5CQ1B6bHFLUDhzR1l0blNHUmZML2xM?= =?utf-8?B?YU1ZWStIWm5keGRPTkx6QVJGb2I4VUNzN1FEMXNJdUNCY0RTN1dhck4wTzZ3?= =?utf-8?B?eWY4dVNESkJLSEovQjRYRnlHUE9MNFNtYmtBN2liRk9kelFyblU0TnlLdFN4?= =?utf-8?B?RWd1TkdqY3pFQXg2WnlYbXZ1NW1jbFE1NnNHK1o0UUtrZ205N2V5cFF3N3dr?= =?utf-8?B?K1E9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NlBLRTY3TWtqVk00Ky9taXl5cUZHcllZclRhNFk2ZjRoemFQL0NMTkVlTUV4?= =?utf-8?B?dnA2bXNtWkJnbHpJU2VXdG9rZDVuN0RmejJIcUh0WmtpZnBQZU95WXVrczdF?= =?utf-8?B?N3l6QTA1ZXFwckFhVGo0bW9EMnZxZjhYU2JBT1Y3VWdKaTNocjJTaEw1Tk1C?= =?utf-8?B?V2FnZjc2dXJDUjU5Njhhcm9BVGdOSUZpWmV3clk1YzM2L0NZam4wNllqUGpy?= =?utf-8?B?SU16cXNzK3hVK3JlVmo1VFpJM2ZubUJPcnVXdUxqbWVWaFRweC9CZHFFbzBu?= =?utf-8?B?NitGOFdnSEdaL04raE5WOVQ1bUcrTlkramVWNFlMYVRadWQ3MThmcjZLdnpE?= =?utf-8?B?VGJaUVR3WWcxbStOSXliQ2NxRUEzamxnOUtvT3ZVQjc4RC8zbUFaRG1qeVU4?= =?utf-8?B?MVB4TnFYdENFSkIwRCtkVEJHdVlwRTlRK0dUbEtkZjRJVHdINXR5Sjg2MU90?= =?utf-8?B?cWhOdHgzUHllTE9CUUo5RFArRHdmNWpZMi84K0V0UWJVR2pCWU52SVVIS2tX?= =?utf-8?B?MlU4cGpVQkNQaE1tRkg3SHVrSUd2a3FLMjZCVlIxcWd0NWZIbjlVK3ZlM3Zp?= =?utf-8?B?MG8zblh5RlpocnlNRytxVUE5UlIzbDhZaElCOTdyOHlWVmYyUWVFekVhd2Ez?= =?utf-8?B?OTVMeUZSUkhWSXFkSnB0akdTM1BwWkx4a1lJdEFRVHVqTnhaVW5Xcm5IVmdE?= =?utf-8?B?OXZCK3I4aVpJdXhHZkx2RXhyNTZKbmg0NU5JV0NhRnZUUHB2MEsrRW1YNUh2?= =?utf-8?B?dE1oWHVETEhIZjluenllWmMybWJRbDI5TE0wQ284TE1UNlVaUzJ2V0NTdTdp?= =?utf-8?B?c0FoditmTUQ4dWJ6ck9mOXIxRjRFREJHL2tWeUtOWTRtYzA4WXNPMlBjUzdN?= =?utf-8?B?cFNhUzlwenYzbUdHWFRGUkdCd1ZtK2RsTThJNXRXeU9JajB6cGNtYllYU0Zy?= =?utf-8?B?bUNtZ1h0NzJkRWtHRWcvQWliNFViSy9qa2VMM2FZemtCQ2lGOWRsNXBnd2JE?= =?utf-8?B?UkwrbmM5M0V1aENrdkc0dENVMERpTDFJM2FUZmxDMDBtSXBRZVlZaDFCSUZJ?= =?utf-8?B?MXpNQUd6YmluMUQyZFFrMzJkNk15UHc3SzhVMURIM0Nvcnc4emsvbjNVVXNx?= =?utf-8?B?TDNwVzVNaVN2ZndHSXJJYldGRk94anpiK2lYN3ovMTloZFJMWFdkUHVyS0VF?= =?utf-8?B?ZGozbXRuNmJYQllwbllVMVE2bWJtOCtrcnd0Uk50NHJVY0hWakYyTTVBRFdE?= =?utf-8?B?MU5JRmVveUU5YU5CU1RmNVROMnlFMk1sWVZIenkwRWpBTytkUUNxVGFyMTB4?= =?utf-8?B?MU5pNlR1d2JSK3VTNFpWYWUvbW5DMjg0b04wNm9jU2UwV2l3YXlwcUEremZa?= =?utf-8?B?ZmZvNFRIMjIzNURrcDVPTWJQZ3ljcElpNnZ3UjBlU08rYWNVY2NXOGhKMnlY?= =?utf-8?B?TUV6OHA5dGV6RUxnc3BVUU9ua0xwSG41L3g1NXMyK00rTFh4dHFXbytVV2ph?= =?utf-8?B?RXJSMnVPd0RNUm5NYXNoUktUakw3K0tXWlZSY1ZxS2JJUlNtUEt6SnF6ZWFi?= =?utf-8?B?QWJWTjFZVk5nYjZJU1QyZC91U2o3Nk1pWDJnZEpDc21MdVhCRVhPakI4bHhT?= =?utf-8?B?ZzQzMTc0UkZUUlIvMnpaRWlJcVpFeDQxYUdFSENoclRFUlZVeDRybEVaWitB?= =?utf-8?B?YlV5YXhIMTJqNEJPTjNrMWhQd3A1YmhUdHlWRUV3SldKNVBOZ0FRNnF0MVdl?= =?utf-8?B?L3VEMmpUNlNOSUd4R3hsd1BpdGxFMi81MVFmS0RSejBkL2FxTE8rVmR4TUZB?= =?utf-8?B?emQ2Nm5ncDhUVUYxYU9mYnFlaGV4TlphN3RHQzkyNHkvV1RKR0VzcDlyQXBP?= =?utf-8?B?dDJNc2pPUmd3OEFHdEM2NlZzRlZ5dnBQbnZEWEk1VDJUcUJuK2pSN0dMS1lp?= =?utf-8?B?a0FRbDFWTTNleEtSWGM3MkpVTlhZM3FFL3dqa011enpiQ0xIa2Q2OGJQc3RH?= =?utf-8?B?d2VpQzdRZU9UWTRFUjk3MzAwenFJRG5wTGFLeTlaN2pVSGZ6UVM0b3d5cDJ0?= =?utf-8?B?RDVvWkUraS9LajB1ZWEyMlE1U0V5REpTb1ZBWGhDcnNqazVvMTJNaDhnSGox?= =?utf-8?B?TkRTNzMwTHp1OEVVWHgvOHByUjRtRE9WSy93WTRFTzNZTEJZUmdLS3MzSU45?= =?utf-8?B?UHlGVnhndWhuZnhIa1R5ODV0T2FwdlgvU1RRdXZmMERwQ29jYUlha0wzU1NC?= =?utf-8?B?Yjh3QXJwTzRGWElDa1NFQms3ODhDT0pReWVsS0RwWU43SWc4VjVHVjhwaG94?= =?utf-8?B?ZW02OHdJc2YvL1lPVWRuM1RSZzZiR2ZjSitEdG1sZEF2MkJIRU14b3c5ZEhF?= =?utf-8?Q?Ns3PvNhGT5cRLYeQ7I4k+dSx16Qb5Ou2Ndi5L00Fvzt7x?= X-MS-Exchange-AntiSpam-MessageData-1: UxkkLOTUVtBSNA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: fe432342-a71e-402f-e720-08de5fda8ef0 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:43.9801 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bI+tirzKltW6OSBqrMDdIvwjoA4sb2Ki/yNqgur5Eh9gUmU0BMDH9EPtFIff0DoCDvS8DSqeLj5ABEfIfEgiFw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB9400 This function returns a pointer, so rename it to be clearer about what it is getting. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 03fc001eb983..e4bca7a18ac1 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -559,7 +559,7 @@ pub unsafe fn try_write(&mut self, src: &[T], offset: u= size) -> Result { /// Public but hidden since it should only be used from [`try_dma_read= `] and [`try_dma_write`] /// macros. #[doc(hidden)] - pub fn try_item_from_index(&self, offset: usize) -> Result<*mut T> { + pub fn try_ptr_at(&self, offset: usize) -> Result<*mut T> { if offset >=3D self.count { return Err(EINVAL); } @@ -863,12 +863,12 @@ unsafe impl Send macro_rules! try_dma_read { ($dma:expr, $idx:expr, $($field:tt)*) =3D> {{ (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; - // SAFETY: `try_item_from_index` ensures that `item` is always= a valid pointer - // and can be dereferenced. The compiler also further validate= s the expression - // on whether `field` is a member of `item` when expanded by t= he macro. + let ptr =3D $crate::dma::CoherentAllocation::try_ptr_at(&$dma,= $idx)?; + // SAFETY: `try_ptr_at` ensures that `ptr` is always a valid p= ointer and can be + // dereferenced. The compiler also further validates the expre= ssion on whether `field` + // is a member of `ptr` when expanded by the macro. unsafe { - let ptr_field =3D ::core::ptr::addr_of!((*item) $($field)*= ); + let ptr_field =3D ::core::ptr::addr_of!((*ptr) $($field)*); ::core::result::Result::Ok( $crate::dma::CoherentAllocation::field_read(&$dma, ptr= _field) ) @@ -904,20 +904,20 @@ macro_rules! try_dma_read { macro_rules! try_dma_write { ($dma:expr, $idx:expr, =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; - // SAFETY: `try_item_from_index` ensures that `item` is always= a valid item. - unsafe { $crate::dma::CoherentAllocation::field_write(&$dma, i= tem, $val) } + let ptr =3D $crate::dma::CoherentAllocation::try_ptr_at(&$dma,= $idx)?; + // SAFETY: `try_ptr_at` ensures that `ptr` is always a valid p= tr. + unsafe { $crate::dma::CoherentAllocation::field_write(&$dma, p= tr, $val) } ::core::result::Result::Ok(()) })() }; ($dma:expr, $idx:expr, $(.$field:ident)* =3D $val:expr) =3D> { (|| -> ::core::result::Result<_, $crate::error::Error> { - let item =3D $crate::dma::CoherentAllocation::try_item_from_in= dex(&$dma, $idx)?; - // SAFETY: `try_item_from_index` ensures that `item` is always= a valid pointer - // and can be dereferenced. The compiler also further validate= s the expression - // on whether `field` is a member of `item` when expanded by t= he macro. + let ptr =3D $crate::dma::CoherentAllocation::try_ptr_at(&$dma,= $idx)?; + // SAFETY: `try_ptr_at` ensures that `ptr` is always a valid p= ointer and can be + // dereferenced. The compiler also further validates the expre= ssion on whether `field` + // is a member of `ptr` when expanded by the macro. unsafe { - let ptr_field =3D ::core::ptr::addr_of_mut!((*item) $(.$fi= eld)*); + let ptr_field =3D ::core::ptr::addr_of_mut!((*ptr) $(.$fie= ld)*); $crate::dma::CoherentAllocation::field_write(&$dma, ptr_fi= eld, $val) } ::core::result::Result::Ok(()) --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010022.outbound.protection.outlook.com [52.101.61.22]) (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 59CD632BF55; Fri, 30 Jan 2026 08:35:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762154; cv=fail; b=JFjtKfEgX7EDokPFSbPDN6aws3q8+k3UfUL+0TyGw/AzGNSjP9m47i3wbpcrlUTc5OPp2qZfRL2wjnbAhlZwDnFh4qPQkPEETQgGA503bKv6AjqIMMTCkWXp2kF0F2vDavceMZJ9YUC2JFMPaXpOAoR0UXKhONxgEbP3ofas9jY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762154; c=relaxed/simple; bh=FNPCJ54f3Js8NTQFcPOLBHXNzX6AfLugOEpyQqzeRvo=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=TUXTot4XlFK5kA+shUVOWhlDwMlr+/bbyYSJmQoAjFRVW2uzpamSo+y+kw+DeaJ6UFZRRIQHuKvWkrlA6WdzT6OSg4hFjdMGz3Ot/2TvMKq0aTRL6xYtfL2sTiAlMo5I9UrtFHTD8Z58OU4LN9745N8IQwyi7+1YhayQaPm0ek4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=hHfPA48b; arc=fail smtp.client-ip=52.101.61.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="hHfPA48b" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WCXywSi522/PdBzZc+ncG2pTiwQxZ5mggP6z4mGWZzpVkQMKMxvrmfbrVhNLSS8wlEkTwPwtxUw2aqlIVjVPuwvMuR0CbOITVRW+97HmNCZerIy3DH+CyEG7cBjpw4OvAtvHi+3Yz71PCsieMB19djryZMm3jLRwJRg1cHhImDLH95agm/Gk6c4zYXdFYVZgfakAyiMt+bYmjO/cKyL/AoH3VG4soqiYxI7a17teylrazNmaWQYJrRAnPhEyQvOPojhj39fErKJefRjFrznmR/V+3cH7G6Liw6yRiJSVzaQ18O7HjEgZvFyRCUeusXKXlUNW1uj9/JnbCvQZaSmI6Q== 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=q6v8DIJiB6u+RO+QviFIZahEhm1VS8Am8soaTwJTE8c=; b=qU+Y12Xmp+kCXN1WMjplplp+h9wRD1VE3sKAwYuYwWcdNZwlJYAsA2dlqrbuo4FBxGq+Omy94pOph6KI8VC0PEGtgkXPFMcmtR1c5vudL2yOfKMED4r/Bq3U5FkqdfYNhv2/4lnypWNKdhaD3dMk4wNB2/35FG0x3e3lvJec4SqauGKSzK9qFJIzkwi0X3qgMH67ci7TGEVR3wk5HIjy5j3BoNYIdq/0VI3m9pQWuUBcgifaLWxDnbSEDRL8cAx6uewVvN94UBgi4jKczpXxdsMcyZP28KGtWu0lCGhqCqTqZnk4VT+SFXB3ZWRRMAPuoxzU0+9p9sSrhy5u0S76wA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=q6v8DIJiB6u+RO+QviFIZahEhm1VS8Am8soaTwJTE8c=; b=hHfPA48bamD9EsqlVjTV/DFqP50s2ewqJyt4j1UGz9yWLqMRzwqa9mrZ2gTZrpPhcwMG+iqsft5Bz2QllNSIIPRzNnzNHc+lCo+n6hV3/TJSnMCTfJEmoYujWTa9f2aLrpgJdjk9nnY9sqv0IYSUTf0iykfOhXCHu8Y2FAEg1+DGT90xgxpjwiYwadpC/HRXzdWoOBz11J0aTP1k3uRaeJDb5pVVKWjiU/I1Hz7ls1AKZ9TlkNohYkS6u2LqW3ANbdhUxgBXWC56sjVAYMzI9NcEmGlXQXbotLFhRNBY7UDZFpANxL3KymHySbkxcPYYuAxRotEILiAljyetQhhYdA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH7PR12MB5757.namprd12.prod.outlook.com (2603:10b6:510:1d0::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 08:35:48 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:47 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:09 +0900 Subject: [PATCH 6/9] rust: dma: add dma_read! and dma_write! macros Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-6-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0097.jpnprd01.prod.outlook.com (2603:1096:405:37d::10) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH7PR12MB5757:EE_ X-MS-Office365-Filtering-Correlation-Id: 64ab1e48-d2fc-4f28-ecae-08de5fda913b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?QVJMdVNPTTVMNWJzMzVTUld3aU5SdmFXMGIrMkJGTlhGbEVFOHpLUmhVSW5o?= =?utf-8?B?YVlFQWsrVk4wZ1lqaG8yMnBTYjlQMjlHZXpiVnNmaTdaS0xMdDYzaHJXUFJx?= =?utf-8?B?R0FZbTVWay9hU0JwN0tja2tmTysyWlY1a2w2SlhPK2d2U29mWDhNVDZVVG5S?= =?utf-8?B?MkhMVEppR2N4NTQxUUxoQlJHM2hQWURBcjd1SXFpbWVMRUNRUFdQdStYdEVp?= =?utf-8?B?bWJVL3Vpa1BzcEt2T3RxRmZHSk1RRGN1ZTJSYjhlclVKamNnWmhjck56U29G?= =?utf-8?B?aktSdm5EM3RScExPd0o2UmFkYmtpYWZNUlIrZFhMZFZiTWhEMUlCbzRtU3dp?= =?utf-8?B?VHVLNW1kWGI4SFkxZkUya2w1aVZnTmFwNTl5U0owc2I2WG93MTB6MkozU0Y3?= =?utf-8?B?TEtnRnhuOHcvMVZxaUNoTm4vMHVHZjFmcCsrU01kbnN5T2tHMERDT0VlTWow?= =?utf-8?B?bFZJaVgzbTVpMElDb3Y4bDdSZnBKZUczK0hzS3pJUGdoT0t6TlB3WjlSZng0?= =?utf-8?B?V25yeWcvc2ZCVTRDY0JmZkgvL0tXVEd5c3FVdk9CRDloVC9FV3JJWW1QV2ZE?= =?utf-8?B?Q1VVa29vbHlUNzcyQTB1Q25ibVg5RFpmMm5qbEZEWlYwNW1RZmZXNE5UdUZH?= =?utf-8?B?TE4xZy80VFlXVmpmOHJGTnVZOFVXQ01lUmxrWk94cW1XUmdDaDF6OTBOWjZv?= =?utf-8?B?R2MyVEsxUGN5cDMwcmhPNlRJekZKblRPaXR3czhCN0J4RFluM3QyVkRMdWkr?= =?utf-8?B?a3lreTh1UFJSWXZic0RMRjVHcWlhamRVeWJXdTlVamkrZ1p5NU00dlVsVGRV?= =?utf-8?B?cEg3cjNxb0loQzhEbXp0R1hUT2ZoSlBSOHlLOGZQOE0raEtpUVNTKzdBTUZs?= =?utf-8?B?T3lDVWd6N2lSQVhTczQ2bVFFR3JNVG9LaHYwU2psVFRscnJzWUs0OUJtd3I3?= =?utf-8?B?YTRrTGZOajFvMTBZdGU2VnVvZ0UzYk4zMHFrWGFGZnpBMEpKK3FBdVVjK2VJ?= =?utf-8?B?dFV4VHlWaUkwbVpVcDRvMHo2WHJ3dTFGTDhleHlZWkNyMUlFayszNzdXdmY5?= =?utf-8?B?U3dCbHBZOE5UYUJ3SWxkUVpTUndHQTdMY09rVHZockxaeXhzYUNyWTFVZ01s?= =?utf-8?B?Q3dCaGNkOVBVMVpLZTF2M1lULzlQNFIyRkQzNE9HRVJ6R1dXQkNsNjRxZUM4?= =?utf-8?B?eldZYkxsWnZlQXZXQzVCQXVnT0pQS0F6MFJUcXhxYTJBSWErSFRkTi9JNlRn?= =?utf-8?B?d0V1a0hKVGJNdlJHWGlPdFphZW9UOEN4bWpiNkFGbUQ2RTZIRUwyRTVaVzls?= =?utf-8?B?V256eHBXMTlPVUZ5WTNjU2pXbjZnZnpjRkJqRW1zSlhiK3ZhYzY5UG40OE5i?= =?utf-8?B?Qmc4S3dsa3c3NUhNckxKVW0wTlhHWlgxakF3OE9uV3B1dU1JdXRDZXRla3NP?= =?utf-8?B?MVJocW9BbXNGVGw1Mk1HcUF0U1d4WW9XV0ptQWpIUlFPVTJmOGNWMXhweE9C?= =?utf-8?B?UW9HVG1UNGJGV3o1Z2dENmgxSGk4aCtUb1BDcE00dk92aDB6WFNZbnlINUdQ?= =?utf-8?B?dTdvcDF3Q041ejVkd3F2bnZsYW5hRDRMYWJRdWJrY0lBTGYyc1hyRitHV0hi?= =?utf-8?B?ZlVtMHBiWmIzNUU5Sk1OVHAwbmtnMzZZR3lKZGRzTy9vSGo5WGMxU0JrdDdH?= =?utf-8?B?eG1YSmgyVlBZa0h1VncyZWVObGhrY0xCOEJMOUozZy9Da1F2K0VzT3FITEUw?= =?utf-8?B?S1RqclBvNFZLNWtlSUZXL3JOaXlkaFdpQXM2MW1hUzB1QVc3ZFZRRjdKM285?= =?utf-8?B?UkxPdTV4VVorUkxUKzB3bWJNL1hMTVRTMnJjcVVHV1Y4QXJscVZld0hHV1NY?= =?utf-8?B?Vkg1aUxObWMzZFRPdDArbGsrempkQ1BCRDZXM2Q2TDZ5WTVPbEcwQUhVZ1Q2?= =?utf-8?B?MlltdlhpK1JZUGQ1N3llaUtmUTdtbHhaaGZBTlpxbThERW9RUWYwMEFQbzFZ?= =?utf-8?B?c0IrRk9OYXZZd0o3N1lUTEVWMXJTbkxLRjh0SlpJRXhaRThTYXJzb1VqZFB3?= =?utf-8?B?SS9tQ0hMWisxMU5XVUNsNnNDVjQ3a0MvQ2cvZ2tLdDhBbXB3VUUvejdvN1l6?= =?utf-8?B?YkFMQlArY2pDZFNRcmQyRldsTS9yK2JNSnh0S1ZIWUlnV1ZQSmZBcmxQWUsx?= =?utf-8?B?MkE9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VzJsUTQ3R1ZNYkhtSUovR1NHQitLQklBa3lDMnBlY042T01Md1BhRVF3alZG?= =?utf-8?B?by9kSk9aYjR3M0hIc0lNelI3SHJ2aUdMNnJYZXgwajRrRjJSbVFCUUM5ZFo2?= =?utf-8?B?YjNtMkNldFVUaUNaUm9paFduRmIzT2psaTBST2lJeFpXUDZRaVA0VmEzRjNW?= =?utf-8?B?dzFwUnZEd1lRZXM4S2Z3eEJQeFR2YmZ3K3pFb0JQcE1jaVZ4Q0krZnRZT29R?= =?utf-8?B?NlNJRXBnL0JSN1dpb010OTBDc0REb2FxUlcvSFNTbnRRRm1iWTJsNzBLV28z?= =?utf-8?B?bUxHS2VKQzBubVIrd3RyanpLelFSeHc1ZjZpbDlOTy9oaEhrR2ZRLzZiUnN1?= =?utf-8?B?UlQ1Q3YwSHhaa1IxcUR6akJzUjFXMlpNdkRNTmgxQ2hURkZpZmZIaFRpaTNL?= =?utf-8?B?aEhTWnIxMHpnTTdSckJYZ1FpSXZXWUJ3TU4vSGRDWDc2TEltdFROQnJXYUhW?= =?utf-8?B?ZmF3QU5NQmtEVzRxdzBWTjJTMG1Ubkl2MnFnZzNIUDRQTkZzaDdqcFdJTVZp?= =?utf-8?B?UmprMEtmdTFrSzRvN1JvM3prZUhpc250dFBnZHlVVjJneEJaTldCKzAyb1NE?= =?utf-8?B?WDgydDMzNlBxd1NvSzlXLzNWemlyQW9qY2NFWTZTS0tXTFNidC8vaUIzbnl6?= =?utf-8?B?SFNudTBXY25kdmJBdHE3b0NiclBrbU9qdEh0TFEvdkxxTEgrcXcwRTlWSTVs?= =?utf-8?B?WnlBL3UyV0NEZHF2dk1qZ2RMM0Q5WnlSOTNzSGV5NnYwMDNoTkxVZFZQR0tY?= =?utf-8?B?OGlMRkg3dnh1Ym5Wbit2UVpEQlBVUm1QZmxrdURGOGdDZ2JFSTBBcDJ3WmRE?= =?utf-8?B?Wk4xOXduK2ZGT05rMjZaczl0K08yNUFOREs0S0R6NytubE0wRHlXNmtwdjJQ?= =?utf-8?B?Y3VuK0ozQWNwOEdIck1ZaVVUSDZqd0d5d2RPRkU4YnJMY25yeWtOanJwemNo?= =?utf-8?B?WlNvVmVQRHNJUGxGUDArOC9FVkRIZTNoMjhqMjJzWDJyYkxORENsK28rYVBU?= =?utf-8?B?SE90M1lnSHB1dzVYenVCcGJjUG9KSHl3NDhPR3g0N3NHeWZobG1YR3hLeVN5?= =?utf-8?B?a1NUTDBqRG92eno5dGFzdHNhalZvS0d2Y3NycytUNW5SZlZMZlpTaWlVUGZx?= =?utf-8?B?S3JUekY3MzFmVDMrRkw0UldsRTNrS3ZDcGNObEhRWEtRT3oyVERxYmRJVFQ5?= =?utf-8?B?dmRHZFBzdWdDYk1BTGcrSUNXTDZSSDM4OXVXOGVxTFlscmRjNzZUeWNuM3JN?= =?utf-8?B?VzdWRW1RT1FzK2dLTm9uYkNOVXg1SWhHbnZJOXU5dUxQNW1RaWM2TTVnYUo1?= =?utf-8?B?THh5cGRHVE1DYWhVOEptM00yMVEvbG40citDKzlpREIzcEdFZzdiVE5DK2Fj?= =?utf-8?B?Tyt5QTNKTGIzYk9CSkFlK29QWlJiVWhTUXJ6VnJhdjhpTU9wd25BZVNzYzZZ?= =?utf-8?B?Q2pLTDJVL05IM0twaWZUSlh2bGo3K2hySlJXbGRDVFlMRlIrbGhjTUkxQ0Yx?= =?utf-8?B?UFFDcHdtTVNvYWl1YnRrZTV6YmpyaDRiZUMyQjFrQnQzQWJBQU1TaTVtY1l4?= =?utf-8?B?N1o1cDkrSHN3OTFaODZYaVhIR21MV043cVk3aW1ieU1HdkNvTUpSakt2aHor?= =?utf-8?B?bFFDaTl0VEhkeXp4WGVFSW1MenFOSXdLQkdicjV6dTV5NDA0aEh0VkhTVmtw?= =?utf-8?B?Z3VpRDZTcVExRUUvSmFYZzFTaUdWRjJLYlJzWkFxTWV1VDZvLytKQU1XdEpC?= =?utf-8?B?UnBsTmhENy9QSnNBNCswa2hwdWZYdmE2VVRPUGwrL0orSE1hbkxacXdEMlJr?= =?utf-8?B?R3RMTjY2T0IxRmhwMGJqRGhnZnMrM3JwcjRCWnRhZFh4VDhPbEF0b0czbUpq?= =?utf-8?B?WU5VNzdVYlAvU3ZaKzJLSUVySHVnWHJ4R1BNUmdmc0NFVkV0UnpRMFNQUnA0?= =?utf-8?B?VXVEZE9KN3pzSjExTmlHMXJZSE5vRnhucWpHMHBUUmZwK3ovUC9hUnp0aG11?= =?utf-8?B?YVdQMXc3OHp5MVVTZldxQkdtN2hmclZJbGoyMHFMYnY2V1A0Z1k4WHltMnVZ?= =?utf-8?B?VGhNQThFd1pqMy9KVUU3S3JUWWpTYXBieWFNelp4anJieFFLWDE2VjZXcmFh?= =?utf-8?B?TDEwKzkzMEpEdWhoZXhWeXJEbk5HUmpKZXFHSDJPQytTRXlqTG51K2RyNW5W?= =?utf-8?B?SGhDa1JJL2taY3NicWlrNVFyR2p3Snp5c0NkZDlzOHNiZkphWTRYNUw1ekM2?= =?utf-8?B?WXJKQW13Tm9aMit6bFJyUlR2ZldBdE9SdE5pTGJTaW1MMGdwcFVqR0Z4b1U2?= =?utf-8?B?cm5WUkZrTGYvMVY3QWxEOTBOUDBjUjZEK1VxZ1VjRlVvNVg1NHg4YnFWLytJ?= =?utf-8?Q?cb4e9koIU8G4seDK+r2GiK4yZqNcorle2CGy0JDq8aYlQ?= X-MS-Exchange-AntiSpam-MessageData-1: aOdphbk3svln9Q== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 64ab1e48-d2fc-4f28-ecae-08de5fda913b X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:47.8291 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: uOym1nro543qcK40iHPVU46qfP4oL7KkJGpy3ZJN8OhqO5ucFZXyF4M7kSUJmx0AIQlnnHWh+zctJnLASUFKag== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5757 Add dma_read! and dma_write! macros using the new infallible methods on CoherentArray. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 103 +++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 103 insertions(+) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index e4bca7a18ac1..f3920f74583a 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -811,6 +811,24 @@ pub unsafe fn as_slice_mut(&mut self) - ) }; } + + /// Returns a pointer to an element from the region with bounds checki= ng. `OFFSET` is in + /// units of `T`, not the number of bytes. + /// + /// Public but hidden since it should only be used from [`dma_read`] a= nd [`dma_write`] macros. + #[doc(hidden)] + pub fn ptr_at(&self) -> *mut T { + build_assert!( + OFFSET < N, + "Index out of bounds when accessing CoherentArray" + ); + // SAFETY: + // - The pointer is valid due to type invariant on `CoherentAlloca= tion` + // and we've just checked that the range and index is within bound= s. + // - `OFFSET` can't overflow since it is smaller than `N` and we'v= e checked + // that `N` won't overflow early in the constructor. + unsafe { self.cpu_addr.as_ptr().add(OFFSET) } + } } =20 /// Note that the device configured to do DMA must be halted before this o= bject is dropped. @@ -927,3 +945,88 @@ macro_rules! try_dma_write { $crate::try_dma_write!($($dma).*, $idx, $($field)*) }}; } + +/// Reads a field of an item from a [`CoherentArray`] with compile-time bo= unds checking. +/// +/// # Examples +/// +/// ``` +/// use kernel::device::Device; +/// use kernel::dma::{attrs::*, CoherentArray}; +/// +/// struct MyStruct { field: u32, } +/// +/// // SAFETY: All bit patterns are acceptable values for `MyStruct`. +/// unsafe impl kernel::transmute::FromBytes for MyStruct{}; +/// // SAFETY: Instances of `MyStruct` have no uninitialized portions. +/// unsafe impl kernel::transmute::AsBytes for MyStruct{}; +/// +/// # fn test(alloc: &kernel::dma::CoherentArray) { +/// let whole =3D kernel::dma_read!(alloc[2]); +/// let field =3D kernel::dma_read!(alloc[1].field); +/// # } +/// ``` +#[macro_export] +macro_rules! dma_read { + ($dma:expr, $idx:expr, $($field:tt)*) =3D> {{ + (|| { + let ptr =3D $crate::dma::CoherentArray::ptr_at::<$idx>(&$dma); + // SAFETY: `ptr_at` ensures that `ptr` is always a valid point= er and can be + // dereferenced. The compiler also further validates the expre= ssion on whether `field` + // is a member of `ptr` when expanded by the macro. + unsafe { + let ptr_field =3D ::core::ptr::addr_of!((*ptr) $($field)*); + $crate::dma::CoherentAllocation::field_read(&$dma, ptr_fie= ld) + } + })() + }}; + ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> { + $crate::dma_read!($($dma).*, $idx, $($field)*) + }; +} + +/// Writes to a field of an item in a [`CoherentArray`] with compile-time = bounds checking. +/// +/// # Examples +/// +/// ``` +/// use kernel::device::Device; +/// use kernel::dma::{attrs::*, CoherentArray}; +/// +/// struct MyStruct { member: u32, } +/// +/// // SAFETY: All bit patterns are acceptable values for `MyStruct`. +/// unsafe impl kernel::transmute::FromBytes for MyStruct{}; +/// // SAFETY: Instances of `MyStruct` have no uninitialized portions. +/// unsafe impl kernel::transmute::AsBytes for MyStruct{}; +/// +/// # fn test(alloc: &kernel::dma::CoherentArray) { +/// kernel::dma_write!(alloc[2].member =3D 0xf); +/// kernel::dma_write!(alloc[1] =3D MyStruct { member: 0xf }); +/// # } +/// ``` +#[macro_export] +macro_rules! dma_write { + ($dma:expr, $idx:expr, =3D $val:expr) =3D> { + (|| { + let ptr =3D $crate::dma::CoherentArray::ptr_at::<$idx>(&$dma); + // SAFETY: `ptr_at` ensures that `ptr` is always a valid ptr. + unsafe { $crate::dma::CoherentAllocation::field_write(&$dma, p= tr, $val) } + })() + }; + ($dma:expr, $idx:expr, $(.$field:ident)* =3D $val:expr) =3D> { + (|| { + let ptr =3D $crate::dma::CoherentArray::ptr_at::<$idx>(&$dma); + // SAFETY: `ptr_at` ensures that `ptr` is always a valid point= er and can be + // dereferenced. The compiler also further validates the expre= ssion on whether `field` + // is a member of `ptr` when expanded by the macro. + unsafe { + let ptr_field =3D ::core::ptr::addr_of_mut!((*ptr) $(.$fie= ld)*); + $crate::dma::CoherentAllocation::field_write(&$dma, ptr_fi= eld, $val) + } + })() + }; + ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) =3D> {{ + $crate::dma_write!($($dma).*, $idx, $($field)*) + }}; +} --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010022.outbound.protection.outlook.com [52.101.61.22]) (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 15D3A331234; Fri, 30 Jan 2026 08:35:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762156; cv=fail; b=tDH5KMOfXg439i8oUkOv+E8woj1bNGfFR1fnla7TTwJWUffqTU3328mFwbvh2vLiLd4WH7NiJD4WT3pnpeLi/3AMqwZHwNUvRU0Tg2dJ8w3EIl67Qa5tN3DYE2EsvbHNk9imRvhaW3mhqkDdXpiCC+z47nHpVGZnsAFMgzDDKJY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762156; c=relaxed/simple; bh=wrgcqL5b1n4zB/KfkM70Ds+rhnEiYU/bfqdsihNEZKg=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Kda/2tNBr4r9cUXf3Jze5TfOulyYp6a47Ltq8DXuNDAIWw/T+xKUfwClOKOwXBnMncn/01bp009Rcd2HnFyNAV9k8c5B9rd6AMR3WsX4MRqJRShaGWufH7ty/C98QB4Z9QWq14yFMiu4if/8XRx4YvRjEFbYXvnAFqZjOR+IEeY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=q2+cUFzo; arc=fail smtp.client-ip=52.101.61.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="q2+cUFzo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fTZglbJgh9+M8SR9iHkNKt9dvxh8LBCgf4i17Ouf5I6Z+M8N8w5mWKLMZmHJotKzDQe9cBGBJIH5YaBwsCEgkyuYEhS/UmEq6Yg3IfiIqI6yaOIrSmp1+UEVeEaIi3UOfcrgSqyAGO1IFAIBYLJ6Hx2LkiAjKJlGLdRBUOvPUb7W2lklCbN9lKbotVPEZ/mlGQzLYDgWqWZvT9xqo8r8Lgw3xqWa1FHu6BFfEo3ym1Lh7gE4lMChML6cijleZmUS5RvmT1PqyZJ8Xxz/z7XqbYJlnk1mqahKC2Zv/bl32ZCDAbPCrtaS3zc7OtlPoTtbQTG/mNw44GP3dOTQEDnJyw== 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=wm7gE6s35eb7zMseO055nM8/YUBt4jNGijgXAN+Np/8=; b=vNChFcDttWi2+ponhvg+A6VrU0NnPxLCeI6Ln4b39t5luKKUDLfHiyF2L+1Mh0Tnpi0D5jfkm4USRChFcMbuf9fR0nP56Ip0WL3h0Q8c9fMtXSDfor2DMeE+Jfzw20ffrkoPei6GWvte6Nv7m5YP1xXpZUKVifYcwX9LLiuqMuADTAcGbMxwvl8P89u78xZE4ZiMt61vAIzWxqecWwiIpWOVH2/I/WUGZFswHqeOuevl62L2/Qe5UNkQSsb66KDSTLj9qVBo6lhGK3tcY6nE5HCyGSpRR1XU+lnO8rtoqL9dtqYUoyZziq4fRSULIf8kKOCLZdbi2KPUDiw/QkCmfA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wm7gE6s35eb7zMseO055nM8/YUBt4jNGijgXAN+Np/8=; b=q2+cUFzoeu0VYQDSJTNjrYa1dNVTg3OvK0x9KhFQxwFKRGpzsYf1uJlsql4fqECTIVW4pPniJClOku0KTVvL1zMGsgxJN9zeU3Fwao2iJyLZoMTBPUT9996sam0tZbpRbPN1f6mu5OBKYpKzWv7rlnzvBc00K7+nzPba/QsbM3QT5Fiw7UBoZLqA6GRqS1NFuVT+LKdO9yGci63kyUr04+0sBv9dynlm0yT0CcYE7txli36uhnlzOh9KyKCMme6gbWHmQunELe/ef2D3cQXULHF3mjxXbca+708FwTifiCun2XWO2+GYEL9zXBBWyw+EWFwrCCdNqZYfwzkNojnO8w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH7PR12MB5757.namprd12.prod.outlook.com (2603:10b6:510:1d0::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 08:35:51 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:51 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:10 +0900 Subject: [PATCH 7/9] rust: dma: implement decay from CoherentArray to CoherentSlice Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-7-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYWP286CA0025.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:262::13) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH7PR12MB5757:EE_ X-MS-Office365-Filtering-Correlation-Id: a4fa958c-ff2a-4f3b-76c1-08de5fda937d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?ZCs2YkZ1ODhEZlpEV1ZOTnJIbTJLUFN4ZVp4Zi9yQ1BYT0l5TVV0cUFEbmFU?= =?utf-8?B?WjBuYmZYWkQ2ZVNhSFdVRERlMjhUNVZFcnJtWTJLWEE3YmduV2ZGNUZyK2pS?= =?utf-8?B?a3Q2VUdmWTBNWVI2ZFJsSkM2M0dFRUVBQnV0c29DVnBQKzdMNHlMTmpZNlJz?= =?utf-8?B?Z0E0ZHBZRTFGUmdyS1laMlhzY1k2NVRML2M3Y3hjeGJPbS93WEZRK2ZUcHNE?= =?utf-8?B?NnBOTTd2THB2WHk5Z2VmTFJIVExOejgyd0Uxa05uWUttMStWS1FhT2xETkp6?= =?utf-8?B?K1pKYWxHL0x2c0Y0cnpmaTRIbzZqQ0xwWW54bFF0WDcwcVYrcXpoWDBjN0Fh?= =?utf-8?B?ZUJDMGpPa0xKU3ZrUHhISjFyVE9zYW9ncCtLTUp1bHpNNllmQWVzTjFWUWhV?= =?utf-8?B?eUtLRDZMcjR1eHpubzhRTkVrSUhWUGkrSGt1cWIyNlFkazhMZThzQVRsRVBU?= =?utf-8?B?TGwwcVFKdTVNeGRORlpNcW5QOFN4S1BqTHR2L1lZbmNJWDdlMlRzSFp0M2VL?= =?utf-8?B?SXB0QllyTlNrUEh2QW01dUpyQ0I0bmZ4WmI2SHhXNzBteWRQb0V2b1Jtdy95?= =?utf-8?B?UVZTSjlBUGt5Z3oxREZkcVpKQ1JwTWVKUjB0ajA1a1ZUUGMvaUNmeDFnMytO?= =?utf-8?B?QlAwdENKWWZZMnpSS21ZWXVlUlY3MnRNbDM0SEk0QWNSSXZOaUdwZk9uWjd2?= =?utf-8?B?SXpRZ0FFdjVVeXF4YTQ2dW1YTU9CU0dRRVo3LzZ6QnMzczM5NEdKQkp2ck90?= =?utf-8?B?QlNTUnhTYW1mdENpUC9CdVM1Y2V3dlJzTWlEY08xQlhmb0JPaUppUDdqN2Qv?= =?utf-8?B?cmE1NG9TY2tIOVZIalpOUUM0SjJvQXNqSDBuV0gzbVltYnVBYk03R1JHOUhV?= =?utf-8?B?bmptUHQreTZ5QlhJcjRWR3FlWVVianFTVkpjUGZ3SUJlbDNVUFV0V2VzMFVM?= =?utf-8?B?aUYvV0hYaUM4MXJXRnV0dWtaRVJDMmJnU0twOG0xU1NGNDE3eXlXYzdTSU5n?= =?utf-8?B?d3JJQjJweURGTmRiemZxcmt3S09LUXFFNUFuNjBYRjFkU0tvU3BqTW9halJP?= =?utf-8?B?RXJsUmlKZEdoR01OUGJZU1ZwL1BlMS9LdVFlTmc5YlpLTXdFMnNNMVk1SG04?= =?utf-8?B?cEViYjU4NDZhY2VoRTFibVlYcXVnS2oxOFRhSVFQRG14K3NyZmx1U2o2MUF3?= =?utf-8?B?allLQTVTL3FPaCtJOHZrVFhSWnVxcnFtcmxzelFva1FIdUZJODRXd1Z2V2lj?= =?utf-8?B?YzdkaXNSWTRUVTdRZ3NRSHBUakdFRFhmMnZ5L01tdnNhZVEycnllNTVGbFJy?= =?utf-8?B?T2F1d3RqKzZuaXh0amRhVXFURk1HOHpGcGVLcnZQcE1XQnZrdi9DRVNkUVlu?= =?utf-8?B?VytrZzJ2QlBFR2RZNEZDb2o4Z3RsOG1hTHRLOUphYnpKVXlsZzAzbVVDckNl?= =?utf-8?B?MW5nYU12QWVFTDFEUk1PWEwwOUNJQmtxVmhSdjcvMFo2VjV6Q3pKVFBTYVpV?= =?utf-8?B?VDlpMHhKT2RGZGM2NVIyNnd3L1JhQ1ZzckJnQXlab3NteXhTM2g3cUx0TlhY?= =?utf-8?B?S2h3VDZ0UkRQeUgyWTN3L2M1RFJWZ0dDVk5NcXVSZ3JhM3UwRjRwUDZwa05p?= =?utf-8?B?ekFwK3JNY3FSUUIzVDE3Z1k5Y2w5TE55OGEvS0taTXFSQmViV2NONlhrdjZZ?= =?utf-8?B?WDdLQnk5S2xwT1BWYk1Ya3dqUVI3U0I2b21ndDMyQXJXS1JOOXc5cDdkeHI1?= =?utf-8?B?cGVVY0MvY3R0b254WGtJMFZ3bmxQelgvcmVna0dyNUVFN0tuZFlILzVYV2xk?= =?utf-8?B?ZXRSVk5sZGxkRmVQMDNzeEt6dWZNRmsxQVJ2Ky9rWUNCN0lyaWx5ZEFlSUIw?= =?utf-8?B?bm5DQk5UYi9ZQTN4bjE0eU9LbWd4RGFGSTFsbHNTTFVDVjl0M3paWkZzL2Yw?= =?utf-8?B?ODIya2pzNE9rcVh2enQ2bHpmaXFOdDFwOGluYi9DdFZDQ2xCOHVMR3ljcitT?= =?utf-8?B?aDZsamdRbW43UVRKbUkzckFwYi8zelZuOWJSenJnQWJVenhOTDBCdlpJamhh?= =?utf-8?B?dW1Cc050QlRsWjE5THRrVk0zYnhmS051eWtwek5Ka3diTFhzSjdXK3JEcDJn?= =?utf-8?B?WmZBYlZNM1hDc3NQYWVnL2gzZDltSnlabWExSWR6N3RNdFE1UUZtcktNTUFv?= =?utf-8?B?REE9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?WEZiaDFYUHJZaFp2cC9hVGgrQVBqMEplT0xDMzFBZlFGU3pnM0pQV2dab09Y?= =?utf-8?B?S2FwUXhLVWNDMmJMRjdCQ1lpUWJkalYyc21CYXh2QkFFQW9hVjlTVkxvdjFW?= =?utf-8?B?SkcvTE9GOWlzcmtJeTNFdXR0Y2FzNXgxUHhKZVk5MUhwQzNtS29ta0gvWVd2?= =?utf-8?B?bWE4MVkrZEM0c1ZIRk4xSHRDVnpIeTlFc2JONlBGWGkzOGJIdGFlOHFrUnZ4?= =?utf-8?B?RVNiRFFpRG5XaVVoSjUzREthTDhndmJFMHVsbU0rREZXbzVYUjRKNjk2cTl4?= =?utf-8?B?WXNib2FpZElJanBXRGJxWnh5WVJIS2ZJU3JDQ0tOSnFhbzFZUlFEUU8yY0o0?= =?utf-8?B?aWE2a1FQT1RqTHRuRERwcjV3dU5EYmlVMDBac3lkTHUrWklwQkhxUkdpRk5r?= =?utf-8?B?QW5zRitzZWxCS2NCeUt6MEFQMlIzQ0tHUitEN2IzaUNuRjhZMThhNDhaTXZ0?= =?utf-8?B?eU41Y3BSSytvT0M2VEl0WkZwSjlZL2c1K0tMRVJWcnFSdmhGRnZKbyt2aFd6?= =?utf-8?B?Q05pbk91TnZqdUk0cW5OekVGekFsZ3ljWjJwUnlqcFpMTFFQK0JsWkVJZWNu?= =?utf-8?B?QTR1bUs2UXBWVlJKcjl5S1BKcXBnU1lqUnRFR294WlhFN0xpTUEyV2U5V3Z1?= =?utf-8?B?N1hySm1GSzF3Qk1ZdVB2dkVteGdPc1Urb0FrSzB4dzVhZWw5d09MdXgxcDhl?= =?utf-8?B?NHFIUnpQaVNQZXRRMDcxY0JzN1RreEF0YXhaZzZ6bVdneENjUTBmS3lQRnVO?= =?utf-8?B?TGw1RXVGZHN2b0JBRktnVkRWcktCNFZ2NlF5YWJaYTlCaDcyaWs5aCtLVVMr?= =?utf-8?B?T0diNlBsdXBqUDF2VlVJcnREVlhoZnpsVDNwTE1XcDRuN1RKbHU2blo1Snpj?= =?utf-8?B?MDFHczJBcnlOaHkwVVpLQjJQSGVLZEZIc2NNSjdJNHc5SnE2Y05wVy9QMGZo?= =?utf-8?B?bXBpMDFMWFpWUXZscTFuMWUyb2NtZUIwdFRtTHd0SXFzbWo5ZHl3bUhDejEv?= =?utf-8?B?anlnazhNZWd6cWl0clF4VmFoN1JyS090b1pnTlVvM1hIZ3BvLytlSkZNdWtX?= =?utf-8?B?SnM5YmthbnR5TG10OTdzblRxQVc1ejV2UWQ3YmhPZlUrOGR3YTZ6RU9JUFIy?= =?utf-8?B?TjRYbEJUdkwrOVBabnE5SXNIQzZ0ekdPbGFwMGJQeHIxWWJCQ0wxYWZJLzM5?= =?utf-8?B?dVNPUUc5WmgwbTBITnBkN0wxak9sLzNyeFpUU2E5SVdHSzQwbWFZSjRJNWpB?= =?utf-8?B?bWR6cG9rSGFZNzhqeDV4RTNHVkM5WXh0Wk1YY1cxSHNvNEt0RE45eUo4ZE40?= =?utf-8?B?ZEYvcURqN0hKUUFZNEFzSmlQb1d0K0hFZkhoWHlaWmJSN0pSRXFSN2NsS0h2?= =?utf-8?B?R3pNNVROcVpiUGZId3E2OHBmNHJVZWxsQUswUHozQklHa0c1ZkZKbWtnemVS?= =?utf-8?B?S0l3ZUVqSGxpNzA4TldjV2FNcVdIdVNjdVBCM1U2Q2dkdExrcHMvZzBmYzF3?= =?utf-8?B?amgrancrMXJMRlgyOU1WNys5Q2wyd1hhcEdiZndBSi95ZE84RGJ6cnpQUVg3?= =?utf-8?B?T1FQOEEvMDk0QVBVempucEJDL2hLaVlqT00yTWdHUmYxbWgvY05Ld3F0KzZV?= =?utf-8?B?THRZT2lNK1BVYXdiRHZEN3hBYmlIT3dmd3hVZkZ1YTc3N3JaZnhsc0NCbWl3?= =?utf-8?B?NGVHdmRQUjViMzVrWUUxcC9JbDFKcWFaTmZhaE1nZFBXajZIM3U0YlNUckZC?= =?utf-8?B?OFZReWg5RWxObGZ6c0FjRWp1S25kS25qUkx4YTgvZU1zN1V1ZmxIeUFMUXJj?= =?utf-8?B?a2V1cExZS2k2TG8weGJYbFZDeVk3d2Q5a0VKcVFVTStyN0FmMURaQm9sSmN3?= =?utf-8?B?SU03UHBHZVhRdUNtTGpNTUUzd0o2b3ZUcTNWSzRYVzhHVDJYZ3hkNU1VT3Ax?= =?utf-8?B?bWtLNS9XbDBIQ0tyMFBzQ3JDblpFdU50a011Q2k2VWlFTTFsK3J2YitDa1ho?= =?utf-8?B?cTg0czdmNHhIRWRwL2hGczY2MnV3aFJ1WDdTcWVGY1czd2hGSWJ5OWk4cUtv?= =?utf-8?B?UDRZL0NjemNTRE1qUFArTDVRTHZHYkpjT0NLSXFGUmp6aXdBWDQzd1MxMkFh?= =?utf-8?B?alFVaTA4Wi9kOTRKNmRqOTB1WnJia2xSaEQ4N0V6SXp5TjZvMmlqVXRjUjhX?= =?utf-8?B?NzFybXhMVTJ1NC9MM3ViUlJGQ01CMnVxRlVOcCtpQjlOTDNtU1VydkxYZ2Vj?= =?utf-8?B?T0xiOWcrY01kU3hoMm9iUG9Ba3FFaDJ4VHM1ZzgzTmxRMnpWelVmTk9WTmRa?= =?utf-8?B?WkV4c1VweDZDaEk5enlhSXRMbWdmRWxjcG4weW5zQ2t5WUJmS0JvSDJiSnlX?= =?utf-8?Q?CAwnKqoX8SOjT0AmfAB+DYSWVWgRw7sCdmKA/BHmYG4K9?= X-MS-Exchange-AntiSpam-MessageData-1: ExEOlUFlNde2pw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a4fa958c-ff2a-4f3b-76c1-08de5fda937d X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:51.7381 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yXksveCiodlzXoBj2RGJpdh4rxFGg8r1QM6QI+hL6IgqKr+d0o7Ir11REaowXd1sDTKcEeRHCq1ClkIEh2Z0Ew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5757 Implement Deref, DerefMut, AsRef, AsMut, From for various methods of decaying CoherentArray to CoherentSlice. This is so statically sized CoherentArrays can be used as if they were CoherentSlices by code that doesn't care about knowing the compile time size. This also helps avoid having to annotate static sizes on types all the time. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index f3920f74583a..25da678c863b 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -12,7 +12,11 @@ sync::aref::ARef, transmute::{AsBytes, FromBytes}, }; -use core::{marker::PhantomData, ptr::NonNull}; +use core::{ + marker::PhantomData, + ops::{Deref, DerefMut}, + ptr::NonNull, // +}; =20 /// DMA address type. /// @@ -389,7 +393,8 @@ impl AllocationSize for StaticSize {} /// # Allocation size /// /// [`CoherentAllocation`] is generic over an [`AllocationSize`], which le= ts it record a compile -/// time known size (in number of elements of `T`). +/// time known size (in number of elements of `T`). A statically sized [`C= oherentAllocation`] can +/// decay to a runtime sized one via deref coercion. // TODO // // DMA allocations potentially carry device resources (e.g.IOMMU mappings)= , hence for soundness @@ -402,6 +407,7 @@ impl AllocationSize for StaticSize {} // // Hence, find a way to revoke the device resources of a `CoherentAllocati= on`, but not the // entire `CoherentAllocation` including the allocated memory itself. +#[repr(C)] pub struct CoherentAllocation { dev: ARef, dma_handle: DmaAddress, @@ -857,6 +863,44 @@ unsafe impl Send { } =20 +impl Deref for CoherentArray= { + type Target =3D CoherentSlice; + + fn deref(&self) -> &Self::Target { + // SAFETY: `CoherentArray` and `CoherentSlice` are both `= CoherentAllocation` + // with different `S: AllocationSize` marker types. Since `Allocat= ionSize` is only stored as + // `PhantomData` (a ZST) and CoherentAllocation is `repr(= C)`, both types have + // identical memory layouts. + unsafe { &*core::ptr::from_ref(self).cast::>() } + } +} + +impl DerefMut for CoherentArray { + fn deref_mut(&mut self) -> &mut Self::Target { + // SAFETY: Same as `Deref::deref`. + unsafe { &mut *core::ptr::from_mut(self).cast::>(= ) } + } +} + +impl AsRef> for C= oherentArray { + fn as_ref(&self) -> &CoherentSlice { + self + } +} + +impl AsMut> for C= oherentArray { + fn as_mut(&mut self) -> &mut CoherentSlice { + self + } +} + +impl From> for= CoherentSlice { + fn from(array: CoherentArray) -> Self { + // SAFETY: Same as `Deref::deref`. + unsafe { core::mem::transmute(array) } + } +} + /// Reads a field of an item from an allocated region of structs. /// /// # Examples --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012008.outbound.protection.outlook.com [40.107.200.8]) (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 EE1C131DD98; Fri, 30 Jan 2026 08:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762174; cv=fail; b=UB9xo0wvdmPz2BF86vBTSebG+V22IPJHqKZMOoExlj3Ck24K89QQQSTsFNOtxMEkcE4ltejKfVp+A9VJmvlVejeIy8BbUnjiiFlWvslUuOuKyAfmOl5s0HV1b3vJnSxIbbtWDCqgb7kCuw+bHTEvxVrDutw6YZe0hyR3M6N3M+c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762174; c=relaxed/simple; bh=nC+eg0BfWVisbd2QyrQRNgh0WEIZPm18myHEDD7l2qU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=WtVEx8DYq8PvVdT9Fku8gxW9gXIhm1rcJjj18lE2JIOM2VJvOwmIpf2plTjkytM0ovnnjYkuVHBRVCV3wu/vaMX8X2pH6h26QVdyFqGd0BQ6ohaxEdTE4Yf0iH2yUGZh5DC4iJDv2j4DoxzS9eG6G+aqNxITeD7gGrZ7SYdXG8o= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=KZ4uZZe7; arc=fail smtp.client-ip=40.107.200.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="KZ4uZZe7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HZ9ZvZDzu5gTrJjVZTgVvoeplo0Ed6romHPMO83Wyg2wS31OGyb+y2cJGR4B/97GQRV0xrk54GUKKbgItKZ8D9mjyVWL7gWuJKgB4rABrmQf4fP+1L/QmhiBHlb3pO9IBTIfcErjWCtQRRILPVwVyY3gSooYnXU2oSHu0i2vZqtn0mAufOTptjbSWvzY+n4nv0+NYrdUyTGPb3/tItN3LU+2mpS++gosEmm9734hYAa/kNNbM+dNOoFhsTkWWB3c128+zFVbd+dhEPFsL/U531FEN+V7bMWIZEtbZZ60743EPBfyyRF2sUynFxES4eGq0gqaV0xcevXRsu2IO1KXBQ== 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=bL6qMUmKlSpzFDY01RRUeBe+aH23kOhTBbtZVLKQ4oU=; b=kLZ/7Cla6qSv0itPoTNukn+SmUwt98RIH8VSuWbwgZg0jS2q2lMJtULa+XXoNalkEbc0lTlU7/51NW8WtEoZWmqFYdzvENTyYKeb1uLXk+lL4BQqCtdSY6KomgDruB7Yu3DCTi5Z18aUkBkXjJJfLDHNWZaQfgV0w/sGp7geswkF8uh+nvauhvRNhMMjlLL2jHkFwbevcW/1OrjalClrBJ6REZ82r/JnvW7B3FE4VJTFMKtsqNIH1onZdMYXf/11pNJFZuzAUDO9AIms+7SrM28zVMpNpFPGVl15UcUpgdHCSMDlqWMTwiZrNx741ZmUraoTORF+vrd9KvTg9P7wtg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bL6qMUmKlSpzFDY01RRUeBe+aH23kOhTBbtZVLKQ4oU=; b=KZ4uZZe7qpikmpPhe0M+w1xmT2riddwgmM/wd0J19yekFogbTwKE7OgZ0YDiMspcIK2908WI21nkuRr+OpmzqouL5P7Vj/JzT9rkQEPWzhyF7V9XtwbP7BgERyfSbPW4F4EHzoy3YRZKDJokcdYwCgkbM+QBn5DU6TQ5cNe13q0EYIjS0Ko9nxMqnQf5o4QS+lydoY1DH5RQ9iQCYOz7P+kShAxpI1zaZCX0Vkh0MdYF21z9qf1Kmf8wXlvFK5iPNXgCdrGdyIcYKj6Y+2o2VSYjIDfHWrDwASxywrwC6qs3628O4WQJMP4Ms2ccx+pC4dH50ybVnLfSD09H2Rkgag== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH7PR12MB5757.namprd12.prod.outlook.com (2603:10b6:510:1d0::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 08:35:55 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:35:55 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:11 +0900 Subject: [PATCH 8/9] rust: dma: add CoherentObject for single element allocations Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-8-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0113.jpnprd01.prod.outlook.com (2603:1096:405:378::7) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH7PR12MB5757:EE_ X-MS-Office365-Filtering-Correlation-Id: 1d5b11e6-dfbc-4070-17f2-08de5fda95dd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?VC9ZRUxnWkFqRCt1a2lhdnVQWkhLK3orRE1MZU1NdmJlTWxBdi9zTDlwZkdF?= =?utf-8?B?RXhKTGg3TStybnA0UnIrNDAweVlOY0dpUCtkMEdwTE5PZTRPWUl6TmlPLzhj?= =?utf-8?B?cE1XM2JmVnBNeGpBbEhrUVBTbWFic1g0Rk1nTGRFa01teEY4bDVTWUc3VWs1?= =?utf-8?B?UDRoam1OdDNaNUtFYk55Wm9RK1RRZGZzczkzdWFBMzNuaVprMHBNSCswSEF2?= =?utf-8?B?K2x4ZHk3dTcxaGpLanQ4VUtkY3N4RUFPSTMzajhpWi9SSXhsejVpNElpR1Q5?= =?utf-8?B?cGk5RjRqbjAwZ0tJaFhJbTVSQ2NjQURuSXpIdW5rejRNb2JmYURCeXl1MnVJ?= =?utf-8?B?ck1rckI3NjNyTmdMQjdFWHZWSWRnWEx2QlZScGpTbmVteFFPcWwrUUwyVC9Z?= =?utf-8?B?QVM0OGY0LzU3NEhxRG9YNnFxVms5aUJVT1doMEJqSE96MnlPL3JnYlFtS0V1?= =?utf-8?B?cjZybUMzUm5KMU95NkpnUVpIRUJQL3JtT2pkN1JSV3ViMHlxOXE2TUNsOUVG?= =?utf-8?B?RlByNVJmenZqM1daWlorOE9hK29PWXhiZjhkRURYVmJRa3B6SUZLcGk4UE1r?= =?utf-8?B?ZE1pam9vOTRvVFRZOFl4L1pWNnFGcmRnRWxydnN3L3BaK2hjSFdoaDZERTRM?= =?utf-8?B?T3RpbVM5Z2VxdFBLVitRTzZyaldEcVpYdlF6ajVIR0srNy9TN3hBeWljQTJO?= =?utf-8?B?YWVrdEgrSnNISGNkbXgyTCtRMmk2bHl0NFlQcGQxMzh2SzdBRkNhNzVRWTQ0?= =?utf-8?B?NGMzV2JoV0hnUldTZkFXTmdlRWdRVGZiWUp2c1JHbFQxc295VW50NTl5SWd6?= =?utf-8?B?UlZBNFNLbldsV1ZKWC9BTEU0d2ZScjBNOWEvQ0hnVEtGSVc5Rm9mNUZ5akh3?= =?utf-8?B?MWNFb3lmQWE1ajQwbTZvRVZkbzFLaHFzY1QvcjNjQWs5VStjZnMyK0d4Ri8y?= =?utf-8?B?KytNT24wWUgzWHg2SlpyalZQOWFzaTY5RngwT0libTJ0cmk1Ymp6N0ZJWFRY?= =?utf-8?B?eFh1ditSUHQ3Ums2VXBDeEpEdGRHQkphUUpLbG5oZGtybldhTlNwNDZucXFL?= =?utf-8?B?UTYwRjZQVzNhMTIxTURHS0VlamNxZlJOc3BoUFpYbjJZUzVIdmd6dW1xem1i?= =?utf-8?B?L1JJcnlONGtySVdkME0xR3dObks1R2c0VmZxQUowTjFXRG16d25Ua0lTb0F5?= =?utf-8?B?QjZrYnlOdFF5R0JCb3dZdFc3RWxpWDZpL2NLQ1VSN1hwUUJ1dGlQd2ZMZENJ?= =?utf-8?B?MldGQzhjYkxsb1I0dGdlKzhNcU1Uc3ZZbi82M2NtRHhBSE8yMTViS0NSdEpl?= =?utf-8?B?aTNFYXFKZG16THdrNlBzY2czTmROeWpOdForWGF6ZjdMSWpJcFg0RlcycXdE?= =?utf-8?B?YnRkdElJUEJjOGVnS3FaTW1saTB6WkhINlowTG9zS3NEQmdjWElKNWZjbEhz?= =?utf-8?B?aTJkUU84YWZiZVJsd3B5NURGNFVoTlQ0Z0kyNEI2V2xQcUs5eEwvcmJORVJO?= =?utf-8?B?SmlFRmwvWVlJS0tGWllXbkZQUTNGR0dGbGRJaVpDd2J1L21SQjdtTVpwbG5u?= =?utf-8?B?dWlBOUFwVTJYQjJjK3lIS2x2Z2NBR0xackNPUmtoVlptemd3RmJjdkEzWXBV?= =?utf-8?B?Sjh2cU14WEpqRzJzVEZoUU5US0J1aDd0NDNXZlJDMHh6aW1iUllDdEZodWNq?= =?utf-8?B?S3FzdmYrK0NJVnhuMGdNc25YMzZUYVdFRmxpemo2QWQzU3Z1REM2dUl0eExC?= =?utf-8?B?VTBQbGlYY1BEOTJzaVRpVmJyYWtHTGtiVGIwVkF1a1o3VmlrZlpJWjJxWVEx?= =?utf-8?B?alRNZzlJTS94RzRES0pIY3B0QjFoVUFUWlJOYzl3YU9ZWDZGSUZab2k2MlFM?= =?utf-8?B?cEUzVUlyakU3Tkk4cktsYUJBTFE3RFc5YitzYUhZaXIwdm5nOTA1cVhoM0tW?= =?utf-8?B?b2dvR2lQZUh1K2FUVjMwWXVwNFFHeXZDeGxRb3ZMNGFwR3JiRnJ2Qks3WlJB?= =?utf-8?B?cCtJd3RnS2xMc2ZiMUtRVlNsTzVRdEkybzBVSjhqOWFCRngwRnlwUFRmT3JE?= =?utf-8?B?UGJlWXVhMTZ0cWdDWGxMa0ZPeHhRN2dnMWVCUnN1ekhjUE5xdXlzaDBRVE9m?= =?utf-8?B?eGQ2UnBJMHpDOC9peFROMkdyTzc3dlJPUWx0RE1EMWp3N3h1bHRBU2FURGhI?= =?utf-8?B?VGc9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NWdLTVJiZEFwT2xLVURUeWZmNVhZc3NUR2Jic3VCTWI2T29TVHhLTUc5TXdW?= =?utf-8?B?OXdBN2h5aUplZmpUR2ZGdkVDOVBmSVhwazI5WUh0UTdJYzhsVEU2QUViZWUw?= =?utf-8?B?b0xwS2RrRzRTdXVVdk1MQ2RuZnVEYkhPQm5EWllHSCtuanVwR3hSTUlXY2NJ?= =?utf-8?B?cGVjUFg3K0dVcHIzS2FvZjgrcGZTbHptNjl0bHNuNjdPSm5xM25YWUhEaUVN?= =?utf-8?B?Z2xaVlhBeDE3Y0hRKzk5T3pDWnFMZEtBQzBiRVREb081aVFWME1pd3dvRjBw?= =?utf-8?B?bHBWOUR4NXhrN0FJNW5EaFU4QW5oelFhWXBuWXcwR3ZXekFUTXMvZVR1ZkFG?= =?utf-8?B?NzEzeXI2Zi8yV0RsRzdBbzRoRDc0MmYyQlc4Q2NBMUhRK2daTk5PSURiZnd1?= =?utf-8?B?ZWhGeXpsN1lqR3kzODFWRi9hcjBZYkhtSXpCTTJ0K1YrZEV6dkJHUTdFYzN2?= =?utf-8?B?NFA2bU1Md0hQcXRJUmhoZFhURG10bEorVzQ1T2RFN3hIMHNxc2dFdVFwK1lk?= =?utf-8?B?bGtsbDhPM3FsTGJnbVRDU3h4b1FYMjU5R0d6U3cycGZOTEE2NkhzZVNnZmN2?= =?utf-8?B?THJNS01Kb29WMkRTVlh0RE9JcExPcmN0ejF5ZE40c29hV2c0L25vSkhvQjZn?= =?utf-8?B?NGQwajRyRk9YOWdSQjNEcHF4TForR2JPU1JaNVR5WGFhSUl2TVE3M2h4Mk9l?= =?utf-8?B?ODRLMDc0Yy9VVFFKaS9XelhCU3NNVDJWemN1T2s0a3AzeFJJMUE0OTcwcmlD?= =?utf-8?B?S2hCMUVaRklENlVuVUVLTUZxWFB0eUtMMXpBQjUxVFNpbEJBMEZBWDBpZWNJ?= =?utf-8?B?YWV4eUxVL3c0N3kzcHIvK1E4L0xJWmI0UnQrcGIvWDJmWitnNCtHOFh0SFN5?= =?utf-8?B?RkxTcm5iL0RDNTc2czl1SUpOVkV3aUkzOFEvRThVMmh1YWV6c09oM3E0QlZO?= =?utf-8?B?NlB0cFF5ZDdQSDJrbCtxY2M5MmZsMXFTZ0dqUi9BRk0vdytsc2RsUzZzcXcz?= =?utf-8?B?Qy9WU0pGakNkQVVQM2NhT2M3ZmQxNXo1YVp1ZFF2ekRhTWxla3E3TmtBQi9W?= =?utf-8?B?YjhQaWJORFVUN3VhVk5NTXpIamlLUFoyZVVkVGxRYUVGaGxZdGRBVzBGOUw5?= =?utf-8?B?SnNTMTMvbURWMXlvdzhjc3pQdUh4SG95S3hQNmJGcWtwUUI0WFAwcXcreG5r?= =?utf-8?B?eGlDR1BVb1gydU5qREwzRUlhY3ZFL0R2RzB5RDBXTmZSYmN0akErS1JaUUQx?= =?utf-8?B?RHFxVndzNm5Zc2lQdjcvT3VEczVpVW9XeXUxZEFkblU4WUJSdWVIT2dFM1Nw?= =?utf-8?B?ZGJMSlJIRXk2em4wdjkxTFNKOEVyVmFyVWlHaUc2OVJmQmFsTXk4emh1aHk2?= =?utf-8?B?eThjQjBmWVBiVFR3SS9jUFhtNnBjVjAxYTlKMEd4d05DY1B6VWZQTjgwY0Fv?= =?utf-8?B?RHJZUm1XbUVQSzBYb29uMmNsWjRqb1JOUzE2NGlScW5jcGo2eitSdUpqd2pz?= =?utf-8?B?Nm0vRHVnbXk0TERUdEZoSEI5Nyt1N2s5cUh1L2xFeTdpRU5MS2FQRVB5S01Q?= =?utf-8?B?Q25kbkloemhZc0pTbEN6YWNkcUJXemQxelNNek1Pd2tXcWNySDJCbVgvU1ZU?= =?utf-8?B?V2dmb2YrcXpud2R4Q3hXTkphUjRWdGRpWE1wdk1aZUViNFNIMmNaV1Y0Q3Fx?= =?utf-8?B?aEFlWjZ6cHBJcjFRSm51RlNFNUFFOVFWNTlyOU1IbGloMHFVK3dMRDdKL01W?= =?utf-8?B?OEY0bEhJVWN4cFd2b3prRHNqcXBhSmdRTU80dm9hTDQwK1BkMkV2Y09pRGFB?= =?utf-8?B?Ty9Ba0dZSkh0cXhkRzJIS3J6WFpXUEhkbFg2eitmTmVWQ0EzdkRnRHUwcUFq?= =?utf-8?B?cmRCRUluajlSMEw1V2RDSVJXOC9DY0NOWGpialExMXBLRGhqRmdISXNvU0Fu?= =?utf-8?B?UkV6dGV1MHJMSkFNSlhQWkZPc0Fhb3JCb2p1TFFBUWhWMDVINkJ3Zzg3OGtE?= =?utf-8?B?U3drUXRxTGFqdjJ5ZVBveG1XK1pZOTl3OUNteTNhV3g0ME1UdGJIa0pUNmpa?= =?utf-8?B?R0QvclVQeVAzVDhCSnd1TGhyZDlab2ZDdzBXWkE2R3FUeVNSU0R0aEowZXlv?= =?utf-8?B?akNxWDV2d2JSS2RBTlRxSVdKR251QldLRWhNbTJVRElSWjdUM2x1STZGQzdr?= =?utf-8?B?QmJCZG5ta1YydFcvSnorYkJWRC96bkxnMU9ha1Rwb3duMHdJSHJLUUt0YS9G?= =?utf-8?B?ZWJabGFPR1NHVkdFV1lBSnVEa0NKUTdiL1p3Um9RL2t0YjRLNENlc0RqVHBI?= =?utf-8?B?TTNmRzRucUg0bjVJMy9OengzZ3lSdE1DdC95ejBtV1BaRk5mTTdLNXNzdVFY?= =?utf-8?Q?qaTTfg4edt8e3GN4oth6nW71jD2Uog9HFDZBE90chvwn0?= X-MS-Exchange-AntiSpam-MessageData-1: k/sfzKP5Q1my2A== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1d5b11e6-dfbc-4070-17f2-08de5fda95dd X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:55.6526 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: gFaUMqRbJTLPC34Gg10aOCjdsaadxkXotCzwZqyJ7EhnooM7/dt0uZUVQ3AD1Pp1CAQso2jlgW5TWUvIM15IPg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5757 Add a type alias for convenience and readability for single element allocations. Signed-off-by: Eliot Courtney --- rust/kernel/dma.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs index 25da678c863b..120fc01e57a3 100644 --- a/rust/kernel/dma.rs +++ b/rust/kernel/dma.rs @@ -423,6 +423,9 @@ pub struct CoherentAllocation =3D CoherentAllocation>; =20 +/// A coherent DMA allocation for a single object. +pub type CoherentObject =3D CoherentAllocation>; + impl CoherentAllocation { /// Returns the number of elements `T` in this allocation. /// --=20 2.52.0 From nobody Sat Feb 7 15:11:18 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012008.outbound.protection.outlook.com [40.107.200.8]) (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 6834E32D0EA; Fri, 30 Jan 2026 08:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762177; cv=fail; b=ZbSJ4JnsIhqgZhmcjb15gDknfcxAVzUt3V7wlQEyPn+5qcZJXrSMy93d+bmQvPe5m0XQtE/Isty+J4Giz6SJpjeMmV37P7y1awBrVb1C19AYT/6PVrgNKoVsRgWUsYkwEtp+ihQjygaRlROFDXKAVraKM+0EXQJaOMh54TsYvGE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769762177; c=relaxed/simple; bh=8BTq+uJAM5CT6P0YkTkZ6R/jL3+J+rFOP28wgokpu3Y=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=fXgNVCR22Dc/nbXiwnGZo86SgwAyY1JxJrcEGOE7Quxy3McHJffJVA84QB4QWpfhHTefJMwuxwlgJrN8DhAGVlRHO5hL60T7wyYO7VZTQTpCSi9Yn8mAtHtREcZgVJWv+IMULLGbgn6UaRntkpOYmOOEKYY+5wvnQx2Z/M5idgo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=mbg6nCIn; arc=fail smtp.client-ip=40.107.200.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="mbg6nCIn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eA0O+z12YDh6PZQM7qxdcQ7axIjKwPClyGLORwbQ9dmcgLpHOUw3Zr4I+MSICvT1LbZS+1jlqAzATQMArvCZx4Nn+UV5UaaApcrgBBw8Z7AcIK+tUMnLRO33imu6dPp2bLCfwAtXkYyUAN6v+QaIEdZV3gLQgk7fyq5vOYB2BtEOK+NReX+58BCJUjudvv8632RDRdCGMbNV1TRY911J69bj2VxU2uZ+1LwMKINQL90R1GHzQvz4GB+/gZCXQVoy4U+670a6vu1Lc8QAZslRfsy2794F+fgxYHhsCinPoinATU1z9zW9GBlgDMYjeeiXK4J1x+6/rKX404HjQH8+YQ== 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=9Lqhq+72C2e8wtc+h/gNYzX2Aqwy7FdRMyOTEbJ6Lpo=; b=oDX+wzspFlduKihcIEwzCj3//lvDjAtkCi8ni5zEvWadCurSY/m4kXhCBybyLmlN6bQSH7mxS/lilsfXcbjUbOiMVIeeufMw5bNZ1f2wtPzxwOHZHSbJT/G+xcbKkMh8OruBPHpJGJ8fePePDoLEa08nHXD/5fQ3nnf5QKNVOT7TXSgP1wm3Ha9NXsiWDxroUcURxejXzfGh4CXrsuP/GsRI4YSixWiZorl+IxWnkC+yIjC9qyYq4RcKqmeAnOpeiY5cAFhSOLtE/hsB1ZdwzTxDg30QWdGLVzYHuKdscVfa6zqSv+bUdYNDk74TvPdU/ho9c4zHN1NFcIm8OUgqyg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9Lqhq+72C2e8wtc+h/gNYzX2Aqwy7FdRMyOTEbJ6Lpo=; b=mbg6nCIn6jiCBQdDzTeZCAaIJL1AOT0wX1qV6Txn39ipq/88DLw1mw1HX7fMIcKXsrQaKJ/2WGOcLRRIshaXmI3qc+gKPNwu93DOXrHxLSsf0t4o05mKMVdDCodfzZUkpfIPQt0JfXtefOm9Q5HQHSp2W3NQViaNaq/Eop/pEupcn2zCsSx2Z1i8RQ7RqxGuHwhKt9zB+lCm7Q6+YzhCePLR9e4EuGYXCzk5PC9sS5dls6KAeAQNMY2avrlrtMbzm34XVgh+Okoxqz2Zq97Yt7w91IooQ2aBpdkFHx2xrET7aRHyyYOYZVYPrJ3HStMbJyUfP9DJpoEhLS1zrbADgA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH7PR12MB5757.namprd12.prod.outlook.com (2603:10b6:510:1d0::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 08:36:09 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%6]) with mapi id 15.20.9542.010; Fri, 30 Jan 2026 08:36:09 +0000 From: Eliot Courtney Date: Fri, 30 Jan 2026 17:34:12 +0900 Subject: [PATCH 9/9] gpu: nova-core: migrate to CoherentArray and CoherentObject Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260130-coherent-array-v1-9-bcd672dacc70@nvidia.com> References: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> In-Reply-To: <20260130-coherent-array-v1-0-bcd672dacc70@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter , Abdiel Janulgue , Daniel Almeida , Robin Murphy , Andreas Hindborg , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Trevor Gross Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, driver-core@lists.linux.dev, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCP286CA0130.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b6::12) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH7PR12MB5757:EE_ X-MS-Office365-Filtering-Correlation-Id: 4e297311-f88c-412a-abde-08de5fda9846 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016|10070799003|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?B?eWFyZlpXRUdEemNzZkVINTV2S1dUQXhlZEtFNFE1SkoxQXlUYkVIcUlDTmNR?= =?utf-8?B?WHMvelc5c2lMSVlHNVd5a09xT2hKQWI5SWRVWTdwT0hYMjN2djFOTXZ3dnVE?= =?utf-8?B?NHZ6b0U2czdDanZBRUtGUTAvWjFkMnFQMWVEUTd6OExjQXRUcVl5UW1vaTdt?= =?utf-8?B?OXJPbm9OM1JveXJLVE1EUldicFlrWkpCdS9zZk5yT0N1UWtCbFBPMERVRjVs?= =?utf-8?B?SzcvUXNYeEhoUUprL2ZTcjV0aGpJcjZzTnFqVjBaWnpHUnBrTDBmVHUvQVVv?= =?utf-8?B?V0k2TTlTbGZ5WjBrME4yRU5jRDhHMkZhVmFCdVVMdUpnTUg1SkdmNGU5RmZw?= =?utf-8?B?U3I3eEVjWGlXeHpqaGNmVzB3dU1MdEliNlFKL1ZhcDFVdlRaL2ZURHdJeVdU?= =?utf-8?B?RWh2eWVaRlJuc1Q5YWppbWlwUDR4QTJDbTlNQjJEdEllUWFNTTU5azdlSTFD?= =?utf-8?B?RS91WHl4Z0hLZ2xsa3pFM3p1Szh1Zllrd1JHVFpIS0VFOXBlNER0VGRoRlJl?= =?utf-8?B?c0wxR295MzRXdEhlamE2WGtsOXlKaDhrR3ZRSE40Q3BhdUVSeDRyeDdRMWNz?= =?utf-8?B?N3h0T2I5Slc2YlUzMk5jdTJYbXVkVWpNS3dKVWdRbjhOYjRWZVFHalRMbUNr?= =?utf-8?B?TDlzTDZyZkRZaUs0Qm1JdlRDL2YxMjBVZzNIUnRXY0VMNlh6TmRkUXUwMk5a?= =?utf-8?B?eTJnNmk5aUFOVndteG5JQkpHblZlY1UyL0lDTGhUQmpTQUhrNFFVMHQvQjVI?= =?utf-8?B?SE9yOGtOeU5yc2RiUDZ5S3pmQkhMMXhJUGVXdS8vdlNWaTV0ZWNqTGNac0w4?= =?utf-8?B?OWUxbzQrdkF5OVNXTFRKRzFWYXhCSVBUbnQxWGQyVkNJaXM5SkNRSXptU1FB?= =?utf-8?B?WVlKYXZkc041YnZodWRzQ2MyQTRYZVZvdWE2dnRTL1ZhZnU2QVpkdUlvSnNY?= =?utf-8?B?cms4U3BINXREMzl5SHU0MVNIS1owNFRQbTJVVDdSeEJUMnNPTkV3ajczMWNC?= =?utf-8?B?ZGhnSC9UeGZnclBzUEltclNRT21oZm1BUTQ0VUIrNmlvZzFwd1pmMDl5R3pX?= =?utf-8?B?bEZDcldQSjlqaThmMSsvbllMOUZmUlkyMFlySFZRSFNONFVqTDQxTkdJVHds?= =?utf-8?B?NytrMnhwdkNrZEM0NU5QWk9DOFdsLytHQzF0UTBUWFZqbnBNNVJVZXZva3VM?= =?utf-8?B?SUQwSjJ0RU5hSXFDMHNIQ1RPd01tcllGOVhCd1gybVlMbXRFOHFWMWZxUUsw?= =?utf-8?B?dWY0c2U3cWMyUUU5TkFkL3ZPU2ZKSlY0QkdOZmxxWXQvdjd0aWVuY3ZLZ3Zp?= =?utf-8?B?NU9OcEVRdzEzbUdNYktXLzVOQ2tkdkR3RXBJYjlCMHdrZ1l5ZnlrYU9ZWnhR?= =?utf-8?B?TlQxQzFRZjNEMzZDZWNkcjhkM3BLTytySVlNVTBWY0hBQ2F2YW5FYWgyWWF1?= =?utf-8?B?K2RxbkhuNzMxQ2lhb0JWcWdrTTBVTG1vdCtFV3Q3Vk8zSXlrVnkraUE1cm40?= =?utf-8?B?Rnkxa2hrdGExQVBvYkxLRUN0bWtTVkJUUmE1RHFEVmE1MlNKQmtwL1ZtcDhp?= =?utf-8?B?dUtHeUVNMzdQY3RvajRwVGkxZnBVdStPZEorRk16THIrYzJncWNHUHpaUDhC?= =?utf-8?B?S29iQjhXekw3aFNhZUtvbTIzMVNocE4rQVZWR2RpYi9lQ1lFamZWdlI4SWV4?= =?utf-8?B?N3JmZHdLWkl1L2s4cHNkUnRIL0krcFdaRnNJVnlDWmhHZDc2Y0kwdldSSVhj?= =?utf-8?B?Umo5a21jcUQxMmttL0VtWHhlLzEvSUNYMmZqdndMMnc5aEJKWk9YUEZGQlYr?= =?utf-8?B?U1lIYXMzU2JIUEh5aThkYll4QU9Nb0pIcUNOQ1ZyQUJYZkFpKzJ6MnV4dFpj?= =?utf-8?B?TThLMmlqeWpiVStkUGZLTERYUWZ0eTBrN2pLajQ2WmYrcFZ2QS9mUm9nUnk4?= =?utf-8?B?MFpTT0JHNHhoZk9Ja1BiMWEvcXl4WmtQWnJ0REhnaEJQTi9ZVmFqQUI5U2hy?= =?utf-8?B?akZqajNicndiWWlOdmo5cHdPMTBCUVMxRXpXZXV5VlVYT05oU2Zqb2FuOTdo?= =?utf-8?B?WmJBQkJQWmEzSlNzRTRwNHV2V0pDSStZRHExWmJ4UG9GMStJaTRpdFpBTGk2?= =?utf-8?B?YnBOdWRlUnQ2VFdKZGdPRDF5SFFGTGdiNU1aNk92ZjVWc2VKUHlPcGhUVUdX?= =?utf-8?B?RkE9PQ==?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016)(10070799003)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?NmtLL1VocEhhR1lOZEx3dENaRGRaTjZsc1ZtVi94dzYxSW1KWVNNV0tJbWEv?= =?utf-8?B?Z1BTU1YydVRPWjlyaVE2L0t5RXdvTXlORWZFQlB4RHhuWTUvZnVaaUNrNGFL?= =?utf-8?B?NDY2N0tnbEJSSG94cmFyU3ZhM2RFbFFOVEUxeVU3Tk1YbjB1ZmwzS1VWMExw?= =?utf-8?B?a0JlTnkyTnVrM2EwTU00bEhxWmxJSkUwTTJwNGIreTJUaXRyWUh1K3lFR0p3?= =?utf-8?B?ZjhrbjltQ3pmamlmby9mRTVYSllyd3MveXFZZkVLOGFwc0gzTi9UUGR1NSt0?= =?utf-8?B?dmptUGlERkVpc1ZYV05OdWJEYTljd2NiR2R0ZVlXbnZHdzFJQ1IxNVdLL3l6?= =?utf-8?B?MldDWlpVeEs3SG5uY3VwQ0QzMGttdHBYNTBlKzZFSzNMQlhHc0p3TmJsL2hm?= =?utf-8?B?R1ZkOVlKdFk0TlZLSk44WitzOWc1Y2lvOVFRMGVSNGUwQnZwOVNSZVNhQ0FR?= =?utf-8?B?NkFPY01XSUxGdjA1RmJJZk1hMFgvdmoyUkNGZkNoLytocUJocW9KcVR2TjFk?= =?utf-8?B?SGtjU3UzVUNiclpBcncxd1dBa0o0ZndWZ3E2RVcydXgzc3VyTXJsWkNHbVd5?= =?utf-8?B?azhVaDdQTENaRE9VUUpkRmVWM2lKdmNPbFlmeWRJYTduVHc3cTZidnhaZmEr?= =?utf-8?B?VzIxNkNVSjkwOG9FTkJRajJuSkhicTN3MkhoOENjOGErdHJWbXBxTk8vdTFw?= =?utf-8?B?WEhLOVNRcWJPL201a3pXRmtrdWQvMHVsUmhQd04zZGc2UlN0VGF2S2o3Y09B?= =?utf-8?B?RGxrSlhnOHQ1NlY2OTVHYVdMZlFYeUZsM01OaXpQUkFMbEd2Njhaamk1aHhk?= =?utf-8?B?enJWbmpONlUzUDBQS3d0OXhYK05BWG42TTJyekdqT2dLbHFsV25INHcyT1E5?= =?utf-8?B?ZmxVdkl3MitncE90V3pxRlZ2YksyN2lSdFdkOGQ3RExwNmFoYWtJd0cyUTZv?= =?utf-8?B?Rm5mSVpxVnAyS0FiWmV2dC9ERkFvRHByM0p3dkpYbFZtbDIrbmhhaXFkVk5l?= =?utf-8?B?WVh6RURBdDRUT0xiOTFpVmtmTVRxUU5WaVVmaGpBbW5MK2ZTWVgzMkNNK2h6?= =?utf-8?B?K25Ub1ZTbHdjWm9NdGNGTmZwVU5UZGJKR2dYbDFXSHVhaFl5ODhEV2t0U2dY?= =?utf-8?B?bnJvNTcrRzdDTEY2V3E0UkVvVWwyNVNNaGpMdjZ4RTlSNnJvdXZ4K0VaejVF?= =?utf-8?B?N1NuTnRNNlNyY2tLdkl3MzJPSk5CLzRuem9jajZtSUt0a045V3diK1Ixd3dh?= =?utf-8?B?YWNMWnUxR29OT0NJVlRpWHRQRzJTZU80d2puQkZLdzUwZG91NndrbG9WaXpi?= =?utf-8?B?RHBhaFQxRUlzcEQzMnhwMGpxRWE0ZVB0dEZKTEhBUFJ1dHZQRlRtK081Z2l5?= =?utf-8?B?NVJ5YURDdHdQOHdoVWVNU25CTHkrVDRGOVJyb2pralZLZ0xDZDFyam5tSE1i?= =?utf-8?B?MkZ4TktSTUxRRndFWmVxdG1VUWtNc094cmNnaHJ0WFNsR0FaUmV5cFA5aXhU?= =?utf-8?B?aXcxZkFjSndYSVpsTTc4ZGVUR1hnaWpxWThCMEhHbjNZOUtYaFVxM04rcUw2?= =?utf-8?B?MVhQc0JoMmFCVmtZOFliQnUycDQweFRUSTZSTks0bG13Q3hPcEVRd1BFZnJp?= =?utf-8?B?dnIwMmMyd3VxNlhpVXVOZHpHT1U1Vm1KUUdSSkJxaVBGd3VyS2JPaFUzaDAv?= =?utf-8?B?OHpmbFhBUGlqUFdBSy9sQUd3dFVycjM4TEFLUmlZaExVY2wzT3lwV3FRRzVL?= =?utf-8?B?R0o0MHpzNmJEODhqTFpyMWlIdmxRaEJnVk93TkpaWVBWeTQwQjU3Z3F1d01y?= =?utf-8?B?REhyNEc3Z2x1NnFUMjVFZW1ZQXB4M2ttb1BUT2ZhamppcU4xbWdseTJwL1cv?= =?utf-8?B?dVFqa0ZrQU9sVUZmbEE3Y2QvbVRZdTZOQlNRcmxadVFGWndlTUx6ang2dlgy?= =?utf-8?B?RlVib1ordFRFVUxZNUZBM3BONkxud21CQTdnUlJZeUR6bS9Ca2JzeVdhWkgy?= =?utf-8?B?emhMeXRENjZSVVdEQ2JrZWZrQVhBa0hvb1Y5NXNoenNONFZCdWpNOEd5ZjdG?= =?utf-8?B?N04wSEp3R0lnRExLYlJaemQ0TWJWTmJ5ZHZwbUJRK2FTdDRKeGdlYUxXcWVE?= =?utf-8?B?MkpvV0ZzazVncVNVQ1gxR21GSmpLMDRzQTVCbDgzUysyUy85cWNpQWpXbDU0?= =?utf-8?B?ODR5WXdISHh5M2pvVGlzZGVsMkJRQjdLclozMjhSY2hpbExMUlV4UmtJWHor?= =?utf-8?B?ZGlzZDhyQ3QyUnlxem1PTmwvRmxnWnJEUUgrdjRsQWFBZEJ6RUFPUVNFUG93?= =?utf-8?B?WVczOVZGVkFvMHZManNJUFdRTDd2MXVLcEM0MlVKR0g1SXcwWFUzSWJyWjhI?= =?utf-8?Q?LqB+oW/ssvbuGQZgfjym7OmrEHi9k3LUedm0Ea+5U1Iwe?= X-MS-Exchange-AntiSpam-MessageData-1: QwSJSyFNTvKMpg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4e297311-f88c-412a-abde-08de5fda9846 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 08:35:59.7957 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: EOuS6oJfx5fSQklqbSKtZiCCz6X3RJwu0DUnl4xkdQT6FJcfB2mcTM7I3UDDBUpFJo6K0FMrlrXnFWU7CnVnDA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5757 Migrate to CoherentArray and CoherentObject. This enables removing a few unwrap()s. Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/gsp.rs | 46 ++++++++++++++++++++---------------= ---- drivers/gpu/nova-core/gsp/boot.rs | 10 ++++----- drivers/gpu/nova-core/gsp/cmdq.rs | 24 ++++++++++---------- drivers/gpu/nova-core/gsp/fw.rs | 12 +++------- 4 files changed, 43 insertions(+), 49 deletions(-) diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 43bc35fd3b55..2513822d43fb 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -5,13 +5,15 @@ use kernel::{ device, dma::{ - CoherentAllocation, + CoherentArray, + CoherentObject, + CoherentSlice, DmaAddress, // }, + dma_write, pci, prelude::*, - transmute::AsBytes, - try_dma_write, // + transmute::AsBytes, // }; =20 pub(crate) mod cmdq; @@ -74,14 +76,14 @@ fn new(start: DmaAddress) -> Result { /// then pp points to index into the buffer where the next logging entry w= ill /// be written. Therefore, the logging data is valid if: /// 1 <=3D pp < sizeof(buffer)/sizeof(u64) -struct LogBuffer(CoherentAllocation); +struct LogBuffer(CoherentSlice); =20 impl LogBuffer { /// Creates a new `LogBuffer` mapped on `dev`. fn new(dev: &device::Device) -> Result { const NUM_PAGES: usize =3D RM_LOG_BUFFER_NUM_PAGES; =20 - let mut obj =3D Self(CoherentAllocation::::alloc_coherent( + let mut obj =3D Self(CoherentSlice::::alloc_coherent( dev, NUM_PAGES * GSP_PAGE_SIZE, GFP_KERNEL | __GFP_ZERO, @@ -100,11 +102,14 @@ fn new(dev: &device::Device) -> Result= { } } =20 +/// Number of `LibosMemoryRegionInitArgument` entries that fit in a GSP pa= ge. +const LIBOS_REGION_SIZE: usize =3D GSP_PAGE_SIZE / size_of::(); + /// GSP runtime data. #[pin_data] pub(crate) struct Gsp { /// Libos arguments. - pub(crate) libos: CoherentAllocation, + pub(crate) libos: CoherentArray, /// Init log buffer. loginit: LogBuffer, /// Interrupts log buffer. @@ -114,40 +119,37 @@ pub(crate) struct Gsp { /// Command queue. pub(crate) cmdq: Cmdq, /// RM arguments. - rmargs: CoherentAllocation, + rmargs: CoherentObject, } =20 impl Gsp { // Creates an in-place initializer for a `Gsp` manager for `pdev`. pub(crate) fn new(pdev: &pci::Device) -> Result> { let dev =3D pdev.as_ref(); - let libos =3D CoherentAllocation:::= :alloc_coherent( - dev, - GSP_PAGE_SIZE / size_of::(), - GFP_KERNEL | __GFP_ZERO, - )?; + let libos =3D + CoherentArray::::alloc_coherent( + dev, + GFP_KERNEL | __GFP_ZERO, + )?; =20 // Initialise the logging structures. The OpenRM equivalents are i= n: // _kgspInitLibosLoggingStructures (allocates memory for buffers) // kgspSetupLibosInitArgs_IMPL (creates pLibosInitArgs[] array) let loginit =3D LogBuffer::new(dev)?; - try_dma_write!(libos[0] =3D LibosMemoryRegionInitArgument::new("LO= GINIT", &loginit.0))?; + dma_write!(libos[0] =3D LibosMemoryRegionInitArgument::new("LOGINI= T", &loginit.0)); =20 let logintr =3D LogBuffer::new(dev)?; - try_dma_write!(libos[1] =3D LibosMemoryRegionInitArgument::new("LO= GINTR", &logintr.0))?; + dma_write!(libos[1] =3D LibosMemoryRegionInitArgument::new("LOGINT= R", &logintr.0)); =20 let logrm =3D LogBuffer::new(dev)?; - try_dma_write!(libos[2] =3D LibosMemoryRegionInitArgument::new("LO= GRM", &logrm.0))?; + dma_write!(libos[2] =3D LibosMemoryRegionInitArgument::new("LOGRM"= , &logrm.0)); =20 let cmdq =3D Cmdq::new(dev)?; =20 - let rmargs =3D CoherentAllocation::::alloc_coh= erent( - dev, - 1, - GFP_KERNEL | __GFP_ZERO, - )?; - try_dma_write!(rmargs[0] =3D fw::GspArgumentsCached::new(&cmdq))?; - try_dma_write!(libos[3] =3D LibosMemoryRegionInitArgument::new("RM= ARGS", &rmargs))?; + let rmargs =3D + CoherentObject::::alloc_coherent(dev, GFP_= KERNEL | __GFP_ZERO)?; + dma_write!(rmargs[0] =3D fw::GspArgumentsCached::new(&cmdq)); + dma_write!(libos[3] =3D LibosMemoryRegionInitArgument::new("RMARGS= ", &rmargs)); =20 Ok(try_pin_init!(Self { libos, diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 69e2fb064220..7888a39356f3 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -2,12 +2,12 @@ =20 use kernel::{ device, - dma::CoherentAllocation, + dma::CoherentObject, + dma_write, io::poll::read_poll_timeout, pci, prelude::*, - time::Delta, - try_dma_write, // + time::Delta, // }; =20 use crate::{ @@ -159,8 +159,8 @@ pub(crate) fn boot( )?; =20 let wpr_meta =3D - CoherentAllocation::::alloc_coherent(dev, 1, GFP= _KERNEL | __GFP_ZERO)?; - try_dma_write!(wpr_meta[0] =3D GspFwWprMeta::new(&gsp_fw, &fb_layo= ut))?; + CoherentObject::::alloc_coherent(dev, GFP_KERNEL= | __GFP_ZERO)?; + dma_write!(wpr_meta[0] =3D GspFwWprMeta::new(&gsp_fw, &fb_layout)); =20 self.cmdq .send_command(bar, commands::SetSystemInfo::new(pdev))?; diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 9c94f4c6ff6d..845c9e176b93 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -12,9 +12,10 @@ use kernel::{ device, dma::{ - CoherentAllocation, + CoherentObject, DmaAddress, // }, + dma_write, io::poll::read_poll_timeout, prelude::*, sync::aref::ARef, @@ -22,8 +23,7 @@ transmute::{ AsBytes, FromBytes, // - }, - try_dma_write, // + }, // }; =20 use crate::{ @@ -191,7 +191,7 @@ unsafe impl FromBytes for GspMem {} /// pointer and the GSP read pointer. This region is returned by [`Self:= :driver_write_area`]. /// * The driver owns (i.e. can read from) the part of the GSP message que= ue between the CPU read /// pointer and the GSP write pointer. This region is returned by [`Self= ::driver_read_area`]. -struct DmaGspMem(CoherentAllocation); +struct DmaGspMem(CoherentObject); =20 impl DmaGspMem { /// Allocate a new instance and map it for `dev`. @@ -199,13 +199,11 @@ fn new(dev: &device::Device) -> Result= { const MSGQ_SIZE: u32 =3D num::usize_into_u32::<{ size_of::()= }>(); const RX_HDR_OFF: u32 =3D num::usize_into_u32::<{ mem::offset_of!(= Msgq, rx) }>(); =20 - let gsp_mem =3D - CoherentAllocation::::alloc_coherent(dev, 1, GFP_KERNE= L | __GFP_ZERO)?; - try_dma_write!(gsp_mem[0].ptes =3D PteArray::new(gsp_mem.dma_handl= e())?)?; - try_dma_write!( - gsp_mem[0].cpuq.tx =3D MsgqTxHeader::new(MSGQ_SIZE, RX_HDR_OFF= , MSGQ_NUM_PAGES) - )?; - try_dma_write!(gsp_mem[0].cpuq.rx =3D MsgqRxHeader::new())?; + let gsp_mem =3D CoherentObject::::alloc_coherent(dev, GFP_= KERNEL | __GFP_ZERO)?; + let ptes =3D PteArray::new(gsp_mem.dma_handle())?; + dma_write!(gsp_mem[0].ptes =3D ptes); + dma_write!(gsp_mem[0].cpuq.tx =3D MsgqTxHeader::new(MSGQ_SIZE, RX_= HDR_OFF, MSGQ_NUM_PAGES)); + dma_write!(gsp_mem[0].cpuq.rx =3D MsgqRxHeader::new()); =20 Ok(Self(gsp_mem)) } @@ -223,7 +221,7 @@ fn new(dev: &device::Device) -> Result { // - The `CoherentAllocation` contains exactly one object. // - We will only access the driver-owned part of the shared memor= y. // - Per the safety statement of the function, no concurrent acces= s will be performed. - let gsp_mem =3D &mut unsafe { self.0.try_as_slice_mut(0, 1) }.unwr= ap()[0]; + let gsp_mem =3D &mut unsafe { self.0.as_slice_mut::<0, 1>() }[0]; // PANIC: per the invariant of `cpu_write_ptr`, `tx` is `<=3D MSGQ= _NUM_PAGES`. let (before_tx, after_tx) =3D gsp_mem.cpuq.msgq.data.split_at_mut(= tx); =20 @@ -258,7 +256,7 @@ fn new(dev: &device::Device) -> Result { // - The `CoherentAllocation` contains exactly one object. // - We will only access the driver-owned part of the shared memor= y. // - Per the safety statement of the function, no concurrent acces= s will be performed. - let gsp_mem =3D &unsafe { self.0.try_as_slice(0, 1) }.unwrap()[0]; + let gsp_mem =3D &unsafe { self.0.as_slice::<0, 1>() }[0]; // PANIC: per the invariant of `cpu_read_ptr`, `xx` is `<=3D MSGQ_= NUM_PAGES`. let (before_rx, after_rx) =3D gsp_mem.gspq.msgq.data.split_at(rx); =20 diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index caeb0d251fe5..1877b727cc22 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -9,17 +9,14 @@ use core::ops::Range; =20 use kernel::{ - dma::CoherentAllocation, + dma::CoherentSlice, fmt, prelude::*, ptr::{ Alignable, Alignment, // }, - sizes::{ - SZ_128K, - SZ_1M, // - }, + sizes::{SZ_128K, SZ_1M}, transmute::{ AsBytes, FromBytes, // @@ -652,10 +649,7 @@ unsafe impl AsBytes for LibosMemoryRegionInitArgument = {} unsafe impl FromBytes for LibosMemoryRegionInitArgument {} =20 impl LibosMemoryRegionInitArgument { - pub(crate) fn new( - name: &'static str, - obj: &CoherentAllocation, - ) -> Self { + pub(crate) fn new(name: &'static str, obj: &Co= herentSlice) -> Self { /// Generates the `ID8` identifier required for some GSP objects. fn id8(name: &str) -> u64 { let mut bytes =3D [0u8; core::mem::size_of::()]; --=20 2.52.0