From: Andy Shevchenko <andy.shevchenko@gmail.com>
To: Hector Martin <marcan@marcan.st>
Cc: "Kalle Valo" <kvalo@codeaurora.org>,
"David S. Miller" <davem@davemloft.net>,
"Jakub Kicinski" <kuba@kernel.org>,
"Rob Herring" <robh+dt@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Len Brown" <lenb@kernel.org>,
"Arend van Spriel" <aspriel@gmail.com>,
"Franky Lin" <franky.lin@broadcom.com>,
"Hante Meuleman" <hante.meuleman@broadcom.com>,
"Chi-hsien Lin" <chi-hsien.lin@infineon.com>,
"Wright Feng" <wright.feng@infineon.com>,
"Dmitry Osipenko" <digetx@gmail.com>,
"Sven Peter" <sven@svenpeter.dev>,
"Alyssa Rosenzweig" <alyssa@rosenzweig.io>,
"Mark Kettenis" <kettenis@openbsd.org>,
"Rafał Miłecki" <zajec5@gmail.com>,
"Pieter-Paul Giesberts" <pieter-paul.giesberts@broadcom.com>,
"Linus Walleij" <linus.walleij@linaro.org>,
"Hans de Goede" <hdegoede@redhat.com>,
"John W. Linville" <linville@tuxdriver.com>,
"brian m. carlson" <sandals@crustytoothpaste.net>,
"open list:TI WILINK WIRELES..." <linux-wireless@vger.kernel.org>,
netdev <netdev@vger.kernel.org>,
devicetree <devicetree@vger.kernel.org>,
"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
"ACPI Devel Maling List" <linux-acpi@vger.kernel.org>,
"open list:BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER"
<brcm80211-dev-list.pdl@broadcom.com>,
SHA-cyfmac-dev-list@infineon.com
Subject: Re: [PATCH v2 07/35] brcmfmac: pcie: Read Apple OTP information
Date: Tue, 4 Jan 2022 13:26:28 +0200 [thread overview]
Message-ID: <CAHp75VcHjGAVog31AHaVLAq452=h=tqEN-1GNm_Aiu3113oTLA@mail.gmail.com> (raw)
In-Reply-To: <20220104072658.69756-8-marcan@marcan.st>
On Tue, Jan 4, 2022 at 9:28 AM Hector Martin <marcan@marcan.st> wrote:
>
> On Apple platforms, the One Time Programmable ROM in the Broadcom chips
> contains information about the specific board design (module, vendor,
> version) that is required to select the correct NVRAM file. Parse this
> OTP ROM and extract the required strings.
>
> Note that the user OTP offset/size is per-chip. This patch does not add
> any chips yet.
...
> +static int
> +brcmf_pcie_parse_otp_sys_vendor(struct brcmf_pciedev_info *devinfo,
> + u8 *data, size_t size)
> +{
> + int idx = 4;
Can you rather have a structure
struct my_cool_and_strange_blob {
__le32 hdr;
const char ...[];
...
}
and then cast your data to this struct?
> + const char *chip_params;
> + const char *board_params;
> + const char *p;
> +
> + /* 4-byte header and two empty strings */
> + if (size < 6)
> + return -EINVAL;
> +
> + if (get_unaligned_le32(data) != BRCMF_OTP_VENDOR_HDR)
> + return -EINVAL;
> +
> + chip_params = &data[idx];
> + /* Skip first string, including terminator */
> + idx += strnlen(chip_params, size - idx) + 1;
strsep() ?
> + if (idx >= size)
> + return -EINVAL;
> +
> + board_params = &data[idx];
> +
> + /* Skip to terminator of second string */
> + idx += strnlen(board_params, size - idx);
> + if (idx >= size)
> + return -EINVAL;
> +
> + /* At this point both strings are guaranteed NUL-terminated */
> + brcmf_dbg(PCIE, "OTP: chip_params='%s' board_params='%s'\n",
> + chip_params, board_params);
> +
> + p = board_params;
> + while (*p) {
> + char tag = *p++;
> + const char *end;
> + size_t len;
> +
> + if (tag == ' ') /* Skip extra spaces */
> + continue;
skip_spaces()
> +
> + if (*p++ != '=') /* implicit NUL check */
> + return -EINVAL;
Have you checked the next_arg() implementation?
> + /* *p might be NUL here, if so end == p and len == 0 */
> + end = strchrnul(p, ' ');
> + len = end - p;
> +
> + /* leave 1 byte for NUL in destination string */
> + if (len > (BRCMF_OTP_MAX_PARAM_LEN - 1))
> + return -EINVAL;
> +
> + /* Copy len characters plus a NUL terminator */
> + switch (tag) {
> + case 'M':
> + strscpy(devinfo->otp.module, p, len + 1);
> + break;
> + case 'V':
> + strscpy(devinfo->otp.vendor, p, len + 1);
> + break;
> + case 'm':
> + strscpy(devinfo->otp.version, p, len + 1);
> + break;
> + }
> +
> + /* Skip to space separator or NUL */
> + p = end;
> + }
> +
> + brcmf_dbg(PCIE, "OTP: module=%s vendor=%s version=%s\n",
> + devinfo->otp.module, devinfo->otp.vendor,
> + devinfo->otp.version);
> +
> + if (!devinfo->otp.module ||
> + !devinfo->otp.vendor ||
> + !devinfo->otp.version)
> + return -EINVAL;
> +
> + devinfo->otp.valid = true;
> + return 0;
> +}
> +
> +static int
> +brcmf_pcie_parse_otp(struct brcmf_pciedev_info *devinfo, u8 *otp, size_t size)
> +{
> + int p = 0;
> + int ret = -1;
Use proper error codes.
> + brcmf_dbg(PCIE, "parse_otp size=%ld\n", size);
> +
> + while (p < (size - 1)) {
too many parentheses
> + u8 type = otp[p];
> + u8 length = otp[p + 1];
> +
> + if (type == 0)
> + break;
> +
> + if ((p + 2 + length) > size)
> + break;
> +
> + switch (type) {
> + case BRCMF_OTP_SYS_VENDOR:
> + brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): SYS_VENDOR\n",
length as hex a bit harder to parse
> + p, length);
> + ret = brcmf_pcie_parse_otp_sys_vendor(devinfo,
> + &otp[p + 2],
> + length);
> + break;
> + case BRCMF_OTP_BRCM_CIS:
> + brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): BRCM_CIS\n",
> + p, length);
> + break;
> + default:
> + brcmf_dbg(PCIE, "OTP @ 0x%x (0x%x): Unknown type 0x%x\n",
> + p, length, type);
> + break;
> + }
> + p += 2 + length;
length + 2 is easier to read.
> + }
> +
> + return ret;
> +}
...
> + /* Map OTP to shadow area */
> + WRITECC32(devinfo, sromcontrol,
> + sromctl | BCMA_CC_SROM_CONTROL_OTPSEL);
One line?
...
> + otp = kzalloc(sizeof(u16) * words, GFP_KERNEL);
No check, why? I see in many places you forgot to check for NULL from
allocator functions.
Moreover here you should use kcalloc() which does overflow protection.
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2022-01-04 11:28 UTC|newest]
Thread overview: 122+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-04 7:26 [PATCH v2 00/35] brcmfmac: Support Apple T2 and M1 platforms Hector Martin
2022-01-04 7:26 ` [PATCH v2 01/35] dt-bindings: net: bcm4329-fmac: Add Apple properties & chips Hector Martin
2022-01-11 18:45 ` Rob Herring
2022-01-04 7:26 ` [PATCH v2 02/35] brcmfmac: pcie: Declare missing firmware files in pcie.c Hector Martin
2022-01-06 9:56 ` Arend van Spriel
2022-01-06 11:10 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 03/35] brcmfmac: firmware: Handle per-board clm_blob files Hector Martin
2022-01-06 10:19 ` Arend van Spriel
2022-01-06 10:59 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 04/35] brcmfmac: firmware: Support having multiple alt paths Hector Martin
2022-01-04 8:26 ` Dmitry Osipenko
2022-01-04 8:43 ` Hector Martin
2022-01-04 22:09 ` Dmitry Osipenko
2022-01-05 13:22 ` Hector Martin
2022-01-06 17:40 ` Dmitry Osipenko
2022-01-06 17:58 ` Andy Shevchenko
2022-01-07 3:12 ` Dmitry Osipenko
2022-01-07 9:55 ` Andy Shevchenko
2022-01-04 22:36 ` Dmitry Osipenko
2022-01-04 22:38 ` Dmitry Osipenko
2022-01-06 10:43 ` Arend van Spriel
2022-01-06 11:12 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 05/35] brcmfmac: pcie/sdio/usb: Get CLM blob via standard firmware mechanism Hector Martin
2022-01-06 10:48 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 06/35] brcmfmac: firmware: Support passing in multiple board_types Hector Martin
2022-01-04 10:22 ` Arend van Spriel
2022-01-04 10:30 ` Hector Martin
2022-01-04 11:28 ` Andy Shevchenko
2022-01-07 2:50 ` Hector Martin
2022-01-06 12:16 ` Arend van Spriel
2022-01-07 4:02 ` Hector Martin
2022-01-07 6:17 ` Arend Van Spriel
2022-01-07 7:12 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 07/35] brcmfmac: pcie: Read Apple OTP information Hector Martin
2022-01-04 11:26 ` Andy Shevchenko [this message]
2022-01-07 3:53 ` Hector Martin
2022-01-06 12:37 ` Arend van Spriel
2022-01-06 13:08 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 08/35] brcmfmac: of: Fetch Apple properties Hector Martin
2022-01-04 11:17 ` Andy Shevchenko
2022-01-07 3:54 ` Hector Martin
2022-01-08 20:03 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 09/35] brcmfmac: pcie: Perform firmware selection for Apple platforms Hector Martin
2022-01-04 14:24 ` Andy Shevchenko
2022-01-06 13:12 ` Hector Martin
2022-01-08 20:03 ` Arend van Spriel
2022-01-17 6:36 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 10/35] brcmfmac: firmware: Allow platform to override macaddr Hector Martin
2022-01-04 14:23 ` Andy Shevchenko
2022-01-05 13:26 ` Hector Martin
2022-01-06 14:20 ` Andy Shevchenko
2022-01-07 2:39 ` Hector Martin
2022-01-08 20:14 ` Arend van Spriel
2022-01-17 6:38 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 11/35] brcmfmac: msgbuf: Increase RX ring sizes to 1024 Hector Martin
2022-01-10 7:17 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 12/35] brcmfmac: pcie: Fix crashes due to early IRQs Hector Martin
2022-01-04 14:12 ` Andy Shevchenko
2022-01-06 13:10 ` Hector Martin
2022-01-10 13:54 ` Kalle Valo
2022-01-10 7:19 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 13/35] brcmfmac: pcie: Support PCIe core revisions >= 64 Hector Martin
2022-01-10 7:31 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 14/35] brcmfmac: pcie: Add IDs/properties for BCM4378 Hector Martin
2022-01-10 9:10 ` Arend van Spriel
2022-01-10 11:04 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 15/35] ACPI / property: Support strings in Apple _DSM props Hector Martin
2022-01-04 7:26 ` [PATCH v2 16/35] brcmfmac: acpi: Add support for fetching Apple ACPI properties Hector Martin
2022-01-04 10:21 ` Arend van Spriel
2022-01-04 11:00 ` Hector Martin
2022-01-10 14:01 ` Kalle Valo
2022-01-10 9:11 ` Arend van Spriel
2022-01-10 11:07 ` Hector Martin
2022-01-10 11:26 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 17/35] brcmfmac: pcie: Provide a buffer of random bytes to the device Hector Martin
2022-01-10 9:11 ` Arend van Spriel
2022-01-10 11:09 ` Hector Martin
2022-01-10 11:28 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 18/35] brcmfmac: pcie: Add IDs/properties for BCM4355 Hector Martin
2022-01-10 9:12 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 19/35] brcmfmac: pcie: Add IDs/properties for BCM4377 Hector Martin
2022-01-10 9:12 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 20/35] brcmfmac: pcie: Perform correct BCM4364 firmware selection Hector Martin
2022-01-10 9:12 ` Arend van Spriel
2022-01-10 11:20 ` Hector Martin
2022-01-10 12:02 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 21/35] brcmfmac: chip: Only disable D11 cores; handle an arbitrary number Hector Martin
2022-01-19 12:36 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 22/35] brcmfmac: chip: Handle 1024-unit sizes for TCM blocks Hector Martin
2022-01-19 12:36 ` Arend van Spriel
2022-01-20 8:49 ` Arend van Spriel
2022-01-31 16:21 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 23/35] brcmfmac: cfg80211: Add support for scan params v2 Hector Martin
2022-01-04 19:46 ` Arend Van Spriel
2022-01-17 6:57 ` Hector Martin
2022-01-11 8:50 ` Arend van Spriel
2022-01-17 6:58 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 24/35] brcmfmac: feature: Add support for setting feats based on WLC version Hector Martin
2022-01-21 7:35 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 25/35] brcmfmac: cfg80211: Add support for PMKID_V3 operations Hector Martin
2022-01-21 7:35 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 26/35] brcmfmac: cfg80211: Pass the PMK in binary instead of hex Hector Martin
2022-01-21 7:35 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 27/35] brcmfmac: pcie: Add IDs/properties for BCM4387 Hector Martin
2022-01-21 7:35 ` Arend van Spriel
2022-01-31 16:37 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 28/35] brcmfmac: pcie: Replace brcmf_pcie_copy_mem_todev with memcpy_toio Hector Martin
2022-01-04 7:26 ` [PATCH v2 29/35] brcmfmac: pcie: Read the console on init and shutdown Hector Martin
2022-01-04 7:26 ` [PATCH v2 30/35] brcmfmac: pcie: Release firmwares in the brcmf_pcie_setup error path Hector Martin
2022-01-04 7:26 ` [PATCH v2 31/35] brcmfmac: firmware: Allocate space for default boardrev in nvram Hector Martin
2022-01-04 7:26 ` [PATCH v2 32/35] brcmfmac: fwil: Constify iovar name arguments Hector Martin
2022-01-04 7:26 ` [PATCH v2 33/35] brcmfmac: common: Add support for downloading TxCap blobs Hector Martin
2022-01-21 7:36 ` Arend van Spriel
2022-01-31 16:28 ` Hector Martin
2022-01-04 7:26 ` [PATCH v2 34/35] brcmfmac: pcie: Load and provide " Hector Martin
2022-01-21 7:36 ` Arend van Spriel
2022-01-04 7:26 ` [PATCH v2 35/35] brcmfmac: common: Add support for external calibration blobs Hector Martin
2022-01-21 7:35 ` Arend van Spriel
2022-01-04 14:28 ` [PATCH v2 00/35] brcmfmac: Support Apple T2 and M1 platforms Andy Shevchenko
2022-01-10 10:14 ` Kalle Valo
2022-01-10 11:21 ` Hector Martin
2022-01-10 13:46 ` Kalle Valo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAHp75VcHjGAVog31AHaVLAq452=h=tqEN-1GNm_Aiu3113oTLA@mail.gmail.com' \
--to=andy.shevchenko@gmail.com \
--cc=SHA-cyfmac-dev-list@infineon.com \
--cc=alyssa@rosenzweig.io \
--cc=aspriel@gmail.com \
--cc=brcm80211-dev-list.pdl@broadcom.com \
--cc=chi-hsien.lin@infineon.com \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=digetx@gmail.com \
--cc=franky.lin@broadcom.com \
--cc=hante.meuleman@broadcom.com \
--cc=hdegoede@redhat.com \
--cc=kettenis@openbsd.org \
--cc=kuba@kernel.org \
--cc=kvalo@codeaurora.org \
--cc=lenb@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=marcan@marcan.st \
--cc=netdev@vger.kernel.org \
--cc=pieter-paul.giesberts@broadcom.com \
--cc=rafael@kernel.org \
--cc=robh+dt@kernel.org \
--cc=sandals@crustytoothpaste.net \
--cc=sven@svenpeter.dev \
--cc=wright.feng@infineon.com \
--cc=zajec5@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).