• Hector Martin's avatar
    wifi: brcmfmac: pcie: Perform firmware selection for Apple platforms · 6bad3eea
    Hector Martin authored
    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.
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarHector Martin <marcan@marcan.st>
    Reviewed-by: default avatarAlvin Šipraga <alsi@bang-olufsen.dk>
    Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
    Link: https://lore.kernel.org/r/E1oZDns-0077aY-Qn@rmk-PC.armlinux.org.uk
    6bad3eea
pcie.c 64.5 KB