From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012001.outbound.protection.outlook.com [52.101.53.1]) (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 946443FE344; Wed, 7 Oct 2026 06:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.1 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791354626; cv=fail; b=u15ojAGhe0Eoz9+al3NDk1+BmJyVcB46H0QEhYbKgQn5vz9z2kqfAWG4ea8T+cgD2SgDNLLjuHeVUWHaCIkJ5CibrNq4+dlTQloV0VoAD4B4geyTR//iH0F4mFsQmpd9H4esVgfBdBPSaoU/619uH5AExCWvoNTFKVQN6vaxwJk= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791354626; c=relaxed/simple; bh=PQIMsjsegRTOKP2ZWVpMXWyT2a/mBbFPgnKYeOm+WqY=; h=Content-Type:Date:Message-Id:To:Cc:Subject:From:References: In-Reply-To:MIME-Version; b=sLqU5iU7zwftqvh+UHJfmsCedAMD2/YirweX/vd51talRiupuR6dNr//Hs9+hrnxrQQTW6stFkFccSnfdQPS8rpMrPE4An7+epSKXMTMMv/Lv63VZD3t469tMracjtDRlE9Nq2BBufOVaJIp795GM+yhEdwnpIt0kqHwD1Nez3Y= 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=Y2ALLfYx; arc=fail smtp.client-ip=52.101.53.1 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="Y2ALLfYx" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DFV6fFOLEWDGuR9xIZDqglw+5Y7edxxFiEef5oJ0T6gNKTseZhdDPUvpboosDpjKmO+qV8xvJO4HnRlkOFfPzr4bA64ezN+7/sPY2d/1JQJ2TYv5rnnC62llN21abQyY5PZP4w3krlCl5yQCeBIjIeFfCLD9GlGYCGzwpXj0Bxk0CH/49CX2SKHw1CyrEFNDBI3eKvspUQU+tRMMeP2r+jYYAMi51SPc9X8akDzE30VgVfL6pK/aSxKOnGZN/xdDhByfZThSPjKUwvl20IuNzyePow9PiPthwtLLn4GJWWj0OFmbAWk7ISmKPU30PGZ9h/ah3/adjPfWHjosuLgo3Q== 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=BJ92xTFCDou9bnxwjCEw6NJJW8TSZRh616xx3M695PY=; b=XxUhl10eMAAyEvXZ+qMjlKnG6inne/0S5vnyM6+dBjlpW5JlG53Bv/T23m20ccu2QduCv7L6PkCW7eqCHOi9xTQCCjCkRjpapaL6/+tnI2j/B3cyRZQH62wXlXCQZ849z6DOVMjKyxDAzDs9OQXYODsaZF1zMwONA4rcx6fWKainUSIIRIwWfvbs9X2i2XrrrIfdWGzPX1uTplsv/2pwpeb3hPt9MR4xR1uGz2yGCiIjp7gUJIu1hrjTcawHFeXrG24KHaluC3gaLpBiqG1pxhuwI0V09epCYer+L2PmSK8Z0YINEDaS2+ZchHJXnmGqm/dY6gF5cxB6lEn+3w1zDg== 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=BJ92xTFCDou9bnxwjCEw6NJJW8TSZRh616xx3M695PY=; b=Y2ALLfYxScw2fqRKtR4qaeRmOD7I68qtyYge2ijt4KcwjBVbIZCfldtZUQ7q7W649derTNLMeuoNhcIWiVKuL+YVLgfp36lVAG0NLDCM4TXo5Eulir8eerda4qNig7c+9rkx+XiFjbWYFT21BjuSjsNGVuePqXMcTIoeYN+BOqNkxMrX1Q8sq/53g6eFELPWpfcLVrreBxKJ46yPh7h9C5PTSgamPIlF08etkfId0p/nUpzd0N7L+BTBIVncOuQ5DtN96wWfUsU5V1LZb560EHnYQbt/5Bzoh8S+E1tyIkpTWqp64lydEuIn3KUCIskQZUIv36PTyfJrHaz1zHukvA== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from MW4PR12MB6873.namprd12.prod.outlook.com (2603:10b6:303:20c::17) by SJ5PPF4C71815F9.namprd12.prod.outlook.com (2603:10b6:a0f:fc02::992) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.496.15; Wed, 7 Oct 2026 06:30:20 +0000 Received: from MW4PR12MB6873.namprd12.prod.outlook.com ([fe80::a338:bd2c:3a38:ece1]) by MW4PR12MB6873.namprd12.prod.outlook.com ([fe80::a338:bd2c:3a38:ece1%5]) with mapi id 15.21.0472.016; Wed, 7 Oct 2026 06:30:19 +0000 Content-Type: text/plain; charset=UTF-8 Date: Wed, 07 Oct 2026 15:30:17 +0900 Message-Id: To: "Eliot Courtney" Cc: "Danilo Krummrich" , "Lorenzo Stoakes" , "Vlastimil Babka" , "Liam R. Howlett" , "Uladzislau Rezki" , "Miguel Ojeda" , "Boqun Feng" , "Gary Guo" , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , "Benno Lossin" , "Andreas Hindborg" , "Alice Ryhl" , "Trevor Gross" , "Daniel Almeida" , "Tamir Duberstein" , =?utf-8?q?Onur_=C3=96zkan?= , "David Airlie" , "Simona Vetter" , "John Hubbard" , "Alistair Popple" , "Timur Tabi" , , , , Subject: Re: [PATCH v3 7/8] gpu: nova-core: add NVKV typed decoding From: "Alexandre Courbot" Content-Transfer-Encoding: quoted-printable References: <20260928-b4-nvkv-v3-0-f04504c262c2@nvidia.com> <20260928-b4-nvkv-v3-7-f04504c262c2@nvidia.com> In-Reply-To: <20260928-b4-nvkv-v3-7-f04504c262c2@nvidia.com> X-ClientProxiedBy: TY4P301CA0082.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:36f::14) To MW4PR12MB6873.namprd12.prod.outlook.com (2603:10b6:303:20c::17) 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: MW4PR12MB6873:EE_|SJ5PPF4C71815F9:EE_ X-MS-Office365-Filtering-Correlation-Id: 4a28eef5-927f-4bed-2080-08df243c757d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|10070799003|366016|7416014|376014|56012099006|11063799006|4143699003|10067099003|18002099003|22082099003|10063799003|3023799007; X-Microsoft-Antispam-Message-Info: iQ5g4d8YHZDk7XccA6Ls4FCGZ5yR+4chGmhgZ4U8fO0KYjaqlm9HaHJMbB9g5SY438PI7VprS860tuzBgzvSI+5ybL80KjGgwXfDvsMb3/fK053+oMocXpS+fhgdYaq7FaeP0VsUFYAqgtn0P3TmbaSptx+tCdz/vl/iGsueFu1iAP3UtbK+W0AT3k/j9BwRYewWS9caxKD5lzSFZHTM7smLYtNMRMkCBg+ezd1Rfdud33G+3qIo+gnLMQebzGq+lz24yqaw6T4EIAwwRUP6oNLUYQpuJIJMvNCEiChAJoWz0g6zS9RY3N/+dldOBN4jT9EnOkgWAjcg3BUjdM/40AYUid7CMyAnsvi6XGGhoC+IC+zWTQ4i+U0vrYgHX2A1Q54u3ZNbzRuI7WKDRtxE1Z+KQHFs3+mrTbcHNO0Nf11FjpAbjWK0H9bT+wT7u3kELVGlJWJl6M9mfhBqm2YQZ1jbM3QBEQBmN/NrPJ01ewItJfzSXb0DNT/99rKZ8tepuY86Nf1kpkXG0qH/boDrL1eGFEt1+8vFlTPVK0d3aeKMvXGQnYXv/JkWaYdcywAqkmd2/vgH9YSvwcDifzlzYn6M/TtCVjKsE1oYWBNHnpmZA6Lu3Ci47/SNQoWqnweSWdSPAkkjs3N05DBq7lULKTwrdUJ3uNuefeRg+2l5uo4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW4PR12MB6873.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(10070799003)(366016)(7416014)(376014)(56012099006)(11063799006)(4143699003)(10067099003)(18002099003)(22082099003)(10063799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MXJUMmZFUmx6blpTcXFPQ09ZYVJ4SnMyRGVjeVUrL1hVRzRUUEszUDdDYXFY?= =?utf-8?B?ZEJ1K09iellWcUphSCt0cVFuRzJTd3dVNnNyOVN0OU1XQ3FoVXNIWkdHR2hp?= =?utf-8?B?eVNxVTlOZm1BN3lxNUtsMlg3MUt3endlTm5kZEVleTZLek5qRTlraUpxQ0k3?= =?utf-8?B?SnV1bGVaVGZ0ZE5tNDYrTFNBbm5kY0szcWtQWTNyZVNiQ2VuN3ZleTZGeEhY?= =?utf-8?B?cjNVRGZwWWdHRDB2YWI4M2QzVURXaGwzQis4N1FoU2FwK1hiTFp6dE5lS2k3?= =?utf-8?B?OGpGZ1NvOVhpc2VnRExZYUovMW1YNmxuUms0VjYwYW8xbkdvYjI2NDhwU3lm?= =?utf-8?B?NTRiZHJSZUJBK1BjcUhZdGdZWGg2M002N1BaYXk1M3FLZFRITXhlWnJrTlQ4?= =?utf-8?B?UFdaTUFUKy9YYktJQWJTbnZaNjJQR2pSR1ozVzJuVU53aHlIalAvY1Q1ZVA0?= =?utf-8?B?U081Q3czNVFOTFZmaGh1RlcveGFyajEzU0RsU2VsMW82MFpEdFBBdno3dzBH?= =?utf-8?B?bGxhRVgxdHg2cmtuR1cwYlA1VjhDMVdFWTZaR0Z4Q0V3SC9SVlhEVVluSXZ3?= =?utf-8?B?MmJCOEVRYk1qRlg2T2c2ekw2M2U5WEVxYlNva1IwRndOUkY5dER0MVBmcFkz?= =?utf-8?B?QVJRNjhrOUoxb3JqK3FpdE9yNDM3eTV2anpiYUxtcmp4S3JlNDJEK3ROMDNT?= =?utf-8?B?T2F5dVhoZFp6ZEh6bWdMU2VTKzhOcDJHRDdtclhodjNFTGFTOTVad0VjTStH?= =?utf-8?B?WWk0Sk1hNnF1MDRsb2FhaUVxOHdGR1JtSm1vclU3cWh5MnVuZWpBYXk0Mjlw?= =?utf-8?B?QXBsakhmZ0thaGdtV0V5YUJ2N2FncEVxK3lJaUp2anhPYTlsU3hKTzJPNW50?= =?utf-8?B?azZyUG14NHJ1SG5xcmZYUFNrbmxRa1NSaVlzQmJSTmFoNmFJbGw4VW1pd0pj?= =?utf-8?B?aHJzcFJpdGtXMGJhVVJYREw5b2xESFZEbmp6N294cDR6YTBudVB1TWpZckI2?= =?utf-8?B?Z1IrZWdKcnN2VXl2ZThQRUhFL0t4Z2FqbXZFVWEvQWFzckRVVFY4WUxISFl2?= =?utf-8?B?eVMrU2JlSGZwTldQOC9LZkgyNmdtYzhKNlliUCs0dFB4MS84YzZyalJLdFdZ?= =?utf-8?B?ZTgrRFdyd3RNUVUyOVU4bG5YZDRCTlhhd1NKVk8zV2FnelJHM1IvMFE0V3NE?= =?utf-8?B?YmJ3WUJNcVo1eG80a0h0Mll5M1dLSUlMeXlvWktOZmhqTEtZSHBEdHlwV1dI?= =?utf-8?B?R1RTNy9vTWV1YTJGOXZJSysvWlNMbDVsdU82UE9CR3dQQk1ydmFGUjVXMnB1?= =?utf-8?B?aXJFZVdnVkxXTnFUbTZqNEY5UHc3MTVVZTRtWGRIUERqYzdsdzQ5N0dDb3RW?= =?utf-8?B?Z29XYlNCbXBCSEZWWTIzcktDTUpvM2RlOUhLcnpITHdUNEk3ZmlubnBZL0h5?= =?utf-8?B?M29hODZBVk43VWt3ajJkNjlEckFPajEvWnJuSUNQbjJTOUwxV1NuL1ZYdU4x?= =?utf-8?B?MmtYU0JwUG9NckloWEtGbDY1RzBPaHFsMGVwZ2RlTnU0QklsR0FMVEN6VHlZ?= =?utf-8?B?eWFsOCtHUGNwWDRKeUluTmxQQzd6dXF4NnFlYzhRR0xPTWtzYWZNZmtvem02?= =?utf-8?B?WE9pZTAxcCtRYUtVWXZ0STVtTWJQRERvalVmWG9TL08yWTJnaTVGcUg1ZXZ2?= =?utf-8?B?ek4vaGYvMHJBUmNWSjB2UDRjTGo5ejQ4NHFuWnNrT09DVkpMRGNqeS9XTjBm?= =?utf-8?B?ZHM0ViswS25YeFhhbmxaZmNrbFN6c0dGSFNmd2ZPVW9zWXdjSHFIUmZzR0Z4?= =?utf-8?B?aUpnNDBmVkNRdWVYSWZ4YWxkZlAvVmFaSG9OeDdQWkk3ZVhUK0dRRnpJelVz?= =?utf-8?B?UGpLT0lBUTg0cDNLdWFDNmw4emFwdk1YL3ZpLytPMFc0UlVuc2pVbmNmU1Z6?= =?utf-8?B?MzhjeW02bng4Y2ZzdVdVdGRwR1VYNEg4UjdJQWZtaFRGM1p0U0ZIeUN6YUN3?= =?utf-8?B?eCtCYUdHRVpkRkJURzh3eS9YWXlsR2VVYWw5eWxZODZMbWRreTkzRTN2bUJz?= =?utf-8?B?MjlRUDVVaGdBOVNIU2M1UjZxdGtjcHhxajB2NDk1Nm1CbHpQWU5TSFdDWlda?= =?utf-8?B?bFpSWVBaRTR2WHp5aXFHMnE3SnV3Qi9pRFhyc3hxMHU4b1orM1AxWU5RNU9E?= =?utf-8?B?V0owdkg5dEtkdk9nV0k2NzMxMWxwZXllQytWZnh0OHd0QjJuTXk1SVhGNHdW?= =?utf-8?B?RnVWeU5aVlhrRFJhOHVtamRqU2NiUlAvUkRHdW8xMGdKNEZCRG5WSkFFUitj?= =?utf-8?B?VU95Q2ZnakpmeWRBMWVBcG9WQ3RCL1FGY21zNWdqc2xNWi92M0VDK2kxY1M5?= =?utf-8?Q?qCYj1zXQ/S+0WS20qoc8bwPZU9hoVfB3Q2J9mgRWvwHIM?= X-MS-Exchange-AntiSpam-MessageData-1: cC86FmhXU2J63Q== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4a28eef5-927f-4bed-2080-08df243c757d X-MS-Exchange-CrossTenant-AuthSource: MW4PR12MB6873.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2026 06:30:19.8786 (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: zfJB8CiEC/eMAFijlkfpme1znePfFo0F50oskkwEVLUqBi8vyA0DOltGaRDq6N2WT/Y0UtvFIVXPHT8aIoAGMg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ5PPF4C71815F9 On Mon Sep 28, 2026 at 5:42 PM JST, Eliot Courtney wrote: > Similar to the typed encoding layer, add some decoding type machinery. > Add a simple macro `nvkv_decode!` which implements `Schema` for a struct > by composing visit calls to each member. Add some common `Schema` kinds, > such as `Array` which collects an array value into a fixed maximum size > array, and `Required` which fails a decode if the value is not sent. > > Signed-off-by: Eliot Courtney > --- > drivers/gpu/nova-core/gsp/nvkv.rs | 11 +- > drivers/gpu/nova-core/gsp/nvkv/decode.rs | 622 +++++++++++++++++++++++++= +++++- > 2 files changed, 628 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/nova-core/gsp/nvkv.rs b/drivers/gpu/nova-core/gs= p/nvkv.rs > index 7ac3a459a98b..5791df07a7fa 100644 > --- a/drivers/gpu/nova-core/gsp/nvkv.rs > +++ b/drivers/gpu/nova-core/gsp/nvkv.rs > @@ -9,7 +9,7 @@ > //! function calls will map to some struct - for example, f(GPU_NAME_STR= ING_KEY, 0, b"some gpu") > //! naturally maps to storing a &str with the GPU name. > =20 > -#![expect(unused_imports)] > +#![cfg_attr(not(CONFIG_KUNIT), expect(unused_imports))] > #![cfg_attr(not(CONFIG_KUNIT), expect(unused_macros))] > =20 > use core::{ > @@ -23,7 +23,8 @@ > use kernel::{ > alloc::{ > allocator::KVmalloc, > - Allocator, // > + Allocator, > + ArrayVec, // > }, > bitfield, > num::Bounded, > @@ -148,6 +149,12 @@ fn default() -> Self { > } > } > =20 > +/// A schema field for an array value under the NVKV key `KEY_ID`. > +#[repr(transparent)] > +pub(crate) struct Array { > + vec: ArrayVec, > +} I still don't see why this needs to be declared in this module when no encoder element ever uses it, and the module reexports everything from `decode` anyway. Can this be moved next to the other schema kinds? > + > bitfield! { > /// The op word that starts each NVKV operation. > struct Op(u64) { > diff --git a/drivers/gpu/nova-core/gsp/nvkv/decode.rs b/drivers/gpu/nova-= core/gsp/nvkv/decode.rs > index c4c24fe1108e..24dad31296cb 100644 > --- a/drivers/gpu/nova-core/gsp/nvkv/decode.rs > +++ b/drivers/gpu/nova-core/gsp/nvkv/decode.rs > @@ -3,11 +3,22 @@ > =20 > #![cfg_attr(not(CONFIG_KUNIT), expect(dead_code))] > =20 > -use kernel::prelude::*; > +use core::{ > + convert::Infallible, > + marker::PhantomData, // > +}; > + > +use kernel::{ > + alloc::ArrayVec, > + prelude::*, // > +}; > +use pin_init::init_array_from_fn; > =20 > use crate::{ > gsp::nvkv::{ > + Array, > Index, > + Key, > KeyId, > Op, > Opcode, // > @@ -15,6 +26,353 @@ > num, // > }; > =20 > +/// Defines a schema struct together with its [`Schema`] and [`Visit`] i= mplementations that decode > +/// into `$target`. > +/// > +/// Each member of the struct should implement [`Schema`] and [`Visit`].= For every (key, index, > +/// value) triple decoded from the NVKV stream, the generated parent `Vi= sit` implementation will nit: let's put backticks around (key, index, value) and link to `Visit` (and other types mentioned in this doccomment, and possibly elsewhere in this patch). <...> > +/// A schema field for a key that must be present. > +/// > +/// `finish` fails with `EINVAL` if no value arrived for the key. > +#[repr(transparent)] > +pub(crate) struct Required(Key, KEY_ID= >); I just noticed that the schema field types are conflating several concepts together. On the one hand, you have types associating a key to some kind of storage (Key, Array, Indexed - let's call these leaf types), and on the other what looks like modifiers on said leaf types (Accumulated). Which leaves `Required` somewhere in between, as it takes a key parameter and can only be applied to value types, i.e. you currently cannot have a `Required>`. But `Accumulated>` does work IIUC. So I think `Required` should work the same way as `Accumulated`, i.e. just wrap it around the type you want to make required, instead of switching the leaf type. And for symmetry, we should also have an `Optional` wrapper type, so we can also make fields optional even if they are not `Key`s instead of having specific behavior for `Key