From: Greg KH <gregkh@linuxfoundation.org>
To: FUJITA Tomonori <fujita.tomonori@gmail.com>
Cc: netdev@vger.kernel.org, andrew@lunn.ch,
rust-for-linux@vger.kernel.org, tmgross@umich.edu,
Luis Chamberlain <mcgrof@kernel.org>,
Russ Weight <russ.weight@linux.dev>
Subject: Re: [PATCH net-next v1 3/4] rust: net::phy support Firmware API
Date: Mon, 15 Apr 2024 13:10:59 +0200 [thread overview]
Message-ID: <2024041554-lagged-attest-586d@gregkh> (raw)
In-Reply-To: <20240415104701.4772-4-fujita.tomonori@gmail.com>
On Mon, Apr 15, 2024 at 07:47:00PM +0900, FUJITA Tomonori wrote:
> This patch adds support to the following basic Firmware API:
>
> - request_firmware
> - release_firmware
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
> CC: Luis Chamberlain <mcgrof@kernel.org>
> CC: Russ Weight <russ.weight@linux.dev>
> ---
> drivers/net/phy/Kconfig | 1 +
> rust/bindings/bindings_helper.h | 1 +
> rust/kernel/net/phy.rs | 45 +++++++++++++++++++++++++++++++++
Please do not bury this in the phy.rs file, put it in drivers/base/ next
to the firmware functions it is calling.
> 3 files changed, 47 insertions(+)
>
> diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
> index 7fddc8306d82..3ad04170aa4e 100644
> --- a/drivers/net/phy/Kconfig
> +++ b/drivers/net/phy/Kconfig
> @@ -64,6 +64,7 @@ config RUST_PHYLIB_ABSTRACTIONS
> bool "Rust PHYLIB abstractions support"
> depends on RUST
> depends on PHYLIB=y
> + depends on FW_LOADER=y
> help
> Adds support needed for PHY drivers written in Rust. It provides
> a wrapper around the C phylib core.
> diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h
> index 65b98831b975..556f95c55b7b 100644
> --- a/rust/bindings/bindings_helper.h
> +++ b/rust/bindings/bindings_helper.h
> @@ -9,6 +9,7 @@
> #include <kunit/test.h>
> #include <linux/errname.h>
> #include <linux/ethtool.h>
> +#include <linux/firmware.h>
> #include <linux/jiffies.h>
> #include <linux/mdio.h>
> #include <linux/phy.h>
> diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs
> index 421a231421f5..095dc3ccc553 100644
> --- a/rust/kernel/net/phy.rs
> +++ b/rust/kernel/net/phy.rs
> @@ -9,6 +9,51 @@
> use crate::{bindings, error::*, prelude::*, str::CStr, types::Opaque};
>
> use core::marker::PhantomData;
> +use core::ptr::{self, NonNull};
> +
> +/// A pointer to the kernel's `struct firmware`.
> +///
> +/// # Invariants
> +///
> +/// The pointer points at a `struct firmware`, and has ownership over the object.
> +pub struct Firmware(NonNull<bindings::firmware>);
> +
> +impl Firmware {
> + /// Loads a firmware.
> + pub fn new(name: &CStr, dev: &Device) -> Result<Firmware> {
> + let phydev = dev.0.get();
That's risky, how do you "know" this device really is a phydev? That's
not how the firmware api works, use a real 'struct device' please.
> + let mut ptr: *mut bindings::firmware = ptr::null_mut();
> + let p_ptr: *mut *mut bindings::firmware = &mut ptr;
I'm sorry, but I don't understand the two step thing here, you need a
pointer for where the C code can put something, is this really how you
do that in rust? Shouldn't it point to data somehow down below?
> + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Device`.
Again, phydev is not part of the firmware api.
> + // So it's just an FFI call.
> + let ret = unsafe {
> + bindings::request_firmware(
> + p_ptr as *mut *const bindings::firmware,
Where is this coming from?
> + name.as_char_ptr().cast(),
> + &mut (*phydev).mdio.dev,
> + )
> + };
> + let fw = NonNull::new(ptr).ok_or_else(|| Error::from_errno(ret))?;
> + // INVARIANT: We checked that the firmware was successfully loaded.
> + Ok(Firmware(fw))
> + }
> +
> + /// Accesses the firmware contents.
> + pub fn data(&self) -> &[u8] {
But firmware is not a u8, it's a structure. Can't the rust bindings
handle that? Oh wait, data is a u8, but the bindings should show that,
right?
> + // SAFETY: The type invariants guarantee that `self.0.as_ptr()` is valid.
> + // They also guarantee that `self.0.as_ptr().data` pointers to
> + // a valid memory region of size `self.0.as_ptr().size`.
> + unsafe { core::slice::from_raw_parts((*self.0.as_ptr()).data, (*self.0.as_ptr()).size) }
If new fails, does accessing this also fail?
And how are you using this? I guess I'll dig in the next patch...
> + }
> +}
> +
> +impl Drop for Firmware {
> + fn drop(&mut self) {
> + // SAFETY: By the type invariants, `self.0.as_ptr()` is valid and
> + // we have ownership of the object so can free it.
> + unsafe { bindings::release_firmware(self.0.as_ptr()) }
So drop will never be called if new fails?
Again, please don't put this in the phy driver, put it where it belongs
so we can add the other firmware functions when needed.
thanks,
greg k-h
next prev parent reply other threads:[~2024-04-15 11:11 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-15 10:46 [PATCH net-next v1 0/4] net: phy: add Applied Micro QT2025 PHY driver FUJITA Tomonori
2024-04-15 10:46 ` [PATCH net-next v1 1/4] rust: net::phy support config_init driver callback FUJITA Tomonori
2024-04-15 10:46 ` [PATCH net-next v1 2/4] rust: net::phy support C45 helpers FUJITA Tomonori
2024-04-15 14:20 ` Andrew Lunn
2024-04-16 11:40 ` FUJITA Tomonori
2024-04-16 12:38 ` Andrew Lunn
2024-04-16 13:21 ` FUJITA Tomonori
2024-04-16 22:07 ` Benno Lossin
2024-04-16 22:30 ` Andrew Lunn
2024-04-17 8:20 ` Benno Lossin
2024-04-17 13:34 ` Andrew Lunn
2024-04-18 12:47 ` Benno Lossin
2024-04-18 14:32 ` Andrew Lunn
2024-04-18 13:15 ` FUJITA Tomonori
2024-04-16 3:25 ` Trevor Gross
2024-05-27 2:00 ` FUJITA Tomonori
2024-04-15 10:47 ` [PATCH net-next v1 3/4] rust: net::phy support Firmware API FUJITA Tomonori
2024-04-15 11:10 ` Greg KH [this message]
2024-04-18 12:51 ` FUJITA Tomonori
2024-04-18 13:05 ` Greg KH
2024-04-18 13:07 ` Greg KH
2024-04-18 13:35 ` FUJITA Tomonori
2024-04-15 13:30 ` Andrew Lunn
2024-04-15 15:45 ` Danilo Krummrich
2024-04-18 13:10 ` FUJITA Tomonori
2024-04-15 10:47 ` [PATCH net-next v1 4/4] net: phy: add Applied Micro QT2025 PHY driver FUJITA Tomonori
2024-04-15 11:15 ` Greg KH
2024-04-18 13:00 ` FUJITA Tomonori
2024-04-18 13:10 ` Greg KH
2024-04-18 13:22 ` FUJITA Tomonori
2024-04-18 14:42 ` Andrew Lunn
2024-04-15 13:48 ` Andrew Lunn
2024-04-15 16:53 ` Andrew Lunn
2024-04-16 4:34 ` Trevor Gross
2024-04-16 6:58 ` Benno Lossin
2024-04-16 11:16 ` FUJITA Tomonori
2024-04-16 12:08 ` Andrew Lunn
2024-05-24 1:50 ` FUJITA Tomonori
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=2024041554-lagged-attest-586d@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=andrew@lunn.ch \
--cc=fujita.tomonori@gmail.com \
--cc=mcgrof@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=russ.weight@linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
/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).