You've already forked linux-t2-patches
mirror of
https://github.com/t2linux/linux-t2-patches.git
synced 2026-04-30 13:52:11 -07:00
e9cd73ca95
This means firmware will be selected automatically like macOS does. These patches also fix a couple of bugs and make a few optimisations. For this firmware selection: # in macos (or linux if you have a copy of the wifi folder): git clone https://github.com/AsahiLinux/asahi-installer --depth=1 cd asahi-installer/src python3 -m firmware.wifi /usr/share/firmware/wifi firmware.tar # in linux cd /lib/firmware sudo tar xf /path/to/firmware.tar
161 lines
5.9 KiB
Diff
161 lines
5.9 KiB
Diff
From 9d6841d0ecb677e20436d60f6d82fb006613972b Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Tue, 21 Dec 2021 17:45:21 +0900
|
|
Subject: [PATCH 08/30] brcmfmac: pcie: Perform firmware selection for Apple
|
|
platforms
|
|
|
|
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 ??? (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 and add a missing default macaddr= property.
|
|
|
|
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 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.
|
|
|
|
Signed-off-by: Hector Martin <marcan@marcan.st>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/pcie.c | 68 +++++++++++++++++--
|
|
1 file changed, 63 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
index 3cc79d912..42b3c17ba 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
@@ -2089,11 +2089,69 @@ 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 = devm_kzalloc(&devinfo->pdev->dev,
|
|
- sizeof(const char *) * 2,
|
|
- GFP_KERNEL);
|
|
- 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);
|
|
+
|
|
+ /* 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);
|
|
+
|
|
+ fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
|
+ sizeof(const char *) * 7,
|
|
+ GFP_KERNEL);
|
|
+
|
|
+ /* apple,shikoku */
|
|
+ fwreq->board_types[5] = devinfo->settings->board_type;
|
|
+
|
|
+ buf = devm_kzalloc(&devinfo->pdev->dev, len, GFP_KERNEL);
|
|
+
|
|
+ strlcpy(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);
|
|
+
|
|
+ strlcpy(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;
|
|
+ } else {
|
|
+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);
|
|
+ fwreq->board_types = devm_kzalloc(&devinfo->pdev->dev,
|
|
+ sizeof(const char *) * 2,
|
|
+ GFP_KERNEL);
|
|
+ fwreq->board_types[0] = devinfo->settings->board_type;
|
|
+ }
|
|
|
|
return fwreq;
|
|
}
|
|
--
|
|
2.34.1
|
|
|