Hi Kiran, On Tue, Mar 5, 2024 at 9:31 AM Kiran K <kiran.k@xxxxxxxxx> wrote: > > Some variants of Intel controllers like BlazarI supports downloading of > Intermediate bootloader (IML) image. IML gives flexibility to fix issues as its > not possible to fix issue in Primary bootloader once flashed to ROM. This patch > adds the support to download IML before downloading operational firmware image. > > dmesg logs: > [13.399003] Bluetooth: Core ver 2.22 > [13.399006] Bluetooth: Starting self testing > [13.401194] Bluetooth: ECDH test passed in 2135 usecs > [13.421175] Bluetooth: SMP test passed in 597 usecs > [13.421184] Bluetooth: Finished self testing > [13.422919] Bluetooth: HCI device and connection manager initialized > [13.422923] Bluetooth: HCI socket layer initialized > [13.422925] Bluetooth: L2CAP socket layer initialized > [13.422930] Bluetooth: SCO socket layer initialized > [13.458065] Bluetooth: hci0: Device revision is 0 > [13.458071] Bluetooth: hci0: Secure boot is disabled > [13.458072] Bluetooth: hci0: OTP lock is disabled > [13.458072] Bluetooth: hci0: API lock is enabled > [13.458073] Bluetooth: hci0: Debug lock is disabled > [13.458073] Bluetooth: hci0: Minimum firmware build 1 week 10 2014 > [13.458075] Bluetooth: hci0: Bootloader timestamp 2022.46 buildtype 1 build 26590 > [13.458324] Bluetooth: hci0: DSM reset method type: 0x00 > [13.460678] Bluetooth: hci0: Found device firmware: intel/ibt-0090-0291-iml.sfi > [13.460684] Bluetooth: hci0: Boot Address: 0x30099000 > [13.460685] Bluetooth: hci0: Firmware Version: 227-11.24 > [13.562554] Bluetooth: hci0: Waiting for firmware download to complete > [13.563023] Bluetooth: hci0: Firmware loaded in 99941 usecs > [13.563057] Bluetooth: hci0: Waiting for device to boot > [13.565029] Bluetooth: hci0: Malformed MSFT vendor event: 0x02 > [13.565148] Bluetooth: hci0: Device booted in 2064 usecs > [13.567065] Bluetooth: hci0: No device address configured > [13.569010] Bluetooth: hci0: Found device firmware: intel/ibt-0090-0291.sfi > [13.569061] Bluetooth: hci0: Boot Address: 0x10000800 > [13.569062] Bluetooth: hci0: Firmware Version: 227-11.24 > [13.788891] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 > [13.788897] Bluetooth: BNEP filters: protocol multicast > [13.788902] Bluetooth: BNEP socket layer initialized > [15.435905] Bluetooth: hci0: Waiting for firmware download to complete > [15.436016] Bluetooth: hci0: Firmware loaded in 1823233 usecs > [15.436258] Bluetooth: hci0: Waiting for device to boot > [15.471140] Bluetooth: hci0: Device booted in 34277 usecs > [15.471201] Bluetooth: hci0: Malformed MSFT vendor event: 0x02 > [15.471487] Bluetooth: hci0: Found Intel DDC parameters: intel/ibt-0090-0291.ddc > [15.474353] Bluetooth: hci0: Applying Intel DDC parameters completed > [15.474486] Bluetooth: hci0: Found Intel DDC parameters: intel/bdaddress.cfg > [15.475299] Bluetooth: hci0: Applying Intel DDC parameters completed > [15.479381] Bluetooth: hci0: Firmware timestamp 2024.10 buildtype 3 build 58595 > [15.479385] Bluetooth: hci0: Firmware SHA1: 0xb4f3cc46 > [15.483243] Bluetooth: hci0: Fseq status: Success (0x00) > [15.483246] Bluetooth: hci0: Fseq executed: 00.00.00.00 > [15.483247] Bluetooth: hci0: Fseq BT Top: 00.00.00.00 > [15.578712] Bluetooth: MGMT ver 1.22 > [15.822682] Bluetooth: RFCOMM TTY layer initialized > [15.822690] Bluetooth: RFCOMM socket layer initialized > [15.822695] Bluetooth: RFCOMM ver 1.11 > > Signed-off-by: Kiran K <kiran.k@xxxxxxxxx> > --- > drivers/bluetooth/btintel.c | 38 ++++++++++++++++++++++++++++++++++++- > drivers/bluetooth/btintel.h | 3 +++ > 2 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c > index ed98bb867cff..00e98606cf02 100644 > --- a/drivers/bluetooth/btintel.c > +++ b/drivers/bluetooth/btintel.c > @@ -521,6 +521,9 @@ static int btintel_version_info_tlv(struct hci_dev *hdev, > version->min_fw_build_nn, version->min_fw_build_cw, > 2000 + version->min_fw_build_yy); > break; > + case IMG_IML: > + variant = "Intermediate loader"; > + break; > case IMG_OP: > variant = "Firmware"; > break; > @@ -2194,10 +2197,26 @@ static void btintel_get_fw_name_tlv(const struct intel_version_tlv *ver, > char *fw_name, size_t len, > const char *suffix) > { > + const char *format; > /* The firmware file name for new generation controllers will be > * ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step> > */ > - snprintf(fw_name, len, "intel/ibt-%04x-%04x.%s", > + switch (ver->cnvi_top & 0xfff) { > + /* Only Blazar product supports downloading of intermediate loader > + * image > + */ > + case CNVI_BLAZARI: > + if (ver->img_type == IMG_BOOTLOADER) > + format = "intel/ibt-%04x-%04x-iml.%s"; Shouldn't iml be the extension rather than the name? Like in intel/ibt-0090-0291.iml which you can probably achieve by just replacing suffix, that said this function seems to be called with .ddc as suffix as well so I assume there is some check preventing it to be called while version is IMG_BOOTLOADER? > + else > + format = "intel/ibt-%04x-%04x.%s"; > + break; > + default: > + format = "intel/ibt-%04x-%04x.%s"; > + break; > + } > + > + snprintf(fw_name, len, format, > INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvi_top), > INTEL_CNVX_TOP_STEP(ver->cnvi_top)), > INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver->cnvr_top), > @@ -2607,6 +2626,23 @@ static int btintel_bootloader_setup_tlv(struct hci_dev *hdev, > if (err) > return err; > > + err = btintel_read_version_tlv(hdev, ver); > + if (err) > + return err; > + > + /* If image type returned is IMG_IML, then controller supports > + * intermediae loader image > + */ > + if (ver->img_type == IMG_IML) { > + err = btintel_prepare_fw_download_tlv(hdev, ver, &boot_param); > + if (err) > + return err; > + > + err = btintel_boot(hdev, boot_param); > + if (err) > + return err; > + } > + > btintel_clear_flag(hdev, INTEL_BOOTLOADER); > > btintel_get_fw_name_tlv(ver, ddcname, sizeof(ddcname), "ddc"); > diff --git a/drivers/bluetooth/btintel.h b/drivers/bluetooth/btintel.h > index 52b2f1986f85..ae15b2253b6d 100644 > --- a/drivers/bluetooth/btintel.h > +++ b/drivers/bluetooth/btintel.h > @@ -51,7 +51,10 @@ struct intel_tlv { > u8 val[]; > } __packed; > > +#define CNVI_BLAZARI 0x900 > + > #define IMG_BOOTLOADER 0x01 /* Bootloader image */ > +#define IMG_IML 0x02 /* Intermediate image */ > #define IMG_OP 0x03 /* Operational image */ > > struct intel_version_tlv { > -- > 2.34.1 > > -- Luiz Augusto von Dentz