17f32f0e2SVladimir Kondratyev /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 37f32f0e2SVladimir Kondratyev * 47f32f0e2SVladimir Kondratyev * Copyright (c) 2013 Adrian Chadd <adrian@freebsd.org> 57f32f0e2SVladimir Kondratyev * Copyright (c) 2019 Vladimir Kondratyev <wulf@FreeBSD.org> 6c1643cedSVladimir Kondratyev * Copyright (c) 2023 Future Crew LLC. 77f32f0e2SVladimir Kondratyev * 87f32f0e2SVladimir Kondratyev * Redistribution and use in source and binary forms, with or without 97f32f0e2SVladimir Kondratyev * modification, are permitted provided that the following conditions 107f32f0e2SVladimir Kondratyev * are met: 117f32f0e2SVladimir Kondratyev * 1. Redistributions of source code must retain the above copyright 127f32f0e2SVladimir Kondratyev * notice, this list of conditions and the following disclaimer. 137f32f0e2SVladimir Kondratyev * 2. Redistributions in binary form must reproduce the above copyright 147f32f0e2SVladimir Kondratyev * notice, this list of conditions and the following disclaimer in the 157f32f0e2SVladimir Kondratyev * documentation and/or other materials provided with the distribution. 167f32f0e2SVladimir Kondratyev * 177f32f0e2SVladimir Kondratyev * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 187f32f0e2SVladimir Kondratyev * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 197f32f0e2SVladimir Kondratyev * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 207f32f0e2SVladimir Kondratyev * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 217f32f0e2SVladimir Kondratyev * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 227f32f0e2SVladimir Kondratyev * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 237f32f0e2SVladimir Kondratyev * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 247f32f0e2SVladimir Kondratyev * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 257f32f0e2SVladimir Kondratyev * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 267f32f0e2SVladimir Kondratyev * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 277f32f0e2SVladimir Kondratyev * SUCH DAMAGE. 287f32f0e2SVladimir Kondratyev */ 297f32f0e2SVladimir Kondratyev 307f32f0e2SVladimir Kondratyev #ifndef __IWMBT_FW_H__ 317f32f0e2SVladimir Kondratyev #define __IWMBT_FW_H__ 327f32f0e2SVladimir Kondratyev 33c1643cedSVladimir Kondratyev #include <sys/types.h> 34c1643cedSVladimir Kondratyev #define L2CAP_SOCKET_CHECKED 35c1643cedSVladimir Kondratyev #include <bluetooth.h> 36c1643cedSVladimir Kondratyev 37c1643cedSVladimir Kondratyev #define RSA_HEADER_LEN 644 38c1643cedSVladimir Kondratyev #define ECDSA_HEADER_LEN 320 39c1643cedSVladimir Kondratyev #define ECDSA_OFFSET RSA_HEADER_LEN 40c1643cedSVladimir Kondratyev #define CSS_HEADER_OFFSET 8 41c1643cedSVladimir Kondratyev 427f32f0e2SVladimir Kondratyev struct iwmbt_version { 437f32f0e2SVladimir Kondratyev uint8_t status; 447f32f0e2SVladimir Kondratyev uint8_t hw_platform; 457f32f0e2SVladimir Kondratyev uint8_t hw_variant; 467f32f0e2SVladimir Kondratyev uint8_t hw_revision; 477f32f0e2SVladimir Kondratyev uint8_t fw_variant; 487f32f0e2SVladimir Kondratyev uint8_t fw_revision; 497f32f0e2SVladimir Kondratyev uint8_t fw_build_num; 507f32f0e2SVladimir Kondratyev uint8_t fw_build_ww; 517f32f0e2SVladimir Kondratyev uint8_t fw_build_yy; 527f32f0e2SVladimir Kondratyev uint8_t fw_patch_num; 537f32f0e2SVladimir Kondratyev } __attribute__ ((packed)); 547f32f0e2SVladimir Kondratyev 55*06969db3SEygene Ryabinkin /* Known values for fw_variant */ 56*06969db3SEygene Ryabinkin #define FW_VARIANT_BOOTLOADER 0x06 /* Bootloader mode */ 57*06969db3SEygene Ryabinkin #define FW_VARIANT_OPERATIONAL 0x23 /* Operational mode */ 58*06969db3SEygene Ryabinkin 597f32f0e2SVladimir Kondratyev struct iwmbt_boot_params { 607f32f0e2SVladimir Kondratyev uint8_t status; 617f32f0e2SVladimir Kondratyev uint8_t otp_format; 627f32f0e2SVladimir Kondratyev uint8_t otp_content; 637f32f0e2SVladimir Kondratyev uint8_t otp_patch; 647f32f0e2SVladimir Kondratyev uint16_t dev_revid; 657f32f0e2SVladimir Kondratyev uint8_t secure_boot; 667f32f0e2SVladimir Kondratyev uint8_t key_from_hdr; 677f32f0e2SVladimir Kondratyev uint8_t key_type; 687f32f0e2SVladimir Kondratyev uint8_t otp_lock; 697f32f0e2SVladimir Kondratyev uint8_t api_lock; 707f32f0e2SVladimir Kondratyev uint8_t debug_lock; 717f32f0e2SVladimir Kondratyev uint8_t otp_bdaddr[6]; 727f32f0e2SVladimir Kondratyev uint8_t min_fw_build_nn; 737f32f0e2SVladimir Kondratyev uint8_t min_fw_build_cw; 747f32f0e2SVladimir Kondratyev uint8_t min_fw_build_yy; 757f32f0e2SVladimir Kondratyev uint8_t limited_cce; 767f32f0e2SVladimir Kondratyev uint8_t unlocked_state; 777f32f0e2SVladimir Kondratyev } __attribute__ ((packed)); 787f32f0e2SVladimir Kondratyev 79c1643cedSVladimir Kondratyev enum { 80c1643cedSVladimir Kondratyev IWMBT_TLV_CNVI_TOP = 0x10, 81c1643cedSVladimir Kondratyev IWMBT_TLV_CNVR_TOP, 82c1643cedSVladimir Kondratyev IWMBT_TLV_CNVI_BT, 83c1643cedSVladimir Kondratyev IWMBT_TLV_CNVR_BT, 84c1643cedSVladimir Kondratyev IWMBT_TLV_CNVI_OTP, 85c1643cedSVladimir Kondratyev IWMBT_TLV_CNVR_OTP, 86c1643cedSVladimir Kondratyev IWMBT_TLV_DEV_REV_ID, 87c1643cedSVladimir Kondratyev IWMBT_TLV_USB_VENDOR_ID, 88c1643cedSVladimir Kondratyev IWMBT_TLV_USB_PRODUCT_ID, 89c1643cedSVladimir Kondratyev IWMBT_TLV_PCIE_VENDOR_ID, 90c1643cedSVladimir Kondratyev IWMBT_TLV_PCIE_DEVICE_ID, 91c1643cedSVladimir Kondratyev IWMBT_TLV_PCIE_SUBSYSTEM_ID, 92c1643cedSVladimir Kondratyev IWMBT_TLV_IMAGE_TYPE, 93c1643cedSVladimir Kondratyev IWMBT_TLV_TIME_STAMP, 94c1643cedSVladimir Kondratyev IWMBT_TLV_BUILD_TYPE, 95c1643cedSVladimir Kondratyev IWMBT_TLV_BUILD_NUM, 96c1643cedSVladimir Kondratyev IWMBT_TLV_FW_BUILD_PRODUCT, 97c1643cedSVladimir Kondratyev IWMBT_TLV_FW_BUILD_HW, 98c1643cedSVladimir Kondratyev IWMBT_TLV_FW_STEP, 99c1643cedSVladimir Kondratyev IWMBT_TLV_BT_SPEC, 100c1643cedSVladimir Kondratyev IWMBT_TLV_MFG_NAME, 101c1643cedSVladimir Kondratyev IWMBT_TLV_HCI_REV, 102c1643cedSVladimir Kondratyev IWMBT_TLV_LMP_SUBVER, 103c1643cedSVladimir Kondratyev IWMBT_TLV_OTP_PATCH_VER, 104c1643cedSVladimir Kondratyev IWMBT_TLV_SECURE_BOOT, 105c1643cedSVladimir Kondratyev IWMBT_TLV_KEY_FROM_HDR, 106c1643cedSVladimir Kondratyev IWMBT_TLV_OTP_LOCK, 107c1643cedSVladimir Kondratyev IWMBT_TLV_API_LOCK, 108c1643cedSVladimir Kondratyev IWMBT_TLV_DEBUG_LOCK, 109c1643cedSVladimir Kondratyev IWMBT_TLV_MIN_FW, 110c1643cedSVladimir Kondratyev IWMBT_TLV_LIMITED_CCE, 111c1643cedSVladimir Kondratyev IWMBT_TLV_SBE_TYPE, 112c1643cedSVladimir Kondratyev IWMBT_TLV_OTP_BDADDR, 113c1643cedSVladimir Kondratyev IWMBT_TLV_UNLOCKED_STATE 114c1643cedSVladimir Kondratyev }; 115c1643cedSVladimir Kondratyev 116c1643cedSVladimir Kondratyev struct iwmbt_version_tlv { 117c1643cedSVladimir Kondratyev uint32_t cnvi_top; 118c1643cedSVladimir Kondratyev uint32_t cnvr_top; 119c1643cedSVladimir Kondratyev uint32_t cnvi_bt; 120c1643cedSVladimir Kondratyev uint32_t cnvr_bt; 121c1643cedSVladimir Kondratyev uint16_t dev_rev_id; 122c1643cedSVladimir Kondratyev uint8_t img_type; 123c1643cedSVladimir Kondratyev uint16_t timestamp; 124c1643cedSVladimir Kondratyev uint8_t build_type; 125c1643cedSVladimir Kondratyev uint32_t build_num; 126c1643cedSVladimir Kondratyev uint8_t secure_boot; 127c1643cedSVladimir Kondratyev uint8_t otp_lock; 128c1643cedSVladimir Kondratyev uint8_t api_lock; 129c1643cedSVladimir Kondratyev uint8_t debug_lock; 130c1643cedSVladimir Kondratyev uint8_t min_fw_build_nn; 131c1643cedSVladimir Kondratyev uint8_t min_fw_build_cw; 132c1643cedSVladimir Kondratyev uint8_t min_fw_build_yy; 133c1643cedSVladimir Kondratyev uint8_t limited_cce; 134c1643cedSVladimir Kondratyev uint8_t sbe_type; 135c1643cedSVladimir Kondratyev bdaddr_t otp_bd_addr; 136c1643cedSVladimir Kondratyev }; 137c1643cedSVladimir Kondratyev 138*06969db3SEygene Ryabinkin /* Known TLV img_type values */ 139*06969db3SEygene Ryabinkin #define TLV_IMG_TYPE_BOOTLOADER 0x01 /* Bootloader mode */ 140*06969db3SEygene Ryabinkin #define TLV_IMG_TYPE_OPERATIONAL 0x03 /* Operational mode */ 141*06969db3SEygene Ryabinkin 1427f32f0e2SVladimir Kondratyev struct iwmbt_firmware { 1437f32f0e2SVladimir Kondratyev char *fwname; 1447f32f0e2SVladimir Kondratyev int len; 1457f32f0e2SVladimir Kondratyev unsigned char *buf; 1467f32f0e2SVladimir Kondratyev }; 1477f32f0e2SVladimir Kondratyev 1487f32f0e2SVladimir Kondratyev extern int iwmbt_fw_read(struct iwmbt_firmware *fw, const char *fwname); 1497f32f0e2SVladimir Kondratyev extern void iwmbt_fw_free(struct iwmbt_firmware *fw); 1507f32f0e2SVladimir Kondratyev extern char *iwmbt_get_fwname(struct iwmbt_version *ver, 1517f32f0e2SVladimir Kondratyev struct iwmbt_boot_params *params, const char *prefix, 1527f32f0e2SVladimir Kondratyev const char *suffix); 153c1643cedSVladimir Kondratyev extern char *iwmbt_get_fwname_tlv(struct iwmbt_version_tlv *ver, 154c1643cedSVladimir Kondratyev const char *prefix, const char *suffix); 1557f32f0e2SVladimir Kondratyev 1567f32f0e2SVladimir Kondratyev #endif 157