On Tue, Jan 4, 2022 at 9:28 AM Hector Martin <marcan@xxxxxxxxx> 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. ... > + /* 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); > + > + /* 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); NIH devm_kasprrintf() ? > + /* apple,shikoku */ > + fwreq->board_types[5] = devinfo->settings->board_type; > + > + buf = devm_kzalloc(&devinfo->pdev->dev, len, GFP_KERNEL); > + > + strscpy(buf, devinfo->settings->board_type, len); > + strlcat(buf, "-", len); > + strlcat(buf, devinfo->settings->antenna_sku, len); > + /* apple,shikoku-X3 */ > + fwreq->board_types[4] = devm_kstrdup(&devinfo->pdev->dev, buf, > + GFP_KERNEL); > + > + strscpy(buf, devinfo->settings->board_type, len); > + strlcat(buf, "-", len); > + strlcat(buf, devinfo->otp.module, len); > + /* apple,shikoku-RASP */ > + fwreq->board_types[3] = devm_kstrdup(&devinfo->pdev->dev, buf, > + GFP_KERNEL); > + > + strlcat(buf, "-", len); > + strlcat(buf, devinfo->otp.vendor, len); > + /* apple,shikoku-RASP-m */ > + fwreq->board_types[2] = devm_kstrdup(&devinfo->pdev->dev, buf, > + GFP_KERNEL); > + > + strlcat(buf, "-", len); > + strlcat(buf, devinfo->otp.version, len); > + /* apple,shikoku-RASP-m-6.11 */ > + fwreq->board_types[1] = devm_kstrdup(&devinfo->pdev->dev, buf, > + GFP_KERNEL); > + > + strlcat(buf, "-", len); > + strlcat(buf, devinfo->settings->antenna_sku, len); > + /* apple,shikoku-RASP-m-6.11-X3 */ > + fwreq->board_types[0] = buf; -- With Best Regards, Andy Shevchenko