Re: [PATCH] modules/firmware: add a new option to denote a firmware group to choose one.
From: Luis Chamberlain <mcgrof@kernel.org>
Date: 2023-05-02 22:11:08
Also in:
dri-devel, lkml
On Tue, May 02, 2023 at 11:11:58AM -0700, Lucas De Marchi wrote:
Based on the above and my previous reply, I think we should have something more explicit about the order rather than relying on the toolchain behavior.
You can open code ELF sections and provide SORT() but you can also use
helpers for all this. Long ago I provided low level ELF helpers to
provide the ability to easily sort through data / code using
linker-tables [0], to help with ELF section with explicit ordering,
perhaps this could be leveraged?
I *think* for instance, one could do, using the built-in firmware
conversion as a slightly relateed example [1], provide a firmware helper for
drivers which uses something like DECLARE_FIRMWARE_TABLE(acme_gpu_fw),
then that is declared as the ELF table for acme_gpu_fw, the firmware API
could then get the hint to use that table for iterating over with
linktable_for_each(fw, acme_gpu_fw). One would not be using the linker
table for the actual firmware but instead for the firmware odering.
The firmware loader could be extended with something like
#define DECLARE_FIRMWARE_TABLE(fw_table) DECLARE_LINKTABLE_RO(struct fw_foo, fw_table)
struct fw_foo {
const char *opt_subfamily;
};
#define FW_NAME_ORDERED(__level, __family, __sub_family) \
static LINKTABLE_INIT_DATA(fw_foo, __level) \
__fw_ordered_##__family = { \
opt_subfamily = sub_family, \
};
Then firmware could would use
FW_NAME_ORDERED(01, acme_gpu_fw, coyote);
And helpers can use it to look for the firmware an firmare API call.
As to why linker-tables never got upstream? It promised / documented
too much, we need to just make the API conversion smooth and target
that. The ordering is a secondary win. The fact that we can simplify
init levels etc, is more futuristic and should only be documented once
we get there.
[0] https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/log/?h=20170620-linker-tables-v8
[1] https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/commit/?h=20170620-linker-tables-v8&id=162698d2f1a2406c6a7a4d39f13113ca789fd2ec
Luis