Macro module_firmware

Source
macro_rules! module_firmware {
    ($($builder:tt)*) => { ... };
}
Expand description

Create firmware .modinfo entries.

This macro is the counterpart of the C macro MODULE_FIRMWARE(), but instead of taking a simple string literals, which is already covered by the firmware field of crate::prelude::module!, it allows the caller to pass a builder type, based on the ModInfoBuilder, which can create the firmware modinfo strings in a more flexible way.

Drivers should extend the ModInfoBuilder with their own driver specific builder type.

The builder argument must be a type which implements the following function.

const fn create(module_name: &'static CStr) -> ModInfoBuilder

create should pass the module_name to the ModInfoBuilder and, with the help of it construct the corresponding firmware modinfo.

Typically, such contracts would be enforced by a trait, however traits do not (yet) support const functions.

ยงExample

struct Builder<const N: usize>;

impl<const N: usize> Builder<N> {
    const DIR: &'static str = "vendor/chip/";
    const FILES: [&'static str; 3] = [ "foo", "bar", "baz" ];

    const fn create(module_name: &'static kernel::str::CStr) -> firmware::ModInfoBuilder<N> {
        let mut builder = firmware::ModInfoBuilder::new(module_name);

        let mut i = 0;
        while i < Self::FILES.len() {
            builder = builder.new_entry()
                .push(Self::DIR)
                .push(Self::FILES[i])
                .push(".bin");

                i += 1;
        }

        builder
     }
}

module! {
   type: MyModule,
   name: "module_firmware_test",
   author: "Rust for Linux",
   description: "module_firmware! test module",
   license: "GPL",
}

kernel::module_firmware!(Builder);