From nobody Fri Apr 3 22:26:30 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011018.outbound.protection.outlook.com [40.107.208.18]) (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 806F839098C; Mon, 23 Mar 2026 11:07:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774264077; cv=fail; b=rtJwgFDS4tw8neP6Ub7pTJ9JmR9gEBqQoe9WbaSGhUxP6phm5HS4Q4E3lpYCkTIGOX89JqfXg6k/tEtWq/nN+qZHFciFR0JVlPU+WxCPW/0skoWwscQKnyPYtU3URcv9QiSpOmsNcWcmJvr9QSaenO5QeEy1CJaTS64L5kcTcJk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774264077; c=relaxed/simple; bh=4J5BNl/JUTp8d4neKEm45cMLTbv6qbpyPnXUHWR1taQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=K8GQjEgpoBWNm4OrBSy+JVKR2rxokdjpCC29HSlus/aOBiSMI8EpqRBdRbz4qRcH3uqU3DmLL7P8ZCluDrHGKbQzSAhuWWQeye2aG3Teopz2a3s2Py9jV+ZyugqyXoDg8FQD31aPFG7dQkbUfuVF+ygHA9C6AXo/eDNy8a6/6zY= 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=f8Tq2syZ; arc=fail smtp.client-ip=40.107.208.18 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="f8Tq2syZ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ImSUfM2E+a9A19Da8g6qr1XeDgm+USdaGhne6jeVL4IGR4gIAmtxyC8SZG+06Y1BGWK7QUUnoRiIvD17CsMZhd4ddcyAyCDa4j6s1m2bR2vzTq2pW11y98NkVl0oDp3gOLcxGtvEUReGaAT8CuB/aGk9vhjq+htlJSQCXqBSVus63pPM48KUJKe/dBZDJDk9ofQl0cG7nFf2D89KRJFa7081qmg09Kufxx4ZO68QZCa4qyWlvm91O68DdHy8aFaqIpuNZRoVhMvi8iTtN5S//PvloCtqkWc/U/Bfo4aSC43Z7hoN7jztMD9oWMdSMfdcTqkViflWOHUl+n7ki1vchw== 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=TtoOP7sdNEMzMPtLDiTVY27E03ddYw9W60HrH3dyJPE=; b=X1DbMSiwLym0f9oQcm6wYhfxCzFhutJhVVlG2BI/AjtI0DuFP/pRnZ8IWfOc+G/zYRiv37LpuTANnwtssmYKRRdzazszSDhWevSzfyejkLf4MgZOalHLy5vyvJ7p8xy1O+qzZNvCjmBvop8PXdXh3tIvhvcrZsqbKlptyYxKeFn6h/EUBo7QI1HdgSjbWnE7AG6UgRHKkuqOyQXE7JHVrWV5nbwWpFg+l+JM96dtUGOBI5bGg4oSlSVcLgJVWO7eeyfolq3vRBpmsCf5YqdJuJpBjyCpyXH5pYgXKWtH5+NDP5Eq3TFlQOx3SA3N9RYgaGE1kNBDcUyD8uLJpjxJlg== 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=TtoOP7sdNEMzMPtLDiTVY27E03ddYw9W60HrH3dyJPE=; b=f8Tq2syZGfcbu+69tRBcob7KrOWHX6X3dR4mj2WhclZBinagjdxzDQCQKyVJaZweaHXTOj6YkyxNsGzrxWIQpM9Uv+repg/yhL5cuuhNRvMX1o2OlW2w8ElxYnVKuNAkbspZQ1j6O/fruzSdL+B9EAY2az2GAig5Dmt5us0XcHOhlzkuC9yM/TpRgRVSDMiz6qNwJ5WnoQZFHrUOlFW+cpamv75pjx9gQElP/7ffU46oJuK6Nscn4m2gcwShctUsEa3UOC7YVPCjrLHEKDAwlePTTJW1R0R+ODChsnSoTufRYYVovMEXlaYyOxkSQ+/JTmtG4vXaqEvmk/VWd89JYw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA0PR12MB9009.namprd12.prod.outlook.com (2603:10b6:208:48f::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.15; Mon, 23 Mar 2026 11:07:52 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9745.007; Mon, 23 Mar 2026 11:07:52 +0000 From: Alexandre Courbot Date: Mon, 23 Mar 2026 20:07:36 +0900 Subject: [PATCH v3 01/10] gpu: nova-core: convert PMC registers to kernel register macro Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260323-b4-nova-register-v3-1-ae2486ecef1b@nvidia.com> References: <20260323-b4-nova-register-v3-0-ae2486ecef1b@nvidia.com> In-Reply-To: <20260323-b4-nova-register-v3-0-ae2486ecef1b@nvidia.com> To: Danilo Krummrich , Alice Ryhl , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Trevor Gross Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Zhi Wang , Eliot Courtney , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-doc@vger.kernel.org, rust-for-linux@vger.kernel.org, Alexandre Courbot X-Mailer: b4 0.15.0 X-ClientProxiedBy: TYCPR01CA0135.jpnprd01.prod.outlook.com (2603:1096:400:26d::15) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|IA0PR12MB9009:EE_ X-MS-Office365-Filtering-Correlation-Id: 3370374d-b85f-43d5-95e3-08de88cc6d56 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|10070799003|7416014|376014|921020|18002099003|56012099003|22082099003; X-Microsoft-Antispam-Message-Info: 2GMR7UCU5bzmPC9+Lmd73+KmhKlCodnTtqWM2KEUv2JfRgJssOFbW0eS35SB1TkUEmLvD8gRT7wrn6LSui6d/Una5qt/qaxqaYOsVbLcKQCMlteP143PkYAbv0CkzmLxIq7W8zX0CNMZ/ACtc9l32RCPD2LWyX/eZqC7gyP0sV1Sy9bJUOgshqhzwtr+tVTAMwCmPHzMfGIobYNTJoho7/I9DkQhhgfxo79oVOim2QO6M0/VgdeH5SUWlZanOis2U8Q1w/FjQVBXV5xPmX0EGAYZDwDl3Y9cSjOugH/fYlrAameYfr0rr/zgGn/nT7m8TLEGn4aZXt/uRV5D469DaazjyBrBLx9UbHDqdscXjH6Dv5587gMHCHz2BZXDGwAHa6Jfy11ox1IxCSAZpfxaEdmQym7IoaH/gYaNHGuPC35Wpbm0pXbM/tGbPVnS+fKzebUjTOFEnfKVYXouIcpUYBVwhKQF3kLDNXMGClE7xgdoeSNyLqmyuMzuuM9rxa8gYqsa0e5AGgS5vOqgrWL8xwbvXDJRO7ETqOZz3r8/PpXxaRYPYZswRTJHUMYx3YPYlXJmYB/XnMRH/rUtsNmycTcVUbrhOOb1r6NkkoAtWxD6YftbXsKYRH7zIzOeW2fFqOqf3gTT8P0Zrqflaf/z/zcnwTn+xW9OJCnn/wqMVCoNDc+6F7OlhbjVaTMLUkbIAIw8WZkJCXB204WJ76UcfjaMKAVVki+Kh4Pn4oI88Y58Hjelfvvv466A+6dfV7hKMoocUCl9l168w10xR8k1rw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(10070799003)(7416014)(376014)(921020)(18002099003)(56012099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MjF6dDJmeUdrd3ZBQjVxVFg5ZUJpeWxQeUZFVWhEOGdNaU5NUlliU1g5Z0tp?= =?utf-8?B?WXNPTTk1Vmw1d3dLQ0xEeU9tNXRCWHZKQ0d0L2tkVm5va3F6OU41R2QvRDAv?= =?utf-8?B?RUUxaFhLNDlsZXhkTzJpbXVWbHYzUHA4c1ZyTkJoYXBscDlKQlU1SDYvUDZ0?= =?utf-8?B?NXlmSWVuSEV6TkFxVHgyQngwemxmcmpmamFWTGRmRk1pVnUyWmppdXdBUlh5?= =?utf-8?B?bDgyYThJNXNBSGpJRldNYWRaVk5MSS9wUloxVG93ak1WZW9MT0R4NjV3SHBU?= =?utf-8?B?aVdpSVN4UkkwTU15RVJ3VUpkQ0FaNE9BcXdpbS9yblZUbDJxY3ZBWkhEQi9S?= =?utf-8?B?S0NxRDgrQlpiL2dZVDJpbTFTQ0RjcW5VV3A3eW9tR3RHck1oR01iRDBFZktT?= =?utf-8?B?VXBOSVhLM1IwbHczVXpva2QyNWNScTNidkcxSm9GeGEyNlZhYmRuZFM5M0la?= =?utf-8?B?VTJkWGVMa0ZvNCtocU8zc3N4RmdDN3p0MDgwNmt2Wnk2bDhTL0JZTVdNSUdT?= =?utf-8?B?eGMxanF5V3VUY0J3QVhJVDlGZFI5OU9PQUVOUTYxUXRaSStPaDZKcHpac0Qx?= =?utf-8?B?Tk5QR1VaZHhNVE4zdU8vNzhmdHUycU9SVHROQ0ZHY21jV0k4eThqcXM1SVVi?= =?utf-8?B?d1pEcHVucVdhTTIvU2xCdTJxengwWlF4RXVkdTBsWkc3bllZeWQzVW1naTFs?= =?utf-8?B?U0lEVEhOVmwxdU1ZY3RDYzdoUjAzcDF4c3VycXFxaGh1WTA3dkhFMC9vaGN6?= =?utf-8?B?Yk1ZK20zTG45NlN2RHAxWloyU25lWmJ3T25FWGl4RU50U0pEMXFGWWRTbERn?= =?utf-8?B?UHFnZithd1dLb2xTU0xDcDl5VzgvZlZidkF1YzUvY0FOcEF5emEvaFF3RTJM?= =?utf-8?B?dkZKVGtUWTQ2T0xsMmVrL1ZSeHJNUFZMUXhSSklQenlKWGtqL2pUbmtta2Zy?= =?utf-8?B?dDFHLytsRkNoUmFVM2VMa01zekFJMDVZL29vMkhaanlzQUpmcnhycFJlRlJP?= =?utf-8?B?K25sNU1ZMDFqZC9LQTBIQ0k5VCtjb01BYTlVUlZvOTEreXcrR1gyZEtZOFVk?= =?utf-8?B?WFNJS0J4cnhpRmJvZzFGT25WZEowL2tMNWhhQTZUN0Rrekl5S25jODc2OVVn?= =?utf-8?B?amVPNXdTUEZPbkZNSGgwR1V0UU9RVER5QWR5YkxhbndUOVJVdy80QUhYbWg2?= =?utf-8?B?aWdTNHp2Y1Y5SS9zRXR5MFR0d1h0TVBVUnJ6bnBpRzR1RTBKekRRTWE0dEd0?= =?utf-8?B?Ukh2eW1lYm9HYjdDbzlWSTMxVFFTWEh0eStpSzFiYW9WMUxNcW9VU3R4SnQw?= =?utf-8?B?MUtmb29aSDNobTdRbTNuUnVQUFMwdlZmSmRVT2ZOOWR6OFVqY3E0am11Y2pH?= =?utf-8?B?Nnp6T0FPb2xVMWZRUmoyT1BEYUwzM2Yrcm1zUGdlVVBsZ21JY0MwYkxhNnJT?= =?utf-8?B?Z1h3VHNGcGRMTlUyTkR4c2NtODJuZVphVXhPRGlQWGR5Z2dRa3RoUUZ3NHpm?= =?utf-8?B?a3pMNGRSWFBrc2RLWmg2cm9WajBVclVZUXcwb2s3OUIvOWpzYlUxM05hS2tZ?= =?utf-8?B?VzEwSGZDaXVXUHF6Q0sxNDJUaVBOVVV2UkFhS3pXUzFNM2c4RHdBdGdTNjdJ?= =?utf-8?B?aFNTOFBpNHgrRy9mZldycDY1OWZQcmprc3Y0S0dMTkZzQ3Z1ODYzMjBiVUpG?= =?utf-8?B?K05kMUpoMmdGQWtZaW10K0hFa3g3V2tOcDNwZERtSGdDci9hR1pUOXE3N3dU?= =?utf-8?B?cEViNWVRWDhONnk1Zk0xZ1kxblVINDNVUk5FRi80eFpJQlBrZ1l4NDcyUVJE?= =?utf-8?B?cnZYVkZ4QmJ1T0FQbkUxUXkrcitrVER4U2JUVHN4NmtUbVhFWVpDQjBtWW1M?= =?utf-8?B?MVJUUlpmQmFuQ2JFd0VmZFMvd3UyOHZxNzdoM2Q3Y0FJNTdjalRjL1VsT3Bn?= =?utf-8?B?ejBDZ04yNXpJWTRtREJVejMyY1gvY1BVWnlZOUpnNzc5RXNGVHZTdWx0NTRP?= =?utf-8?B?NWlTK2gxTXdhTFVUeUFBUWVVeXBBcVhHeWxTWEhia0VxbVpVcHFtTDdkQllT?= =?utf-8?B?azdSSTkxS3hFYmdjLzFiVkdyZVY4OFlOVWk4TTR1UzBkRmhzS2lWZWN6cVR6?= =?utf-8?B?MHYydnpSOGVadHpaQXJSUHg4ZHRJRGVXcG1udHBMb2tCWFcyUnptMjc1RGxZ?= =?utf-8?B?aWkyZXVPcmlqOFJHVzFNN0U1a1FDMDM2WjRaZ1JidkVoand4cElqTjRWb2dw?= =?utf-8?B?cG1pSElaMkZpVWlzeFg0N2hvL044M1JyK1lseStQeXZCbDFOVzJZZ3ZxZnVi?= =?utf-8?B?Ynl6aWpodFRHL20wR2JCWHp2Rm81d1EzUmFvRXFmUlJscmNENFV0QmQzYytK?= =?utf-8?Q?9qAz2JUoQClUKPz4lJBV/gzzmK0xLkjUbWui6+CfPb5Br?= X-MS-Exchange-AntiSpam-MessageData-1: AmlLZlhyUBCDsQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3370374d-b85f-43d5-95e3-08de88cc6d56 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2026 11:07:52.3608 (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: Li6AjEKTkwDAjKQydqTttOk1pd+W4ttGnCK4Qie96JXQsK1elK87hbmfs2p3d5Ln43jXBLoxG3NfQCWOmf6fMQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB9009 Convert all PMC registers to use the kernel's register macro and update the code accordingly. Reviewed-by: Eliot Courtney Reviewed-by: Gary Guo Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 7 ++++-- drivers/gpu/nova-core/gpu.rs | 37 +++++++++++++++--------------- drivers/gpu/nova-core/regs.rs | 50 ++++++++++++++++++++++++++-----------= ---- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 7097a206ec3c..5a4f7fc85160 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -13,7 +13,10 @@ DmaAddress, DmaMask, // }, - io::poll::read_poll_timeout, + io::{ + poll::read_poll_timeout, + Io, // + }, prelude::*, sync::aref::ARef, time::Delta, @@ -532,7 +535,7 @@ pub(crate) fn reset(&self, bar: &Bar0) -> Result { self.hal.reset_wait_mem_scrubbing(bar)?; =20 regs::NV_PFALCON_FALCON_RM::default() - .set_value(regs::NV_PMC_BOOT_0::read(bar).into()) + .set_value(bar.read(regs::NV_PMC_BOOT_0).into()) .write(bar, &E::ID); =20 Ok(()) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 8579d632e717..cb549c8b254f 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -4,6 +4,8 @@ device, devres::Devres, fmt, + io::Io, + num::Bounded, pci, prelude::*, sync::Arc, // @@ -129,24 +131,18 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Res= ult { } =20 /// Enum representation of the GPU generation. -/// -/// TODO: remove the `Default` trait implementation, and the `#[default]` -/// attribute, once the register!() macro (which creates Architecture item= s) no -/// longer requires it for read-only fields. -#[derive(fmt::Debug, Default, Copy, Clone)] -#[repr(u8)] +#[derive(fmt::Debug, Copy, Clone)] pub(crate) enum Architecture { - #[default] Turing =3D 0x16, Ampere =3D 0x17, Ada =3D 0x19, } =20 -impl TryFrom for Architecture { +impl TryFrom> for Architecture { type Error =3D Error; =20 - fn try_from(value: u8) -> Result { - match value { + fn try_from(value: Bounded) -> Result { + match u8::from(value) { 0x16 =3D> Ok(Self::Turing), 0x17 =3D> Ok(Self::Ampere), 0x19 =3D> Ok(Self::Ada), @@ -155,23 +151,26 @@ fn try_from(value: u8) -> Result { } } =20 -impl From for u8 { +impl From for Bounded { fn from(value: Architecture) -> Self { - // CAST: `Architecture` is `repr(u8)`, so this cast is always loss= less. - value as u8 + match value { + Architecture::Turing =3D> Bounded::::new::<0x16>(), + Architecture::Ampere =3D> Bounded::::new::<0x17>(), + Architecture::Ada =3D> Bounded::::new::<0x19>(), + } } } =20 pub(crate) struct Revision { - major: u8, - minor: u8, + major: Bounded, + minor: Bounded, } =20 impl From for Revision { fn from(boot0: regs::NV_PMC_BOOT_42) -> Self { Self { - major: boot0.major_revision(), - minor: boot0.minor_revision(), + major: boot0.major_revision().cast(), + minor: boot0.minor_revision().cast(), } } } @@ -208,13 +207,13 @@ fn new(dev: &device::Device, bar: &Bar0) -> Result { // from an earlier (pre-Fermi) era, and then using boot42 to p= recisely identify the GPU. // Somewhere in the Rubin timeframe, boot0 will no longer have= space to add new GPU IDs. =20 - let boot0 =3D regs::NV_PMC_BOOT_0::read(bar); + let boot0 =3D bar.read(regs::NV_PMC_BOOT_0); =20 if boot0.is_older_than_fermi() { return Err(ENODEV); } =20 - let boot42 =3D regs::NV_PMC_BOOT_42::read(bar); + let boot42 =3D bar.read(regs::NV_PMC_BOOT_42); Spec::try_from(boot42).inspect_err(|_| { dev_err!(dev, "Unsupported chipset: {}\n", boot42); }) diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 53f412f0ca32..58fb807605dd 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -8,6 +8,7 @@ pub(crate) mod macros; =20 use kernel::{ + io, prelude::*, time, // }; @@ -37,18 +38,38 @@ =20 // PMC =20 -register!(NV_PMC_BOOT_0 @ 0x00000000, "Basic revision information about th= e GPU" { - 3:0 minor_revision as u8, "Minor revision of the chip"; - 7:4 major_revision as u8, "Major revision of the chip"; - 8:8 architecture_1 as u8, "MSB of the architecture"; - 23:20 implementation as u8, "Implementation version of the architect= ure"; - 28:24 architecture_0 as u8, "Lower bits of the architecture"; -}); +io::register! { + /// Basic revision information about the GPU. + pub(crate) NV_PMC_BOOT_0(u32) @ 0x00000000 { + /// Lower bits of the architecture. + 28:24 architecture_0; + /// Implementation version of the architecture. + 23:20 implementation; + /// MSB of the architecture. + 8:8 architecture_1; + /// Major revision of the chip. + 7:4 major_revision; + /// Minor revision of the chip. + 3:0 minor_revision; + } + + /// Extended architecture information. + pub(crate) NV_PMC_BOOT_42(u32) @ 0x00000a00 { + /// Architecture value. + 29:24 architecture ?=3D> Architecture; + /// Implementation version of the architecture. + 23:20 implementation; + /// Major revision of the chip. + 19:16 major_revision; + /// Minor revision of the chip. + 15:12 minor_revision; + } +} =20 impl NV_PMC_BOOT_0 { pub(crate) fn is_older_than_fermi(self) -> bool { // From https://github.com/NVIDIA/open-gpu-doc/tree/master/manuals= : - const NV_PMC_BOOT_0_ARCHITECTURE_GF100: u8 =3D 0xc; + const NV_PMC_BOOT_0_ARCHITECTURE_GF100: u32 =3D 0xc; =20 // Older chips left arch1 zeroed out. That, combined with an arch0= value that is less than // GF100, means "older than Fermi". @@ -56,13 +77,6 @@ pub(crate) fn is_older_than_fermi(self) -> bool { } } =20 -register!(NV_PMC_BOOT_42 @ 0x00000a00, "Extended architecture information"= { - 15:12 minor_revision as u8, "Minor revision of the chip"; - 19:16 major_revision as u8, "Major revision of the chip"; - 23:20 implementation as u8, "Implementation version of the architect= ure"; - 29:24 architecture as u8 ?=3D> Architecture, "Architecture value"; -}); - impl NV_PMC_BOOT_42 { /// Combines `architecture` and `implementation` to obtain a code uniq= ue to the chipset. pub(crate) fn chipset(self) -> Result { @@ -76,8 +90,8 @@ pub(crate) fn chipset(self) -> Result { =20 /// Returns the raw architecture value from the register. fn architecture_raw(self) -> u8 { - ((self.0 >> Self::ARCHITECTURE_RANGE.start()) & ((1 << Self::ARCHI= TECTURE_RANGE.len()) - 1)) - as u8 + ((self.into_raw() >> Self::ARCHITECTURE_RANGE.start()) + & ((1 << Self::ARCHITECTURE_RANGE.len()) - 1)) as u8 } } =20 @@ -86,7 +100,7 @@ fn fmt(&self, f: &mut kernel::fmt::Formatter<'_>) -> ker= nel::fmt::Result { write!( f, "boot42 =3D 0x{:08x} (architecture 0x{:x}, implementation 0x{:= x})", - self.0, + self.inner, self.architecture_raw(), self.implementation() ) --=20 2.53.0