Messages in this thread | | | Date | Sat, 8 Jan 2022 21:03:20 +0100 | Subject | Re: [PATCH v2 09/35] brcmfmac: pcie: Perform firmware selection for Apple platforms | From | Arend van Spriel <> |
| |
On 1/4/2022 8:26 AM, Hector Martin wrote: > On Apple platforms, firmware selection uses the following elements: > > Property Example Source > ============== ======= ======================== > * Chip name 4378 Device ID > * Chip revision B1 OTP > * Platform shikoku DT (ARM64) or ACPI (x86) > * Module type RASP OTP > * Module vendor m OTP > * Module version 6.11 OTP > * Antenna SKU X3 DT (ARM64) or ACPI (x86) > > In macOS, these firmwares are stored using filenames in this format > under /usr/share/firmware/wifi: > > C-4378__s-B1/P-shikoku-X3_M-RASP_V-m__m-6.11.txt > > To prepare firmwares for Linux, we rename these to a scheme following > the existing brcmfmac convention: > > brcmfmac<chip><lower(rev)>-pcie.apple,<platform>-<mod_type>-\ > <mod_vendor>-<mod_version>-<antenna_sku>.txt > > The NVRAM uses all the components, while the firmware and CLM blob only > use the chip/revision/platform/antenna_sku: > > brcmfmac<chip><lower(rev)>-pcie.apple,<platform>-<antenna_sku>.bin > > e.g. > > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.bin > > In addition, since there are over 1000 files in total, many of which are > symlinks or outright duplicates, we deduplicate and prune the firmware > tree to reduce firmware filenames to fewer dimensions. For example, the > shikoku platform (MacBook Air M1 2020) simplifies to just 4 files: > > brcm/brcmfmac4378b1-pcie.apple,shikoku.clm_blob > brcm/brcmfmac4378b1-pcie.apple,shikoku.bin > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-u.txt > > This reduces the total file count to around 170, of which 75 are > symlinks and 95 are regular files: 7 firmware blobs, 27 CLM blobs, and > 61 NVRAM config files. We also slightly process NVRAM files to correct > some formatting issues. > > To handle this, the driver must try the following path formats when > looking for firmware files: > > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP.txt > brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.txt * > brcm/brcmfmac4378b1-pcie.apple,shikoku.txt > > * Not relevant for NVRAM, only for firmware/CLM. > > The chip revision nominally comes from OTP on Apple platforms, but it > can be mapped to the PCI revision number, so we ignore the OTP revision > and continue to use the existing PCI revision mechanism to identify chip > revisions, as the driver already does for other chips. Unfortunately, > the mapping is not consistent between different chip types, so this has > to be determined experimentally.
Not sure I understand this. The chip revision comes from the chipcommon register [1]. Maybe that is what you mean by "PCI revision number". For some chips it is possible OTP is used to override that.
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> > Signed-off-by: Hector Martin <marcan@marcan.st> > --- > .../broadcom/brcm80211/brcmfmac/pcie.c | 58 ++++++++++++++++++- > 1 file changed, 56 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > index 74c9a4f74813..250e0bd40cb3 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c > @@ -2094,8 +2094,62 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) > fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; > fwreq->bus_nr = devinfo->pdev->bus->number; > > - brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type); > - fwreq->board_types[0] = devinfo->settings->board_type; > + /* Apple platforms with fancy firmware/NVRAM selection */ > + if (devinfo->settings->board_type && > + devinfo->settings->antenna_sku && > + devinfo->otp.valid) { > + char *buf; > + int len; > + > + brcmf_dbg(PCIE, "Apple board: %s\n", > + devinfo->settings->board_type);
maybe good to use local reference for devinfo->settings->board_type, which is used several times below.
> + > + /* Example: apple,shikoku-RASP-m-6.11-X3 */ > + len = (strlen(devinfo->settings->board_type) + 1 + > + strlen(devinfo->otp.module) + 1 + > + strlen(devinfo->otp.vendor) + 1 + > + strlen(devinfo->otp.version) + 1 + > + strlen(devinfo->settings->antenna_sku) + 1); > + > + /* apple,shikoku */ > + fwreq->board_types[5] = devinfo->settings->board_type;
[1] https://elixir.bootlin.com/linux/latest/source/include/linux/bcma/bcma_driver_chipcommon.h#L12 [unhandled content-type:application/pkcs7-signature] | |