From nobody Sun Feb 8 11:44:15 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