lkml.org 
[lkml]   [2022]   [Jan]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v2 09/35] brcmfmac: pcie: Perform firmware selection for Apple platforms
    From
    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]
    \
     
     \ /
      Last update: 2022-01-08 21:05    [W:4.028 / U:0.220 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site