From: Benno Lossin <benno.lossin@proton.me>
To: Danilo Krummrich <dakr@kernel.org>
Cc: airlied@gmail.com, simona@ffwll.ch, corbet@lwn.net,
maarten.lankhorst@linux.intel.com, mripard@kernel.org,
tzimmermann@suse.de, ajanulgu@redhat.com, lyude@redhat.com,
pstanner@redhat.com, zhiw@nvidia.com, cjia@nvidia.com,
jhubbard@nvidia.com, bskeggs@nvidia.com, acurrid@nvidia.com,
ojeda@kernel.org, alex.gaynor@gmail.com, boqun.feng@gmail.com,
gary@garyguo.net, bjorn3_gh@protonmail.com,
a.hindborg@kernel.org, aliceryhl@google.com, tmgross@umich.edu,
gregkh@linuxfoundation.org, mcgrof@kernel.org,
russ.weight@linux.dev, dri-devel@lists.freedesktop.org,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v5 2/5] rust: firmware: introduce `firmware::ModInfoBuilder`
Date: Wed, 05 Mar 2025 23:36:54 +0000 [thread overview]
Message-ID: <D88Q7503C8FF.2TMMBSEMOGKU1@proton.me> (raw)
In-Reply-To: <Z8jSV5CpZDcXrviY@pollux>
On Wed Mar 5, 2025 at 11:38 PM CET, Danilo Krummrich wrote:
> On Wed, Mar 05, 2025 at 10:30:31PM +0000, Benno Lossin wrote:
>> On Tue Mar 4, 2025 at 6:34 PM CET, Danilo Krummrich wrote:
>> > + /// Push an additional path component.
>> > + ///
>> > + /// After a new [`ModInfoBuilder`] instance has been created, [`ModInfoBuilder::prepare`] must
>> > + /// be called before adding path components.
>> > + pub const fn push(self, s: &str) -> Self {
>> > + if N != 0 && self.n == 0 {
>> > + crate::build_error!("Must call prepare() before push().");
>>
>> This will only prevent the first `prepare` call being missed, right?
>
> Correct, unfortunately there's no way to detect subsequent ones.
Does it make sense to do that one in the constructor?
(After looking at the example below) Ah maybe you can't do that, since
then you would have two `prepare()` calls for the example below...?
>> > + }
>> > +
>> > + self.push_internal(s.as_bytes())
>> > + }
>> > +
>> > + const fn prepare_module_name(self) -> Self {
>> > + let mut this = self;
>> > + let module_name = this.module_name;
>> > +
>> > + if !this.module_name.is_empty() {
>> > + this = this.push_internal(module_name.as_bytes_with_nul());
>> > +
>> > + if N != 0 {
>> > + // Re-use the space taken by the NULL terminator and swap it with the '.' separator.
>> > + this.buf[this.n - 1] = b'.';
>> > + }
>> > + }
>> > +
>> > + this.push_internal(b"firmware=")
>> > + }
>> > +
>> > + /// Prepare for the next module info entry.
>> > + ///
>> > + /// Must be called before [`ModInfoBuilder::push`] can be called.
>>
>> If you always have to call this before `push`, why not inline it there?
>
> You can push() multiple times to compose the firmware path string (which is the
> whole purpose :).
Ah I see, I only looked at the example you have in the next patch. All
in all, I think this patch could use some better documentation, since I
had to read a lot of the code to understand what everything is supposed
to do...
It might also make sense to make this more generic, since one probably
also needs this in other places? Or do you think this will only be
required for modinfo?
---
Cheers,
Benno
> Example from nova-core:
>
> pub(crate) struct ModInfoBuilder<const N: usize>(firmware::ModInfoBuilder<N>);
>
> impl<const N: usize> ModInfoBuilder<N> {
> const fn make_entry_file(self, chipset: &str, fw: &str) -> Self {
> let version = "535.113.01";
>
> ModInfoBuilder(
> self.0
> .prepare()
> .push("nvidia/")
> .push(chipset)
> .push("/gsp/")
> .push(fw)
> .push("-")
> .push(version)
> .push(".bin"),
> )
> }
>
> const fn make_entry_chipset(self, chipset: &str) -> Self {
> self.make_entry_file(chipset, "booter_load")
> .make_entry_file(chipset, "booter_unload")
> .make_entry_file(chipset, "bootloader")
> .make_entry_file(chipset, "gsp")
> }
>
> pub(crate) const fn create(
> module_name: &'static kernel::str::CStr,
> ) -> firmware::ModInfoBuilder<N> {
> let mut this = Self(firmware::ModInfoBuilder::new(module_name));
> let mut i = 0;
>
> while i < gpu::Chipset::NAMES.len() {
> this = this.make_entry_chipset(gpu::Chipset::NAMES[i]);
> i += 1;
> }
>
> this.0
> }
> }
next prev parent reply other threads:[~2025-03-05 23:37 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-04 17:34 [PATCH v5 0/5] Initial Nova Core series Danilo Krummrich
2025-03-04 17:34 ` [PATCH v5 1/5] rust: module: add type `LocalModule` Danilo Krummrich
2025-03-04 19:14 ` Jarkko Sakkinen
2025-03-05 21:07 ` Miguel Ojeda
2025-03-04 17:34 ` [PATCH v5 2/5] rust: firmware: introduce `firmware::ModInfoBuilder` Danilo Krummrich
2025-03-04 19:15 ` Jarkko Sakkinen
2025-03-05 22:30 ` Benno Lossin
2025-03-05 22:38 ` Danilo Krummrich
2025-03-05 23:36 ` Benno Lossin [this message]
2025-03-05 23:57 ` Danilo Krummrich
2025-03-06 0:24 ` Benno Lossin
2025-03-06 1:29 ` Danilo Krummrich
2025-03-06 1:35 ` Benno Lossin
2025-03-06 1:48 ` Danilo Krummrich
2025-03-04 17:34 ` [PATCH v5 3/5] rust: firmware: add `module_firmware!` macro Danilo Krummrich
2025-03-04 19:17 ` Jarkko Sakkinen
2025-03-06 0:31 ` Benno Lossin
2025-03-06 1:04 ` Danilo Krummrich
2025-03-06 1:27 ` Benno Lossin
2025-03-06 1:38 ` Danilo Krummrich
2025-03-06 1:42 ` Benno Lossin
2025-03-04 17:34 ` [PATCH v5 4/5] gpu: nova-core: add initial driver stub Danilo Krummrich
2025-03-06 12:38 ` Alexandre Courbot
2025-03-04 17:34 ` [PATCH v5 5/5] gpu: nova-core: add initial documentation Danilo Krummrich
2025-03-06 12:41 ` Alexandre Courbot
2025-03-06 12:56 ` FUJITA Tomonori
2025-03-06 13:45 ` Danilo Krummrich
2025-03-06 13:59 ` FUJITA Tomonori
2025-03-05 19:56 ` [PATCH v5 0/5] Initial Nova Core series Danilo Krummrich
2025-03-05 23:27 ` Luis Chamberlain
2025-03-05 23:40 ` Danilo Krummrich
2025-03-06 0:06 ` Luis Chamberlain
2025-03-06 6:39 ` Greg KH
2025-03-06 17:19 ` Russ Weight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=D88Q7503C8FF.2TMMBSEMOGKU1@proton.me \
--to=benno.lossin@proton.me \
--cc=a.hindborg@kernel.org \
--cc=acurrid@nvidia.com \
--cc=airlied@gmail.com \
--cc=ajanulgu@redhat.com \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=bskeggs@nvidia.com \
--cc=cjia@nvidia.com \
--cc=corbet@lwn.net \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=jhubbard@nvidia.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mcgrof@kernel.org \
--cc=mripard@kernel.org \
--cc=nouveau@lists.freedesktop.org \
--cc=ojeda@kernel.org \
--cc=pstanner@redhat.com \
--cc=russ.weight@linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=tmgross@umich.edu \
--cc=tzimmermann@suse.de \
--cc=zhiw@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).