* [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
@ 2024-08-18 20:12 Marek Vasut
2024-08-18 20:12 ` [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset Marek Vasut
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Marek Vasut @ 2024-08-18 20:12 UTC (permalink / raw)
To: linux-wireless
Cc: Chung-Hsien Hsu, Chung-Hsien Hsu, Marek Vasut,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Carter Chen, Duoming Zhou, Erick Archer, Kalle Valo, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger, Owen Huang,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
Add support to download TRX firmware for PCIe and SDIO.
Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
---
NOTE: This is downstream upport from
https://github.com/Infineon/ifx-wireless-drivers/
branch RTM/v5.15.58-Indrik / tag release-v5.15.58-2024_0514
- ba34bf4816f9 ("brcmfmac: add support for TRX firmware download")
---
Cc: "Dr. David Alan Gilbert" <linux@treblig.org>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: "Rafał Miłecki" <zajec5@gmail.com>
Cc: Arend van Spriel <arend.vanspriel@broadcom.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Carter Chen <carter.chen@infineon.com>
Cc: Chung-Hsien Hsu <stanley.hsu@cypress.com>
Cc: Duoming Zhou <duoming@zju.edu.cn>
Cc: Erick Archer <erick.archer@outlook.com>
Cc: Kalle Valo <kvalo@kernel.org>
Cc: Kees Cook <kees@kernel.org>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Mathias Krause <minipli@grsecurity.net>
Cc: Matthias Brugger <mbrugger@suse.com>
Cc: Owen Huang <Owen.Huang@infineon.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>
Cc: brcm80211-dev-list.pdl@broadcom.com
Cc: brcm80211@lists.linux.dev
Cc: linux-wireless@vger.kernel.org
---
.../broadcom/brcm80211/brcmfmac/pcie.c | 12 +++++-
.../broadcom/brcm80211/brcmfmac/sdio.c | 20 +++++++---
.../broadcom/brcm80211/brcmfmac/trxhdr.h | 38 +++++++++++++++++++
3 files changed, 63 insertions(+), 7 deletions(-)
create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/trxhdr.h
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index ce482a3877e90..058a742d17eda 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -42,6 +42,7 @@
#include "chip.h"
#include "core.h"
#include "common.h"
+#include "trxhdr.h"
enum brcmf_pcie_state {
@@ -1684,6 +1685,8 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
u32 nvram_len)
{
struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
+ struct trx_header_le *trx = (struct trx_header_le *)fw->data;
+ u32 fw_size;
u32 sharedram_addr;
u32 sharedram_addr_written;
u32 loop_counter;
@@ -1697,8 +1700,13 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
return err;
brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name);
- memcpy_toio(devinfo->tcm + devinfo->ci->rambase,
- (void *)fw->data, fw->size);
+ address = devinfo->ci->rambase;
+ fw_size = fw->size;
+ if (trx->magic == cpu_to_le32(TRX_MAGIC)) {
+ address -= sizeof(struct trx_header_le);
+ fw_size = le32_to_cpu(trx->len);
+ }
+ memcpy_toio(devinfo->tcm + address, (void *)fw->data, fw_size);
resetintr = get_unaligned_le32(fw->data);
release_firmware(fw);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 1461dc453ac22..08881e366cae2 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -35,6 +35,7 @@
#include "core.h"
#include "common.h"
#include "bcdc.h"
+#include "trxhdr.h"
#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500)
#define CTL_DONE_TIMEOUT msecs_to_jiffies(2500)
@@ -3346,17 +3347,26 @@ brcmf_sdio_verifymemory(struct brcmf_sdio_dev *sdiodev, u32 ram_addr,
static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus,
const struct firmware *fw)
{
+ struct trx_header_le *trx = (struct trx_header_le *)fw->data;
+ u32 fw_size;
+ u32 address;
int err;
brcmf_dbg(TRACE, "Enter\n");
- err = brcmf_sdiod_ramrw(bus->sdiodev, true, bus->ci->rambase,
- (u8 *)fw->data, fw->size);
+ address = bus->ci->rambase;
+ fw_size = fw->size;
+ if (trx->magic == cpu_to_le32(TRX_MAGIC)) {
+ address -= sizeof(struct trx_header_le);
+ fw_size = le32_to_cpu(trx->len);
+ }
+ err = brcmf_sdiod_ramrw(bus->sdiodev, true, address,
+ (u8 *)fw->data, fw_size);
if (err)
brcmf_err("error %d on writing %d membytes at 0x%08x\n",
- err, (int)fw->size, bus->ci->rambase);
- else if (!brcmf_sdio_verifymemory(bus->sdiodev, bus->ci->rambase,
- (u8 *)fw->data, fw->size))
+ err, (int)fw_size, address);
+ else if (!brcmf_sdio_verifymemory(bus->sdiodev, address,
+ (u8 *)fw->data, fw_size))
err = -EIO;
return err;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/trxhdr.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/trxhdr.h
new file mode 100644
index 0000000000000..0411c7c7ffb99
--- /dev/null
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/trxhdr.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: ISC */
+/* Copyright (c) 2020 Cypress Semiconductor Corporation */
+
+#ifndef BRCMFMAC_TRXHDR_H
+#define BRCMFMAC_TRXHDR_H
+
+/* Bootloader makes special use of trx header "offsets" array */
+enum {
+ TRX_OFFSET_SIGN_INFO_IDX = 0,
+ TRX_OFFSET_DATA_FOR_SIGN1_IDX = 1,
+ TRX_OFFSET_DATA_FOR_SIGN2_IDX = 2,
+ TRX_OFFSET_ROOT_MODULUS_IDX = 3,
+ TRX_OFFSET_ROOT_EXPONENT_IDX = 67,
+ TRX_OFFSET_CONT_MODULUS_IDX = 68,
+ TRX_OFFSET_CONT_EXPONENT_IDX = 132,
+ TRX_OFFSET_HASH_FW_IDX = 133,
+ TRX_OFFSET_FW_LEN_IDX = 149,
+ TRX_OFFSET_TR_RST_IDX = 150,
+ TRX_OFFSET_FW_VER_FOR_ANTIROOLBACK_IDX = 151,
+ TRX_OFFSET_IV_IDX = 152,
+ TRX_OFFSET_NONCE_IDX = 160,
+ TRX_OFFSET_SIGN_INFO2_IDX = 168,
+ TRX_OFFSET_MAX_IDX
+};
+
+#define TRX_MAGIC 0x30524448 /* "HDR0" */
+#define TRX_VERSION 4 /* Version 4 */
+#define TRX_MAX_OFFSET TRX_OFFSET_MAX_IDX /* Max number of file offsets */
+
+struct trx_header_le {
+ __le32 magic; /* "HDR0" */
+ __le32 len; /* Length of file including header */
+ __le32 crc32; /* CRC from flag_version to end of file */
+ __le32 flag_version; /* 0:15 flags, 16:31 version */
+ __le32 offsets[TRX_MAX_OFFSET]; /* Offsets of partitions */
+};
+
+#endif /* BRCMFMAC_TRXHDR_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset
2024-08-18 20:12 [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Marek Vasut
@ 2024-08-18 20:12 ` Marek Vasut
2024-08-19 8:39 ` kernel test robot
2024-08-19 3:08 ` [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Ping-Ke Shih
` (2 subsequent siblings)
3 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2024-08-18 20:12 UTC (permalink / raw)
To: linux-wireless
Cc: Chung-Hsien Hsu, Chung-Hsien Hsu, Carter Chen, Owen Huang,
Marek Vasut, Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Duoming Zhou, Erick Archer, Kalle Valo, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
CYW55572 is a 2x2 dual-band 802.11a/b/g/n/ac/ax chipset with 20/40/80MHz
channel support. It is a WLAN+BT combo device with WLAN secure boot support.
The CYW55572 used to be labeled CYW55560.
Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
Signed-off-by: Carter Chen <carter.chen@infineon.com>
Signed-off-by: Owen Huang <Owen.Huang@infineon.com>
Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
---
NOTE: This is squashed from downstream upports from
https://github.com/Infineon/ifx-wireless-drivers/
branch RTM/v5.15.58-Indrik / tag release-v5.15.58-2024_0514
- 8a41d39f6290 ("brcmfmac: add Cypress PCIe vendor ID")
- 12f74eba2569 ("brcmfmac: add support for CYW55560 PCIe chipset")
- ea4e4056a3f8 ("brcmfmac: update firmware loading name for CY5557x")
- ee322201fe11 ("brcmfmac: use SR core id to decide SR capability for CY55572")
- 0a47ed7f3678 ("brcmfmac: Fix invalid RAM address warning for PCIE platforms")
---
Cc: "Dr. David Alan Gilbert" <linux@treblig.org>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: "Rafał Miłecki" <zajec5@gmail.com>
Cc: Arend van Spriel <arend.vanspriel@broadcom.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Carter Chen <carter.chen@infineon.com>
Cc: Chung-Hsien Hsu <stanley.hsu@cypress.com>
Cc: Duoming Zhou <duoming@zju.edu.cn>
Cc: Erick Archer <erick.archer@outlook.com>
Cc: Kalle Valo <kvalo@kernel.org>
Cc: Kees Cook <kees@kernel.org>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Mathias Krause <minipli@grsecurity.net>
Cc: Matthias Brugger <mbrugger@suse.com>
Cc: Owen Huang <Owen.Huang@infineon.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>
Cc: brcm80211-dev-list.pdl@broadcom.com
Cc: brcm80211@lists.linux.dev
Cc: linux-wireless@vger.kernel.org
---
.../broadcom/brcm80211/brcmfmac/bcmsdh.c | 6 +
.../broadcom/brcm80211/brcmfmac/chip.c | 214 +++++++++++++++++-
.../broadcom/brcm80211/brcmfmac/chip.h | 34 +++
.../broadcom/brcm80211/brcmfmac/firmware.c | 15 +-
.../broadcom/brcm80211/brcmfmac/firmware.h | 8 +-
.../broadcom/brcm80211/brcmfmac/pcie.c | 192 +++++++++++++++-
.../broadcom/brcm80211/brcmfmac/sdio.c | 27 ++-
.../broadcom/brcm80211/include/brcm_hw_ids.h | 3 +
.../broadcom/brcm80211/include/brcmu_utils.h | 13 ++
include/linux/bcma/bcma.h | 1 +
include/linux/mmc/sdio_ids.h | 1 +
11 files changed, 497 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
index d35262335eaf7..ae89d73eefb87 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
@@ -46,6 +46,8 @@
#define SDIO_4373_FUNC2_BLOCKSIZE 256
#define SDIO_435X_FUNC2_BLOCKSIZE 256
#define SDIO_4329_FUNC2_BLOCKSIZE 128
+#define SDIO_CYW55572_FUNC2_BLOCKSIZE 256
+
/* Maximum milliseconds to wait for F2 to come up */
#define SDIO_WAIT_F2RDY 3000
@@ -917,6 +919,9 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
case SDIO_DEVICE_ID_BROADCOM_4329:
f2_blksz = SDIO_4329_FUNC2_BLOCKSIZE;
break;
+ case SDIO_DEVICE_ID_CYPRESS_55572:
+ f2_blksz = SDIO_CYW55572_FUNC2_BLOCKSIZE;
+ break;
default:
break;
}
@@ -996,6 +1001,7 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43752, CYW),
BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359, CYW),
CYW_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43439, CYW),
+ CYW_SDIO_DEVICE(SDIO_DEVICE_ID_CYPRESS_55572, CYW),
{ /* end: all zeroes */ }
};
MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index 2ef92ef25517e..c5188a31c9efb 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -216,6 +216,32 @@ struct sbsocramregs {
#define ARMCR4_BSZ_MULT 8192
#define ARMCR4_BLK_1K_MASK 0x200
+/* CYW55572 dedicated space and RAM base */
+#define CYW55572_TCAM_SIZE 0x800
+#define CYW55572_TRXHDR_SIZE 0x2b4
+#define CYW55572_RAM_BASE (0x370000 + \
+ CYW55572_TCAM_SIZE + CYW55572_TRXHDR_SIZE)
+
+#define BRCMF_BLHS_POLL_INTERVAL 10 /* msec */
+#define BRCMF_BLHS_D2H_READY_TIMEOUT 100 /* msec */
+#define BRCMF_BLHS_D2H_TRXHDR_PARSE_DONE_TIMEOUT 50 /* msec */
+#define BRCMF_BLHS_D2H_VALDN_DONE_TIMEOUT 250 /* msec */
+
+/* Bootloader handshake flags - dongle to host */
+#define BRCMF_BLHS_D2H_START BIT(0)
+#define BRCMF_BLHS_D2H_READY BIT(1)
+#define BRCMF_BLHS_D2H_STEADY BIT(2)
+#define BRCMF_BLHS_D2H_TRXHDR_PARSE_DONE BIT(3)
+#define BRCMF_BLHS_D2H_VALDN_START BIT(4)
+#define BRCMF_BLHS_D2H_VALDN_RESULT BIT(5)
+#define BRCMF_BLHS_D2H_VALDN_DONE BIT(6)
+
+/* Bootloader handshake flags - host to dongle */
+#define BRCMF_BLHS_H2D_DL_FW_START BIT(0)
+#define BRCMF_BLHS_H2D_DL_FW_DONE BIT(1)
+#define BRCMF_BLHS_H2D_DL_NVRAM_DONE BIT(2)
+#define BRCMF_BLHS_H2D_BL_RESET_ON_ERROR BIT(3)
+
struct brcmf_core_priv {
struct brcmf_core pub;
u32 wrapbase;
@@ -501,6 +527,21 @@ char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
return buf;
}
+static bool brcmf_chip_find_coreid(struct brcmf_chip_priv *ci, u16 coreid)
+{
+ struct brcmf_core_priv *core;
+
+ list_for_each_entry(core, &ci->cores, list) {
+ brcmf_dbg(TRACE, " core 0x%x:%-2d base 0x%08x wrap 0x%08x\n",
+ core->pub.id, core->pub.rev, core->pub.base,
+ core->wrapbase);
+ if (core->pub.id == coreid)
+ return true;
+ }
+
+ return false;
+}
+
static struct brcmf_core *brcmf_chip_add_core(struct brcmf_chip_priv *ci,
u16 coreid, u32 base,
u32 wrapbase)
@@ -745,6 +786,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
return 0x352000;
case BRCM_CC_4387_CHIP_ID:
return 0x740000;
+ case CY_CC_55572_CHIP_ID:
+ return CYW55572_RAM_BASE;
default:
brcmf_err("unknown chip: %s\n", ci->pub.name);
break;
@@ -763,6 +806,9 @@ int brcmf_chip_get_raminfo(struct brcmf_chip *pub)
if (mem) {
mem_core = container_of(mem, struct brcmf_core_priv, pub);
ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core);
+ if (ci->pub.chip == CY_CC_55572_CHIP_ID)
+ ci->pub.ramsize -= (CYW55572_TCAM_SIZE +
+ CYW55572_TRXHDR_SIZE);
ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
if (ci->pub.rambase == INVALID_RAMBASE) {
brcmf_err("RAM base not provided with ARM CR4 core\n");
@@ -942,7 +988,8 @@ int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci)
/* need core with ports */
if (nmw + nsw == 0 &&
id != BCMA_CORE_PMU &&
- id != BCMA_CORE_GCI)
+ id != BCMA_CORE_GCI &&
+ id != BCMA_CORE_SR)
continue;
/* try to obtain register address info */
@@ -966,6 +1013,144 @@ u32 brcmf_chip_enum_base(u16 devid)
return SI_ENUM_BASE_DEFAULT;
}
+static void brcmf_blhs_init(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ u32 addr;
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ addr = pub->blhs->h2d;
+ pub->blhs->write(chip->ctx, addr, 0);
+}
+
+static int brcmf_blhs_is_bootloader_ready(struct brcmf_chip_priv *chip)
+{
+ u32 regdata;
+ u32 addr;
+
+ addr = chip->pub.blhs->d2h;
+ SPINWAIT_MS((chip->pub.blhs->read(chip->ctx, addr) &
+ BRCMF_BLHS_D2H_READY) == 0,
+ BRCMF_BLHS_D2H_READY_TIMEOUT, BRCMF_BLHS_POLL_INTERVAL);
+
+ regdata = chip->pub.blhs->read(chip->ctx, addr);
+ if (!(regdata & BRCMF_BLHS_D2H_READY)) {
+ brcmf_err("Timeout waiting for bootloader ready\n");
+ return -EPERM;
+ }
+
+ return 0;
+}
+
+static int brcmf_blhs_prep_fw_download(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ u32 addr;
+ int err;
+
+ /* Host indication for bootloader to start the init */
+ brcmf_blhs_init(pub);
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ err = brcmf_blhs_is_bootloader_ready(chip);
+ if (err)
+ return err;
+
+ /* Host notification about FW download start */
+ addr = pub->blhs->h2d;
+ pub->blhs->write(chip->ctx, addr, BRCMF_BLHS_H2D_DL_FW_START);
+
+ return 0;
+}
+
+static int brcmf_blhs_post_fw_download(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ u32 addr;
+ u32 regdata;
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ addr = pub->blhs->h2d;
+ pub->blhs->write(chip->ctx, addr, BRCMF_BLHS_H2D_DL_FW_DONE);
+ addr = pub->blhs->d2h;
+ SPINWAIT_MS((pub->blhs->read(chip->ctx, addr) &
+ BRCMF_BLHS_D2H_TRXHDR_PARSE_DONE) == 0,
+ BRCMF_BLHS_D2H_TRXHDR_PARSE_DONE_TIMEOUT,
+ BRCMF_BLHS_POLL_INTERVAL);
+
+ regdata = pub->blhs->read(chip->ctx, addr);
+ if (!(regdata & BRCMF_BLHS_D2H_TRXHDR_PARSE_DONE)) {
+ brcmf_err("TRX header parsing failed\n");
+
+ /* Host indication for bootloader to get reset on error */
+ addr = pub->blhs->h2d;
+ regdata = pub->blhs->read(chip->ctx, addr);
+ regdata |= BRCMF_BLHS_H2D_BL_RESET_ON_ERROR;
+ pub->blhs->write(chip->ctx, addr, regdata);
+
+ return -EPERM;
+ }
+
+ return 0;
+}
+
+static void brcmf_blhs_post_nvram_download(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ u32 addr;
+ u32 regdata;
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ addr = pub->blhs->h2d;
+ regdata = pub->blhs->read(chip->ctx, addr);
+ regdata |= BRCMF_BLHS_H2D_DL_NVRAM_DONE;
+ pub->blhs->write(chip->ctx, addr, regdata);
+}
+
+static int brcmf_blhs_chk_validation(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ u32 addr;
+ u32 regdata;
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ addr = pub->blhs->d2h;
+ SPINWAIT_MS((pub->blhs->read(chip->ctx, addr) &
+ BRCMF_BLHS_D2H_VALDN_DONE) == 0,
+ BRCMF_BLHS_D2H_VALDN_DONE_TIMEOUT,
+ BRCMF_BLHS_POLL_INTERVAL);
+
+ regdata = pub->blhs->read(chip->ctx, addr);
+ if (!(regdata & BRCMF_BLHS_D2H_VALDN_DONE) ||
+ !(regdata & BRCMF_BLHS_D2H_VALDN_RESULT)) {
+ brcmf_err("TRX image validation check failed\n");
+
+ /* Host notification for bootloader to get reset on error */
+ addr = pub->blhs->h2d;
+ regdata = pub->blhs->read(chip->ctx, addr);
+ regdata |= BRCMF_BLHS_H2D_BL_RESET_ON_ERROR;
+ pub->blhs->write(chip->ctx, addr, regdata);
+
+ return -EPERM;
+ }
+
+ return 0;
+}
+
+static int brcmf_blhs_post_watchdog_reset(struct brcmf_chip *pub)
+{
+ struct brcmf_chip_priv *chip;
+ int err;
+
+ /* Host indication for bootloader to start the init */
+ brcmf_blhs_init(pub);
+
+ chip = container_of(pub, struct brcmf_chip_priv, pub);
+ err = brcmf_blhs_is_bootloader_ready(chip);
+
+ return err;
+}
+
static int brcmf_chip_recognition(struct brcmf_chip_priv *ci)
{
struct brcmf_core *core;
@@ -1123,6 +1308,7 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx, u16 devid,
const struct brcmf_buscore_ops *ops)
{
struct brcmf_chip_priv *chip;
+ struct brcmf_blhs *blhs;
int err = 0;
if (WARN_ON(!ops->read32))
@@ -1150,6 +1336,26 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx, u16 devid,
if (err < 0)
goto fail;
+ blhs = NULL;
+ if (chip->ops->blhs_attach) {
+ err = chip->ops->blhs_attach(chip->ctx, &blhs,
+ BRCMF_BLHS_D2H_READY,
+ BRCMF_BLHS_D2H_READY_TIMEOUT,
+ BRCMF_BLHS_POLL_INTERVAL);
+ if (err < 0)
+ goto fail;
+
+ if (blhs) {
+ blhs->init = brcmf_blhs_init;
+ blhs->prep_fwdl = brcmf_blhs_prep_fw_download;
+ blhs->post_fwdl = brcmf_blhs_post_fw_download;
+ blhs->post_nvramdl = brcmf_blhs_post_nvram_download;
+ blhs->chk_validation = brcmf_blhs_chk_validation;
+ blhs->post_wdreset = brcmf_blhs_post_watchdog_reset;
+ }
+ }
+ chip->pub.blhs = blhs;
+
err = brcmf_chip_recognition(chip);
if (err < 0)
goto fail;
@@ -1176,6 +1382,7 @@ void brcmf_chip_detach(struct brcmf_chip *pub)
list_del(&core->list);
kfree(core);
}
+ kfree(pub->blhs);
kfree(chip);
}
@@ -1309,7 +1516,8 @@ brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip)
int i;
struct brcmf_core *core;
- brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4);
+ if (!chip->pub.blhs)
+ brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4);
/* Disable the cores only and let the firmware enable them.
* Releasing reset ourselves breaks BCM4387 in weird ways.
@@ -1456,6 +1664,8 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
reg = chip->ops->read32(chip->ctx, addr);
return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
+ case CY_CC_55572_CHIP_ID:
+ return brcmf_chip_find_coreid(chip, BCMA_CORE_SR);
default:
addr = CORE_CC_REG(pmu->base, pmucapabilities_ext);
reg = chip->ops->read32(chip->ctx, addr);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
index d69f101f58344..0a00fb9d7632e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
@@ -10,6 +10,8 @@
#define CORE_CC_REG(base, field) \
(base + offsetof(struct chipcregs, field))
+struct brcmf_blhs;
+
/**
* struct brcmf_chip - chip level information.
*
@@ -24,6 +26,7 @@
* @ramsize: amount of RAM on chip including retention.
* @srsize: amount of retention RAM on chip.
* @name: string representation of the chip identifier.
+ * @blhs: bootlooder handshake handle.
*/
struct brcmf_chip {
u32 chip;
@@ -37,6 +40,7 @@ struct brcmf_chip {
u32 ramsize;
u32 srsize;
char name[12];
+ struct brcmf_blhs *blhs;
};
/**
@@ -61,6 +65,7 @@ struct brcmf_core {
* @setup: bus-specific core setup.
* @active: chip becomes active.
* The callback should use the provided @rstvec when non-zero.
+ * @blhs_attach: attach bootloader handshake handle
*/
struct brcmf_buscore_ops {
u32 (*read32)(void *ctx, u32 addr);
@@ -69,6 +74,35 @@ struct brcmf_buscore_ops {
int (*reset)(void *ctx, struct brcmf_chip *chip);
int (*setup)(void *ctx, struct brcmf_chip *chip);
void (*activate)(void *ctx, struct brcmf_chip *chip, u32 rstvec);
+ int (*blhs_attach)(void *ctx, struct brcmf_blhs **blhs, u32 flag,
+ uint timeout, uint interval);
+};
+
+/**
+ * struct brcmf_blhs - bootloader handshake handle related information.
+ *
+ * @d2h: offset of dongle to host register for the handshake.
+ * @h2d: offset of host to dongle register for the handshake.
+ * @init: bootloader handshake initialization.
+ * @prep_fwdl: handshake before firmware download.
+ * @post_fwdl: handshake after firmware download.
+ * @post_nvramdl: handshake after nvram download.
+ * @chk_validation: handshake for firmware validation check.
+ * @post_wdreset: handshake after watchdog reset.
+ * @read: read value with register offset for the handshake.
+ * @write: write value with register offset for the handshake.
+ */
+struct brcmf_blhs {
+ u32 d2h;
+ u32 h2d;
+ void (*init)(struct brcmf_chip *pub);
+ int (*prep_fwdl)(struct brcmf_chip *pub);
+ int (*post_fwdl)(struct brcmf_chip *pub);
+ void (*post_nvramdl)(struct brcmf_chip *pub);
+ int (*chk_validation)(struct brcmf_chip *pub);
+ int (*post_wdreset)(struct brcmf_chip *pub);
+ u32 (*read)(void *ctx, u32 addr);
+ void (*write)(void *ctx, u32 addr, u32 value);
};
int brcmf_chip_get_raminfo(struct brcmf_chip *pub);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
index 83f8ed7d00f96..1d5be3ce51ccf 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
@@ -527,7 +527,8 @@ static void brcmf_fw_free_request(struct brcmf_fw_request *req)
int i;
for (i = 0, item = &req->items[0]; i < req->n_items; i++, item++) {
- if (item->type == BRCMF_FW_TYPE_BINARY)
+ if (item->type == BRCMF_FW_TYPE_BINARY ||
+ item->type == BRCMF_FW_TYPE_TRXSE)
release_firmware(item->binary);
else if (item->type == BRCMF_FW_TYPE_NVRAM)
brcmf_fw_nvram_free(item->nv_data.data);
@@ -599,6 +600,7 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
ret = brcmf_fw_request_nvram_done(fw, fwctx);
break;
case BRCMF_FW_TYPE_BINARY:
+ case BRCMF_FW_TYPE_TRXSE:
if (fw)
cur->binary = fw;
else
@@ -672,8 +674,19 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
{
struct brcmf_fw *fwctx = ctx;
+ struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
+ char alt_path[BRCMF_FW_NAME_LEN];
int ret;
+ if (!fw && cur->type == BRCMF_FW_TYPE_TRXSE) {
+ strscpy(alt_path, cur->path, BRCMF_FW_NAME_LEN);
+ /* strip 'se' from .trxse at the end */
+ alt_path[strlen(alt_path) - 2] = 0;
+ ret = request_firmware(&fw, alt_path, fwctx->dev);
+ if (!ret)
+ cur->path = alt_path;
+ }
+
ret = brcmf_fw_complete_request(fw, fwctx);
while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
index 4002d326fd21b..ab709babd649a 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
@@ -41,6 +41,11 @@ static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin"); \
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".clm_blob")
+#define CY_FW_TRXSE_DEF(fw_name, fw_base) \
+static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
+ BRCMF_FW_DEFAULT_PATH fw_base; \
+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".trxse")
+
#define BRCMF_FW_ENTRY(chipid, mask, name) \
{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
@@ -48,7 +53,8 @@ void brcmf_fw_nvram_free(void *nvram);
enum brcmf_fw_type {
BRCMF_FW_TYPE_BINARY,
- BRCMF_FW_TYPE_NVRAM
+ BRCMF_FW_TYPE_NVRAM,
+ BRCMF_FW_TYPE_TRXSE
};
struct brcmf_fw_item {
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 058a742d17eda..9cbbcdcfa69dc 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -71,6 +71,7 @@ BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie");
BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie");
BRCMF_FW_CLM_DEF(4378B3, "brcmfmac4378b3-pcie");
BRCMF_FW_CLM_DEF(4387C2, "brcmfmac4387c2-pcie");
+CY_FW_TRXSE_DEF(55572, "cyfmac55572-pcie");
/* firmware config files */
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.txt");
@@ -109,6 +110,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0x0000000F, 4378B1), /* revision ID 3 */
BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFE0, 4378B3), /* revision ID 5 */
BRCMF_FW_ENTRY(BRCM_CC_4387_CHIP_ID, 0xFFFFFFFF, 4387C2), /* revision ID 7 */
+ BRCMF_FW_ENTRY(CY_CC_55572_CHIP_ID, 0xFFFFFFFF, 55572),
};
#define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */
@@ -121,7 +123,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
#define BRCMF_PCIE_BAR0_WRAPPERBASE 0x70
#define BRCMF_PCIE_BAR0_WRAPBASE_DMP_OFFSET 0x1000
-#define BRCMF_PCIE_BARO_PCIE_ENUM_OFFSET 0x2000
+#define BRCMF_PCIE_BAR0_PCIE_ENUM_OFFSET 0x2000
+#define BRCMF_CYW55572_PCIE_BAR0_PCIE_ENUM_OFFSET 0x3000
#define BRCMF_PCIE_ARMCR4REG_BANKIDX 0x40
#define BRCMF_PCIE_ARMCR4REG_BANKPDA 0x4C
@@ -139,6 +142,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
#define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124
#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0 0x140
#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1 0x144
+#define BRCMF_PCIE_PCIE2REG_DAR_D2H_MSG_0 0xA80
+#define BRCMF_PCIE_PCIE2REG_DAR_H2D_MSG_0 0xA90
#define BRCMF_PCIE_64_PCIE2REG_INTMASK 0xC14
#define BRCMF_PCIE_64_PCIE2REG_MAILBOXINT 0xC30
@@ -271,18 +276,32 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
#define BRCMF_PCIE_CFGREG_MSI_ADDR_L 0x5C
#define BRCMF_PCIE_CFGREG_MSI_ADDR_H 0x60
#define BRCMF_PCIE_CFGREG_MSI_DATA 0x64
+#define BRCMF_PCIE_CFGREG_REVID 0x6C
#define BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL 0xBC
#define BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL2 0xDC
#define BRCMF_PCIE_CFGREG_RBAR_CTRL 0x228
#define BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1 0x248
#define BRCMF_PCIE_CFGREG_REG_BAR2_CONFIG 0x4E0
#define BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG 0x4F4
+#define BRCMF_PCIE_CFGREG_REVID_SECURE_MODE BIT(31)
#define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB 3
/* Magic number at a magic location to find RAM size */
#define BRCMF_RAMSIZE_MAGIC 0x534d4152 /* SMAR */
#define BRCMF_RAMSIZE_OFFSET 0x6c
+#define BRCMF_ENTROPY_SEED_LEN 64u
+#define BRCMF_ENTROPY_NONCE_LEN 16u
+#define BRCMF_ENTROPY_HOST_LEN (BRCMF_ENTROPY_SEED_LEN + \
+ BRCMF_ENTROPY_NONCE_LEN)
+#define BRCMF_NVRAM_OFFSET_TCM 4u
+#define BRCMF_NVRAM_COMPRS_FACTOR 4u
+#define BRCMF_NVRAM_RNG_SIGNATURE 0xFEEDC0DEu
+
+struct brcmf_rand_metadata {
+ u32 signature;
+ u32 count;
+};
struct brcmf_pcie_console {
u32 base_addr;
@@ -679,9 +698,15 @@ static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
val);
/* Watchdog reset */
+ if (devinfo->ci->blhs)
+ devinfo->ci->blhs->init(devinfo->ci);
brcmf_pcie_select_core(devinfo, BCMA_CORE_CHIPCOMMON);
WRITECC32(devinfo, watchdog, 4);
msleep(100);
+ if (devinfo->ci->blhs)
+ if (devinfo->ci->blhs->post_wdreset(devinfo->ci))
+ return;
+
/* Restore ASPM */
brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
@@ -722,6 +747,9 @@ static void brcmf_pcie_attach(struct brcmf_pciedev_info *devinfo)
static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
{
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
+ int err = 0;
+
if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4);
brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX,
@@ -733,7 +761,14 @@ static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKPDA,
0);
}
- return 0;
+
+ if (devinfo->ci->blhs) {
+ err = devinfo->ci->blhs->prep_fwdl(devinfo->ci);
+ if (err)
+ brcmf_err(bus, "FW download preparation failed");
+ }
+
+ return err;
}
@@ -747,8 +782,13 @@ static int brcmf_pcie_exit_download_state(struct brcmf_pciedev_info *devinfo,
brcmf_chip_resetcore(core, 0, 0, 0);
}
- if (!brcmf_chip_set_active(devinfo->ci, resetintr))
- return -EIO;
+ if (devinfo->ci->blhs) {
+ devinfo->ci->blhs->post_nvramdl(devinfo->ci);
+ } else {
+ if (!brcmf_chip_set_active(devinfo->ci, resetintr))
+ return -EIO;
+ }
+
return 0;
}
@@ -1608,6 +1648,27 @@ brcmf_pcie_adjust_ramsize(struct brcmf_pciedev_info *devinfo, u8 *data,
}
+static void
+brcmf_pcie_write_rand(struct brcmf_pciedev_info *devinfo, u32 nvram_csm)
+{
+ struct brcmf_rand_metadata rand_data;
+ u8 rand_buf[BRCMF_ENTROPY_HOST_LEN];
+ u32 count = BRCMF_ENTROPY_HOST_LEN;
+ u32 address;
+
+ address = devinfo->ci->rambase +
+ (devinfo->ci->ramsize - BRCMF_NVRAM_OFFSET_TCM) -
+ ((nvram_csm & 0xffff) * BRCMF_NVRAM_COMPRS_FACTOR) -
+ sizeof(rand_data);
+ memset(rand_buf, 0, BRCMF_ENTROPY_HOST_LEN);
+ rand_data.signature = cpu_to_le32(BRCMF_NVRAM_RNG_SIGNATURE);
+ rand_data.count = cpu_to_le32(count);
+ memcpy_toio(devinfo->tcm + address, &rand_data, sizeof(rand_data));
+ address -= count;
+ get_random_bytes(rand_buf, count);
+ memcpy_toio(devinfo->tcm + address, rand_buf, count);
+}
+
static int
brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
u32 sharedram_addr)
@@ -1693,6 +1754,8 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
int err;
u32 address;
u32 resetintr;
+ u32 nvram_lenw;
+ u32 nvram_csm;
brcmf_dbg(PCIE, "Halt ARM.\n");
err = brcmf_pcie_enter_download_state(devinfo);
@@ -1711,16 +1774,40 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
resetintr = get_unaligned_le32(fw->data);
release_firmware(fw);
- /* reset last 4 bytes of RAM address. to be used for shared
- * area. This identifies when FW is running
- */
- brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
+ if (devinfo->ci->blhs) {
+ err = devinfo->ci->blhs->post_fwdl(devinfo->ci);
+ if (err) {
+ brcmf_err(bus, "FW download failed, err=%d\n", err);
+ return err;
+ }
+
+ err = devinfo->ci->blhs->chk_validation(devinfo->ci);
+ if (err) {
+ brcmf_err(bus, "FW valication failed, err=%d\n", err);
+ return err;
+ }
+ } else {
+ /* reset last 4 bytes of RAM address. to be used for shared
+ * area. This identifies when FW is running
+ */
+ brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
+ }
if (nvram) {
brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
address = devinfo->ci->rambase + devinfo->ci->ramsize -
nvram_len;
+
+ if (devinfo->ci->blhs)
+ address -= 4;
memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
+
+ /* Convert nvram_len to words to determine the length token */
+ nvram_lenw = nvram_len / 4;
+ /* subtract word used to store the token itself on non-blhs devices */
+ if (!devinfo->ci->blhs)
+ nvram_lenw -= 1;
+ nvram_csm = (~nvram_lenw << 16) | (nvram_lenw & 0x0000FFFF);
brcmf_fw_nvram_free(nvram);
if (devinfo->otp.valid) {
@@ -1743,10 +1830,20 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
brcmf_pcie_provide_random_bytes(devinfo, address);
}
} else {
+ nvram_csm = 0;
brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
devinfo->nvram_name);
}
+ if (devinfo->ci->chip == CY_CC_55572_CHIP_ID) {
+ /* Write the length token to the last word of RAM address */
+ brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4,
+ cpu_to_le32(nvram_csm));
+
+ /* Write random numbers to TCM for randomizing heap address */
+ brcmf_pcie_write_rand(devinfo, nvram_csm);
+ }
+
sharedram_addr_written = brcmf_pcie_read_ram32(devinfo,
devinfo->ci->ramsize -
4);
@@ -1837,6 +1934,21 @@ static void brcmf_pcie_release_resource(struct brcmf_pciedev_info *devinfo)
pci_disable_device(devinfo->pdev);
}
+static u32 brcmf_pcie_buscore_blhs_read(void *ctx, u32 reg_offset)
+{
+ struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
+
+ brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
+ return brcmf_pcie_read_reg32(devinfo, reg_offset);
+}
+
+static void brcmf_pcie_buscore_blhs_write(void *ctx, u32 reg_offset, u32 value)
+{
+ struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
+
+ brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
+ brcmf_pcie_write_reg32(devinfo, reg_offset, value);
+}
static u32 brcmf_pcie_buscore_prep_addr(const struct pci_dev *pdev, u32 addr)
{
@@ -1907,12 +2019,63 @@ static void brcmf_pcie_buscore_activate(void *ctx, struct brcmf_chip *chip,
}
+static int brcmf_pcie_buscore_blhs_attach(void *ctx, struct brcmf_blhs **blhs,
+ u32 flag, uint timeout, uint interval)
+{
+ struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
+ struct brcmf_blhs *blhsh;
+ u32 regdata;
+ u32 pcie_enum;
+ u32 addr;
+
+ if (devinfo->pdev->vendor != CY_PCIE_VENDOR_ID_CYPRESS)
+ return 0;
+
+ pci_read_config_dword(devinfo->pdev, BRCMF_PCIE_CFGREG_REVID, ®data);
+ if (regdata & BRCMF_PCIE_CFGREG_REVID_SECURE_MODE) {
+ blhsh = kzalloc(sizeof(*blhsh), GFP_KERNEL);
+ if (!blhsh)
+ return -ENOMEM;
+
+ blhsh->d2h = BRCMF_PCIE_PCIE2REG_DAR_D2H_MSG_0;
+ blhsh->h2d = BRCMF_PCIE_PCIE2REG_DAR_H2D_MSG_0;
+ blhsh->read = brcmf_pcie_buscore_blhs_read;
+ blhsh->write = brcmf_pcie_buscore_blhs_write;
+
+ /* Host indication for bootloarder to start the init */
+ if (devinfo->pdev->device == CY_PCIE_55572_DEVICE_ID)
+ pcie_enum = BRCMF_CYW55572_PCIE_BAR0_PCIE_ENUM_OFFSET;
+ else
+ pcie_enum = BRCMF_PCIE_BAR0_PCIE_ENUM_OFFSET;
+
+ pci_read_config_dword(devinfo->pdev, PCI_BASE_ADDRESS_0,
+ ®data);
+ addr = regdata + pcie_enum + blhsh->h2d;
+ brcmf_pcie_buscore_write32(ctx, addr, 0);
+
+ addr = regdata + pcie_enum + blhsh->d2h;
+ SPINWAIT_MS((brcmf_pcie_buscore_read32(ctx, addr) & flag) == 0,
+ timeout, interval);
+ regdata = brcmf_pcie_buscore_read32(ctx, addr);
+ if (!(regdata & flag)) {
+ brcmf_err(bus, "Timeout waiting for bootloader ready\n");
+ kfree(blhsh);
+ return -EPERM;
+ }
+ *blhs = blhsh;
+ }
+
+ return 0;
+}
+
static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
.prepare = brcmf_pcie_buscoreprep,
.reset = brcmf_pcie_buscore_reset,
.activate = brcmf_pcie_buscore_activate,
.read32 = brcmf_pcie_buscore_read32,
.write32 = brcmf_pcie_buscore_write32,
+ .blhs_attach = brcmf_pcie_buscore_blhs_attach,
};
#define BRCMF_OTP_SYS_VENDOR 0x15
@@ -2243,6 +2406,9 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
{ ".txcap_blob", devinfo->txcap_name },
};
+ if (devinfo->ci->blhs)
+ fwnames[BRCMF_PCIE_FW_CODE].extension = ".trxse";
+
fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
brcmf_pcie_fwnames,
ARRAY_SIZE(brcmf_pcie_fwnames),
@@ -2250,7 +2416,10 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
if (!fwreq)
return NULL;
- fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
+ if (devinfo->ci->blhs)
+ fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_TRXSE;
+ else
+ fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY;
@@ -2678,6 +2847,9 @@ static const struct dev_pm_ops brcmf_pciedrvr_pm = {
BRCMF_FWVENDOR_ ## fw_vend \
}
+#define BRCMF_PCIE_DEVICE_CY(dev_id) { CY_PCIE_VENDOR_ID_CYPRESS, dev_id,\
+ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
+
static const struct pci_device_id brcmf_pcie_devid_table[] = {
BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID, WCC),
BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355, WCC),
@@ -2706,7 +2878,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = {
BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID, WCC),
BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID, WCC),
BRCMF_PCIE_DEVICE(BRCM_PCIE_4387_DEVICE_ID, WCC),
-
+ BRCMF_PCIE_DEVICE_CY(CY_PCIE_55572_DEVICE_ID),
{ /* end: all zeroes */ }
};
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 08881e366cae2..3bb03de1c2d29 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -59,6 +59,10 @@
#define CY_435X_F2_WATERMARK 0x40
#define CY_435X_F1_MESBUSYCTRL (CY_435X_F2_WATERMARK | \
SBSDIO_MESBUSYCTRL_ENAB)
+#define CYW55572_F2_WATERMARK 0x40
+#define CYW55572_MES_WATERMARK 0x40
+#define CYW55572_F1_MESBUSYCTRL (CYW55572_MES_WATERMARK | \
+ SBSDIO_MESBUSYCTRL_ENAB)
#ifdef DEBUG
@@ -626,6 +630,7 @@ BRCMF_FW_DEF(4359, "brcmfmac4359-sdio");
BRCMF_FW_CLM_DEF(4373, "brcmfmac4373-sdio");
BRCMF_FW_CLM_DEF(43012, "brcmfmac43012-sdio");
BRCMF_FW_CLM_DEF(43752, "brcmfmac43752-sdio");
+CY_FW_TRXSE_DEF(55572, "cyfmac55572-sdio");
/* firmware config files */
MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-sdio.*.txt");
@@ -658,7 +663,8 @@ static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
BRCMF_FW_ENTRY(CY_CC_43012_CHIP_ID, 0xFFFFFFFF, 43012),
BRCMF_FW_ENTRY(CY_CC_43439_CHIP_ID, 0xFFFFFFFF, 43439),
- BRCMF_FW_ENTRY(CY_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752)
+ BRCMF_FW_ENTRY(CY_CC_43752_CHIP_ID, 0xFFFFFFFF, 43752),
+ BRCMF_FW_ENTRY(CY_CC_55572_CHIP_ID, 0xFFFFFFFF, 55572)
};
#define TXCTL_CREDITS 2
@@ -719,7 +725,8 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
* fail. Thereby just bailing out immediately after clearing KSO
* bit, to avoid polling of KSO bit.
*/
- if (!on && bus->ci->chip == CY_CC_43012_CHIP_ID)
+ if (!on && (bus->ci->chip == CY_CC_43012_CHIP_ID ||
+ bus->ci->chip == CY_CC_55572_CHIP_ID))
return err;
if (on) {
@@ -3435,7 +3442,8 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
static bool brcmf_sdio_aos_no_decode(struct brcmf_sdio *bus)
{
if (bus->ci->chip == CY_CC_43012_CHIP_ID ||
- bus->ci->chip == CY_CC_43752_CHIP_ID)
+ bus->ci->chip == CY_CC_43752_CHIP_ID ||
+ bus->ci->chip == CY_CC_55572_CHIP_ID)
return true;
else
return false;
@@ -4352,6 +4360,19 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
CY_435X_F1_MESBUSYCTRL, &err);
break;
+ case SDIO_DEVICE_ID_CYPRESS_55572:
+ brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n",
+ CYW55572_F2_WATERMARK);
+ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
+ CYW55572_F2_WATERMARK, &err);
+ devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL,
+ &err);
+ devctl |= SBSDIO_DEVCTL_F2WM_ENAB;
+ brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl,
+ &err);
+ brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL,
+ CYW55572_F1_MESBUSYCTRL, &err);
+ break;
default:
brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK,
DEFAULT_F2_WATERMARK, &err);
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
index 44684bf1b9acc..fc1757c505312 100644
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
@@ -14,6 +14,7 @@
#define BRCM_USB_VENDOR_ID_LINKSYS 0x13b1
#define CY_USB_VENDOR_ID_CYPRESS 0x04b4
#define BRCM_PCIE_VENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM
+#define CY_PCIE_VENDOR_ID_CYPRESS 0x12be
/* Chipcommon Core Chip IDs */
#define BRCM_CC_43143_CHIP_ID 43143
@@ -59,6 +60,7 @@
#define CY_CC_43012_CHIP_ID 43012
#define CY_CC_43439_CHIP_ID 43439
#define CY_CC_43752_CHIP_ID 43752
+#define CY_CC_55572_CHIP_ID 0xd908
/* USB Device IDs */
#define BRCM_USB_43143_DEVICE_ID 0xbd1e
@@ -97,6 +99,7 @@
#define BRCM_PCIE_4377_DEVICE_ID 0x4488
#define BRCM_PCIE_4378_DEVICE_ID 0x4425
#define BRCM_PCIE_4387_DEVICE_ID 0x4433
+#define CY_PCIE_55572_DEVICE_ID 0xbd31
/* brcmsmac IDs */
#define BCM4313_D11N2G_ID 0x4727 /* 4313 802.11n 2.4G device */
diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h
index 9465323286673..48791ac87496d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h
+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_utils.h
@@ -21,6 +21,19 @@
} \
}
+/* Spin at most 'ms' milliseconds with polling interval 'interval' milliseconds
+ * while 'exp' is true. Caller should explicitly test 'exp' when this completes
+ * and take appropriate error action if 'exp' is still true.
+ */
+#define SPINWAIT_MS(exp, ms, interval) { \
+ typeof(interval) interval_ = (interval); \
+ uint countdown = (ms) + (interval_ - 1U); \
+ while ((exp) && (countdown >= interval_)) { \
+ msleep(interval_); \
+ countdown -= interval_; \
+ } \
+}
+
/* osl multi-precedence packet queue */
#define PKTQ_LEN_DEFAULT 128 /* Max 128 packets */
#define PKTQ_MAX_PREC 16 /* Maximum precedence levels */
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 60b94b944e9f1..fe1cb2aeaef38 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -154,6 +154,7 @@ struct bcma_host_ops {
#define BCMA_CORE_USB30_DEV 0x83D
#define BCMA_CORE_ARM_CR4 0x83E
#define BCMA_CORE_GCI 0x840
+#define BCMA_CORE_SR 0x841
#define BCMA_CORE_CMEM 0x846 /* CNDS DDR2/3 memory controller */
#define BCMA_CORE_ARM_CA7 0x847
#define BCMA_CORE_SYS_MEM 0x849
diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
index 7cddfdac2f576..8ba3f25217a21 100644
--- a/include/linux/mmc/sdio_ids.h
+++ b/include/linux/mmc/sdio_ids.h
@@ -80,6 +80,7 @@
#define SDIO_VENDOR_ID_CYPRESS 0x04b4
#define SDIO_DEVICE_ID_BROADCOM_CYPRESS_43439 0xbd3d
+#define SDIO_DEVICE_ID_CYPRESS_55572 0xbd31
#define SDIO_VENDOR_ID_MARVELL 0x02df
#define SDIO_DEVICE_ID_MARVELL_LIBERTAS 0x9103
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* RE: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-18 20:12 [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Marek Vasut
2024-08-18 20:12 ` [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset Marek Vasut
@ 2024-08-19 3:08 ` Ping-Ke Shih
2024-08-19 11:15 ` Marek Vasut
2024-08-19 14:35 ` Kalle Valo
2024-08-22 8:37 ` Kalle Valo
3 siblings, 1 reply; 14+ messages in thread
From: Ping-Ke Shih @ 2024-08-19 3:08 UTC (permalink / raw)
To: Marek Vasut, linux-wireless@vger.kernel.org
Cc: Chung-Hsien Hsu, Chung-Hsien Hsu, Dr. David Alan Gilbert,
Gustavo A. R. Silva, Rafał Miłecki, Arend van Spriel,
Bjorn Helgaas, Carter Chen, Duoming Zhou, Erick Archer,
Kalle Valo, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson,
brcm80211-dev-list.pdl@broadcom.com, brcm80211@lists.linux.dev
Marek Vasut <marex@denx.de>
> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>
> Add support to download TRX firmware for PCIe and SDIO.
>
> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
The email address of From field (author) is different from first s-o-b.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset
2024-08-18 20:12 ` [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset Marek Vasut
@ 2024-08-19 8:39 ` kernel test robot
0 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2024-08-19 8:39 UTC (permalink / raw)
To: Marek Vasut, linux-wireless
Cc: oe-kbuild-all, Chung-Hsien Hsu, Carter Chen, Owen Huang,
Marek Vasut, Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Duoming Zhou, Erick Archer, Kalle Valo, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
Hi Marek,
kernel test robot noticed the following build warnings:
[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main linus/master v6.11-rc4 next-20240819]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marek-Vasut/wifi-brcmfmac-add-support-for-CYW55572-PCIe-chipset/20240819-041807
base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link: https://lore.kernel.org/r/20240818201533.89669-2-marex%40denx.de
patch subject: [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset
config: loongarch-randconfig-r123-20240819 (https://download.01.org/0day-ci/archive/20240819/202408191646.1lqp64ie-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 14.1.0
reproduce: (https://download.01.org/0day-ci/archive/20240819/202408191646.1lqp64ie-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408191646.1lqp64ie-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1664:29: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] signature @@ got restricted __le32 [usertype] @@
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1664:29: sparse: expected unsigned int [usertype] signature
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1664:29: sparse: got restricted __le32 [usertype]
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1665:25: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] count @@ got restricted __le32 [usertype] @@
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1665:25: sparse: expected unsigned int [usertype] count
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1665:25: sparse: got restricted __le32 [usertype]
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1841:40: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected unsigned int [usertype] value @@ got restricted __le32 [usertype] @@
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1841:40: sparse: expected unsigned int [usertype] value
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c:1841:40: sparse: got restricted __le32 [usertype]
vim +1664 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
1649
1650
1651 static void
1652 brcmf_pcie_write_rand(struct brcmf_pciedev_info *devinfo, u32 nvram_csm)
1653 {
1654 struct brcmf_rand_metadata rand_data;
1655 u8 rand_buf[BRCMF_ENTROPY_HOST_LEN];
1656 u32 count = BRCMF_ENTROPY_HOST_LEN;
1657 u32 address;
1658
1659 address = devinfo->ci->rambase +
1660 (devinfo->ci->ramsize - BRCMF_NVRAM_OFFSET_TCM) -
1661 ((nvram_csm & 0xffff) * BRCMF_NVRAM_COMPRS_FACTOR) -
1662 sizeof(rand_data);
1663 memset(rand_buf, 0, BRCMF_ENTROPY_HOST_LEN);
> 1664 rand_data.signature = cpu_to_le32(BRCMF_NVRAM_RNG_SIGNATURE);
> 1665 rand_data.count = cpu_to_le32(count);
1666 memcpy_toio(devinfo->tcm + address, &rand_data, sizeof(rand_data));
1667 address -= count;
1668 get_random_bytes(rand_buf, count);
1669 memcpy_toio(devinfo->tcm + address, rand_buf, count);
1670 }
1671
1672 static int
1673 brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
1674 u32 sharedram_addr)
1675 {
1676 struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
1677 struct brcmf_pcie_shared_info *shared;
1678 u32 addr;
1679
1680 shared = &devinfo->shared;
1681 shared->tcm_base_address = sharedram_addr;
1682
1683 shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr);
1684 shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK);
1685 brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
1686 if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
1687 (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
1688 brcmf_err(bus, "Unsupported PCIE version %d\n",
1689 shared->version);
1690 return -EINVAL;
1691 }
1692
1693 /* check firmware support dma indicies */
1694 if (shared->flags & BRCMF_PCIE_SHARED_DMA_INDEX) {
1695 if (shared->flags & BRCMF_PCIE_SHARED_DMA_2B_IDX)
1696 devinfo->dma_idx_sz = sizeof(u16);
1697 else
1698 devinfo->dma_idx_sz = sizeof(u32);
1699 }
1700
1701 addr = sharedram_addr + BRCMF_SHARED_MAX_RXBUFPOST_OFFSET;
1702 shared->max_rxbufpost = brcmf_pcie_read_tcm16(devinfo, addr);
1703 if (shared->max_rxbufpost == 0)
1704 shared->max_rxbufpost = BRCMF_DEF_MAX_RXBUFPOST;
1705
1706 addr = sharedram_addr + BRCMF_SHARED_RX_DATAOFFSET_OFFSET;
1707 shared->rx_dataoffset = brcmf_pcie_read_tcm32(devinfo, addr);
1708
1709 addr = sharedram_addr + BRCMF_SHARED_HTOD_MB_DATA_ADDR_OFFSET;
1710 shared->htod_mb_data_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1711
1712 addr = sharedram_addr + BRCMF_SHARED_DTOH_MB_DATA_ADDR_OFFSET;
1713 shared->dtoh_mb_data_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1714
1715 addr = sharedram_addr + BRCMF_SHARED_RING_INFO_ADDR_OFFSET;
1716 shared->ring_info_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1717
1718 brcmf_dbg(PCIE, "max rx buf post %d, rx dataoffset %d\n",
1719 shared->max_rxbufpost, shared->rx_dataoffset);
1720
1721 brcmf_pcie_bus_console_init(devinfo);
1722 brcmf_pcie_bus_console_read(devinfo, false);
1723
1724 return 0;
1725 }
1726
1727 struct brcmf_random_seed_footer {
1728 __le32 length;
1729 __le32 magic;
1730 };
1731
1732 #define BRCMF_RANDOM_SEED_MAGIC 0xfeedc0de
1733 #define BRCMF_RANDOM_SEED_LENGTH 0x100
1734
1735 static noinline_for_stack void
1736 brcmf_pcie_provide_random_bytes(struct brcmf_pciedev_info *devinfo, u32 address)
1737 {
1738 u8 randbuf[BRCMF_RANDOM_SEED_LENGTH];
1739
1740 get_random_bytes(randbuf, BRCMF_RANDOM_SEED_LENGTH);
1741 memcpy_toio(devinfo->tcm + address, randbuf, BRCMF_RANDOM_SEED_LENGTH);
1742 }
1743
1744 static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
1745 const struct firmware *fw, void *nvram,
1746 u32 nvram_len)
1747 {
1748 struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
1749 struct trx_header_le *trx = (struct trx_header_le *)fw->data;
1750 u32 fw_size;
1751 u32 sharedram_addr;
1752 u32 sharedram_addr_written;
1753 u32 loop_counter;
1754 int err;
1755 u32 address;
1756 u32 resetintr;
1757 u32 nvram_lenw;
1758 u32 nvram_csm;
1759
1760 brcmf_dbg(PCIE, "Halt ARM.\n");
1761 err = brcmf_pcie_enter_download_state(devinfo);
1762 if (err)
1763 return err;
1764
1765 brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name);
1766 address = devinfo->ci->rambase;
1767 fw_size = fw->size;
1768 if (trx->magic == cpu_to_le32(TRX_MAGIC)) {
1769 address -= sizeof(struct trx_header_le);
1770 fw_size = le32_to_cpu(trx->len);
1771 }
1772 memcpy_toio(devinfo->tcm + address, (void *)fw->data, fw_size);
1773
1774 resetintr = get_unaligned_le32(fw->data);
1775 release_firmware(fw);
1776
1777 if (devinfo->ci->blhs) {
1778 err = devinfo->ci->blhs->post_fwdl(devinfo->ci);
1779 if (err) {
1780 brcmf_err(bus, "FW download failed, err=%d\n", err);
1781 return err;
1782 }
1783
1784 err = devinfo->ci->blhs->chk_validation(devinfo->ci);
1785 if (err) {
1786 brcmf_err(bus, "FW valication failed, err=%d\n", err);
1787 return err;
1788 }
1789 } else {
1790 /* reset last 4 bytes of RAM address. to be used for shared
1791 * area. This identifies when FW is running
1792 */
1793 brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
1794 }
1795
1796 if (nvram) {
1797 brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
1798 address = devinfo->ci->rambase + devinfo->ci->ramsize -
1799 nvram_len;
1800
1801 if (devinfo->ci->blhs)
1802 address -= 4;
1803 memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
1804
1805 /* Convert nvram_len to words to determine the length token */
1806 nvram_lenw = nvram_len / 4;
1807 /* subtract word used to store the token itself on non-blhs devices */
1808 if (!devinfo->ci->blhs)
1809 nvram_lenw -= 1;
1810 nvram_csm = (~nvram_lenw << 16) | (nvram_lenw & 0x0000FFFF);
1811 brcmf_fw_nvram_free(nvram);
1812
1813 if (devinfo->otp.valid) {
1814 size_t rand_len = BRCMF_RANDOM_SEED_LENGTH;
1815 struct brcmf_random_seed_footer footer = {
1816 .length = cpu_to_le32(rand_len),
1817 .magic = cpu_to_le32(BRCMF_RANDOM_SEED_MAGIC),
1818 };
1819
1820 /* Some Apple chips/firmwares expect a buffer of random
1821 * data to be present before NVRAM
1822 */
1823 brcmf_dbg(PCIE, "Download random seed\n");
1824
1825 address -= sizeof(footer);
1826 memcpy_toio(devinfo->tcm + address, &footer,
1827 sizeof(footer));
1828
1829 address -= rand_len;
1830 brcmf_pcie_provide_random_bytes(devinfo, address);
1831 }
1832 } else {
1833 nvram_csm = 0;
1834 brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
1835 devinfo->nvram_name);
1836 }
1837
1838 if (devinfo->ci->chip == CY_CC_55572_CHIP_ID) {
1839 /* Write the length token to the last word of RAM address */
1840 brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4,
> 1841 cpu_to_le32(nvram_csm));
1842
1843 /* Write random numbers to TCM for randomizing heap address */
1844 brcmf_pcie_write_rand(devinfo, nvram_csm);
1845 }
1846
1847 sharedram_addr_written = brcmf_pcie_read_ram32(devinfo,
1848 devinfo->ci->ramsize -
1849 4);
1850 brcmf_dbg(PCIE, "Bring ARM in running state\n");
1851 err = brcmf_pcie_exit_download_state(devinfo, resetintr);
1852 if (err)
1853 return err;
1854
1855 brcmf_dbg(PCIE, "Wait for FW init\n");
1856 sharedram_addr = sharedram_addr_written;
1857 loop_counter = BRCMF_PCIE_FW_UP_TIMEOUT / 50;
1858 while ((sharedram_addr == sharedram_addr_written) && (loop_counter)) {
1859 msleep(50);
1860 sharedram_addr = brcmf_pcie_read_ram32(devinfo,
1861 devinfo->ci->ramsize -
1862 4);
1863 loop_counter--;
1864 }
1865 if (sharedram_addr == sharedram_addr_written) {
1866 brcmf_err(bus, "FW failed to initialize\n");
1867 return -ENODEV;
1868 }
1869 if (sharedram_addr < devinfo->ci->rambase ||
1870 sharedram_addr >= devinfo->ci->rambase + devinfo->ci->ramsize) {
1871 brcmf_err(bus, "Invalid shared RAM address 0x%08x\n",
1872 sharedram_addr);
1873 return -ENODEV;
1874 }
1875 brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
1876
1877 return (brcmf_pcie_init_share_ram_info(devinfo, sharedram_addr));
1878 }
1879
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-19 3:08 ` [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Ping-Ke Shih
@ 2024-08-19 11:15 ` Marek Vasut
0 siblings, 0 replies; 14+ messages in thread
From: Marek Vasut @ 2024-08-19 11:15 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
Cc: Chung-Hsien Hsu, Chung-Hsien Hsu, Dr. David Alan Gilbert,
Gustavo A. R. Silva, Rafał Miłecki, Arend van Spriel,
Bjorn Helgaas, Carter Chen, Duoming Zhou, Erick Archer,
Kalle Valo, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson,
brcm80211-dev-list.pdl@broadcom.com, brcm80211@lists.linux.dev
On 8/19/24 5:08 AM, Ping-Ke Shih wrote:
> Marek Vasut <marex@denx.de>
>> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>>
>> Add support to download TRX firmware for PCIe and SDIO.
>>
>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>
> The email address of From field (author) is different from first s-o-b.
It seems this is a result of cypress being assimilated into infineon, it
seems like it is still the same person though.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-18 20:12 [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Marek Vasut
2024-08-18 20:12 ` [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset Marek Vasut
2024-08-19 3:08 ` [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Ping-Ke Shih
@ 2024-08-19 14:35 ` Kalle Valo
2024-08-19 15:52 ` Arend Van Spriel
2024-08-22 8:37 ` Kalle Valo
3 siblings, 1 reply; 14+ messages in thread
From: Kalle Valo @ 2024-08-19 14:35 UTC (permalink / raw)
To: Marek Vasut
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Carter Chen, Duoming Zhou, Erick Archer, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger, Owen Huang,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
Marek Vasut <marex@denx.de> writes:
> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>
> Add support to download TRX firmware for PCIe and SDIO.
>
> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
The commit message should answer to the question 'Why?'. What's TRX
firmware and why do we need it?
--
https://patchwork.kernel.org/project/linux-wireless/list/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-19 14:35 ` Kalle Valo
@ 2024-08-19 15:52 ` Arend Van Spriel
2024-08-19 16:17 ` Marek Vasut
0 siblings, 1 reply; 14+ messages in thread
From: Arend Van Spriel @ 2024-08-19 15:52 UTC (permalink / raw)
To: Kalle Valo, Marek Vasut
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
brcm80211
On August 19, 2024 4:36:05 PM Kalle Valo <kvalo@kernel.org> wrote:
> Marek Vasut <marex@denx.de> writes:
>
>> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>>
>> Add support to download TRX firmware for PCIe and SDIO.
>>
>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
>
> The commit message should answer to the question 'Why?'. What's TRX
> firmware and why do we need it?
I looked over the patches, but did not sit down to comment on this. The TRX
firmware format allows multiple images and possibly compression. Not sure
if Infineon is using all this functionality. This is probably needed for
55572 device support (patch 2/2). Turns out this device has a bootloader
that the driver has to talk with and that is probably where this TRX
support comes from. Not something I considered to happen for SDIO and PCIe
devices. There is always a puzzle to solve ;-)
Also noticed a random seed is provided to firmware. This already there for
apple chips so it should be looked at whether that code can be shared. I
will follow up.
Regards,
Arend
> --
> https://patchwork.kernel.org/project/linux-wireless/list/
>
> https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-19 15:52 ` Arend Van Spriel
@ 2024-08-19 16:17 ` Marek Vasut
2024-08-19 18:09 ` Florian Fainelli
0 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2024-08-19 16:17 UTC (permalink / raw)
To: Arend Van Spriel, Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
brcm80211
On 8/19/24 5:52 PM, Arend Van Spriel wrote:
Hi,
>>> Add support to download TRX firmware for PCIe and SDIO.
>>>
>>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current
>>> linux-next
>>
>> The commit message should answer to the question 'Why?'. What's TRX
>> firmware and why do we need it?
>
> I looked over the patches, but did not sit down to comment on this.
Thanks, it is real nice that someone who is actually familiar with the
hardware jumped in. I only upported the patches from infineon downstream.
> The
> TRX firmware format allows multiple images and possibly compression. Not
> sure if Infineon is using all this functionality. This is probably
> needed for 55572 device support (patch 2/2). Turns out this device has a
> bootloader that the driver has to talk with and that is probably where
> this TRX support comes from. Not something I considered to happen for
> SDIO and PCIe devices. There is always a puzzle to solve ;-)
>
> Also noticed a random seed is provided to firmware. This already there
> for apple chips so it should be looked at whether that code can be
> shared. I will follow up.
I did notice just now there is some TRX support for USB broadcom devices ?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-19 16:17 ` Marek Vasut
@ 2024-08-19 18:09 ` Florian Fainelli
2024-08-21 16:10 ` Marek Vasut
0 siblings, 1 reply; 14+ messages in thread
From: Florian Fainelli @ 2024-08-19 18:09 UTC (permalink / raw)
To: Marek Vasut, Arend Van Spriel, Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
brcm80211
On 8/19/24 09:17, Marek Vasut wrote:
> On 8/19/24 5:52 PM, Arend Van Spriel wrote:
>
> Hi,
>
>>>> Add support to download TRX firmware for PCIe and SDIO.
>>>>
>>>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>>>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current
>>>> linux-next
>>>
>>> The commit message should answer to the question 'Why?'. What's TRX
>>> firmware and why do we need it?
>>
>> I looked over the patches, but did not sit down to comment on this.
>
> Thanks, it is real nice that someone who is actually familiar with the
> hardware jumped in. I only upported the patches from infineon downstream.
>
>> The TRX firmware format allows multiple images and possibly
>> compression. Not sure if Infineon is using all this functionality.
>> This is probably needed for 55572 device support (patch 2/2). Turns
>> out this device has a bootloader that the driver has to talk with and
>> that is probably where this TRX support comes from. Not something I
>> considered to happen for SDIO and PCIe devices. There is always a
>> puzzle to solve ;-)
>>
>> Also noticed a random seed is provided to firmware. This already there
>> for apple chips so it should be looked at whether that code can be
>> shared. I will follow up.
>
> I did notice just now there is some TRX support for USB broadcom devices ?
>
TRX is a format that is also used for partitioning flash devices, so
there is probably some room for making a common header:
./Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt/drivers/mtd/parsers/parser_trx.c
--
Florian
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-19 18:09 ` Florian Fainelli
@ 2024-08-21 16:10 ` Marek Vasut
0 siblings, 0 replies; 14+ messages in thread
From: Marek Vasut @ 2024-08-21 16:10 UTC (permalink / raw)
To: Florian Fainelli, Arend Van Spriel, Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
brcm80211
On 8/19/24 8:09 PM, Florian Fainelli wrote:
Hi,
>> I did notice just now there is some TRX support for USB broadcom
>> devices ?
>>
>
> TRX is a format that is also used for partitioning flash devices, so
> there is probably some room for making a common header:
>
> ./Documentation/devicetree/bindings/mtd/partitions/brcm,trx.txt/drivers/mtd/parsers/parser_trx.c
Is that format somehow standardized ? I recall it was used on some
OpenWRT routers ?
It seems the TRXSE (whatever it is) is used more like a carrier for the
firmware blob (chunks?) which are pushed into SRAM (?) of the CYW55572
device.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-18 20:12 [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Marek Vasut
` (2 preceding siblings ...)
2024-08-19 14:35 ` Kalle Valo
@ 2024-08-22 8:37 ` Kalle Valo
2024-08-22 15:15 ` Marek Vasut
3 siblings, 1 reply; 14+ messages in thread
From: Kalle Valo @ 2024-08-22 8:37 UTC (permalink / raw)
To: Marek Vasut
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu, Marek Vasut,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Carter Chen, Duoming Zhou, Erick Archer, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger, Owen Huang,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
Marek Vasut <marex@denx.de> wrote:
> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>
> Add support to download TRX firmware for PCIe and SDIO.
>
> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
Please fix the review comments, also Ping's comment that from and s-o-b
needs to match.
2 patches set to Changes Requested.
13767592 [1/2] wifi: brcmfmac: add support for TRX firmware download
13767593 [2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset
--
https://patchwork.kernel.org/project/linux-wireless/patch/20240818201533.89669-1-marex@denx.de/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-22 8:37 ` Kalle Valo
@ 2024-08-22 15:15 ` Marek Vasut
2024-09-01 6:55 ` Arend Van Spriel
0 siblings, 1 reply; 14+ messages in thread
From: Marek Vasut @ 2024-08-22 15:15 UTC (permalink / raw)
To: Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Arend van Spriel, Bjorn Helgaas,
Carter Chen, Duoming Zhou, Erick Archer, Kees Cook,
Krzysztof Kozlowski, Mathias Krause, Matthias Brugger, Owen Huang,
Ulf Hansson, brcm80211-dev-list.pdl, brcm80211
On 8/22/24 10:37 AM, Kalle Valo wrote:
> Marek Vasut <marex@denx.de> wrote:
>
>> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>>
>> Add support to download TRX firmware for PCIe and SDIO.
>>
>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
>
> Please fix the review comments, also Ping's comment that from and s-o-b
> needs to match.
I have most of the changes addressed locally already.
Regarding the SoB line, do I update the commit Author email (because
that would make more sense, cypress got assimilated into infineon) or
the SoB line email to the "old" cypress email address ?
I am still hoping to get a bit more input on the TRX firmware handling
from Arend ... or maybe there is no further feedback ?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-08-22 15:15 ` Marek Vasut
@ 2024-09-01 6:55 ` Arend Van Spriel
2024-09-09 20:27 ` Marek Vasut
0 siblings, 1 reply; 14+ messages in thread
From: Arend Van Spriel @ 2024-09-01 6:55 UTC (permalink / raw)
To: Marek Vasut, Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
Double Lo
+ Double Lo
On August 22, 2024 5:24:09 PM Marek Vasut <marex@denx.de> wrote:
> On 8/22/24 10:37 AM, Kalle Valo wrote:
>> Marek Vasut <marex@denx.de> wrote:
>>
>>> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>>>
>>> Add support to download TRX firmware for PCIe and SDIO.
>>>
>>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current linux-next
>>
>> Please fix the review comments, also Ping's comment that from and s-o-b
>> needs to match.
>
> I have most of the changes addressed locally already.
>
> Regarding the SoB line, do I update the commit Author email (because
> that would make more sense, cypress got assimilated into infineon) or
> the SoB line email to the "old" cypress email address ?
I would say the SoB line is leading as developer's certificate and that has
the Infineon address so that seems more appropriate.
> I am still hoping to get a bit more input on the TRX firmware handling
> from Arend ... or maybe there is no further feedback ?
Took me a while before I looked into this. Can not offer much info though.
Within Broadcom code bases we only have a v1 and v2 defined for the TRX
format. This patch specifies v4. The only difference seem to be the number
of offsets and their meaning. Looking at the index definitions I suspect
this version accommodates signed firmware images which is verified by the
bootloader on the device.
Hopefully Infineon can/will confirm my suspicion and explain what SE in
.TRXSE stands for (security extension?). Anyways, this seem pretty specific
to (some) Infineon devices. Despite its history I would keep this separate
and specifically use trxse instead of trx.
Regards,
Arend
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download
2024-09-01 6:55 ` Arend Van Spriel
@ 2024-09-09 20:27 ` Marek Vasut
0 siblings, 0 replies; 14+ messages in thread
From: Marek Vasut @ 2024-09-09 20:27 UTC (permalink / raw)
To: Arend Van Spriel, Kalle Valo
Cc: linux-wireless, Chung-Hsien Hsu, Chung-Hsien Hsu,
Dr. David Alan Gilbert, Gustavo A. R. Silva,
Rafał Miłecki, Bjorn Helgaas, Carter Chen, Duoming Zhou,
Erick Archer, Kees Cook, Krzysztof Kozlowski, Mathias Krause,
Matthias Brugger, Owen Huang, Ulf Hansson, brcm80211-dev-list.pdl,
Double Lo
On 9/1/24 8:55 AM, Arend Van Spriel wrote:
Hi,
>> On 8/22/24 10:37 AM, Kalle Valo wrote:
>>> Marek Vasut <marex@denx.de> wrote:
>>>
>>>> From: Chung-Hsien Hsu <stanley.hsu@cypress.com>
>>>>
>>>> Add support to download TRX firmware for PCIe and SDIO.
>>>>
>>>> Signed-off-by: Chung-Hsien Hsu <chung-hsien.hsu@infineon.com>
>>>> Signed-off-by: Marek Vasut <marex@denx.de> # Upport to current
>>>> linux-next
>>>
>>> Please fix the review comments, also Ping's comment that from and s-o-b
>>> needs to match.
>>
>> I have most of the changes addressed locally already.
>>
>> Regarding the SoB line, do I update the commit Author email (because
>> that would make more sense, cypress got assimilated into infineon) or
>> the SoB line email to the "old" cypress email address ?
>
> I would say the SoB line is leading as developer's certificate and that
> has the Infineon address so that seems more appropriate.
Let's add both to be on the safe side.
>> I am still hoping to get a bit more input on the TRX firmware handling
>> from Arend ... or maybe there is no further feedback ?
>
> Took me a while before I looked into this. Can not offer much info
> though. Within Broadcom code bases we only have a v1 and v2 defined for
> the TRX format. This patch specifies v4. The only difference seem to be
> the number of offsets and their meaning. Looking at the index
> definitions I suspect this version accommodates signed firmware images
> which is verified by the bootloader on the device.
>
> Hopefully Infineon can/will confirm my suspicion and explain what SE
> in .TRXSE stands for (security extension?). Anyways, this seem pretty
> specific to (some) Infineon devices. Despite its history I would keep
> this separate and specifically use trxse instead of trx.
OK
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2024-09-10 0:51 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-18 20:12 [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Marek Vasut
2024-08-18 20:12 ` [PATCH 2/2] wifi: brcmfmac: add support for CYW55572 PCIe chipset Marek Vasut
2024-08-19 8:39 ` kernel test robot
2024-08-19 3:08 ` [PATCH 1/2] wifi: brcmfmac: add support for TRX firmware download Ping-Ke Shih
2024-08-19 11:15 ` Marek Vasut
2024-08-19 14:35 ` Kalle Valo
2024-08-19 15:52 ` Arend Van Spriel
2024-08-19 16:17 ` Marek Vasut
2024-08-19 18:09 ` Florian Fainelli
2024-08-21 16:10 ` Marek Vasut
2024-08-22 8:37 ` Kalle Valo
2024-08-22 15:15 ` Marek Vasut
2024-09-01 6:55 ` Arend Van Spriel
2024-09-09 20:27 ` Marek Vasut
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).