xref: /freebsd/usr.sbin/bluetooth/iwmbtfw/iwmbt_fw.h (revision 06969db312022277729dd144e3655a90007306ef)
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