brintos

brintos / linux-shallow public Read only

0
0
Text · 9.3 KiB · aa70e4c Raw
386 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 *4 *  Bluetooth support for Intel devices5 *6 *  Copyright (C) 2015  Intel Corporation7 */8 9/* List of tlv type */10enum {11	INTEL_TLV_CNVI_TOP = 0x10,12	INTEL_TLV_CNVR_TOP,13	INTEL_TLV_CNVI_BT,14	INTEL_TLV_CNVR_BT,15	INTEL_TLV_CNVI_OTP,16	INTEL_TLV_CNVR_OTP,17	INTEL_TLV_DEV_REV_ID,18	INTEL_TLV_USB_VENDOR_ID,19	INTEL_TLV_USB_PRODUCT_ID,20	INTEL_TLV_PCIE_VENDOR_ID,21	INTEL_TLV_PCIE_DEVICE_ID,22	INTEL_TLV_PCIE_SUBSYSTEM_ID,23	INTEL_TLV_IMAGE_TYPE,24	INTEL_TLV_TIME_STAMP,25	INTEL_TLV_BUILD_TYPE,26	INTEL_TLV_BUILD_NUM,27	INTEL_TLV_FW_BUILD_PRODUCT,28	INTEL_TLV_FW_BUILD_HW,29	INTEL_TLV_FW_STEP,30	INTEL_TLV_BT_SPEC,31	INTEL_TLV_MFG_NAME,32	INTEL_TLV_HCI_REV,33	INTEL_TLV_LMP_SUBVER,34	INTEL_TLV_OTP_PATCH_VER,35	INTEL_TLV_SECURE_BOOT,36	INTEL_TLV_KEY_FROM_HDR,37	INTEL_TLV_OTP_LOCK,38	INTEL_TLV_API_LOCK,39	INTEL_TLV_DEBUG_LOCK,40	INTEL_TLV_MIN_FW,41	INTEL_TLV_LIMITED_CCE,42	INTEL_TLV_SBE_TYPE,43	INTEL_TLV_OTP_BDADDR,44	INTEL_TLV_UNLOCKED_STATE,45	INTEL_TLV_GIT_SHA1,46	INTEL_TLV_FW_ID = 0x5047};48 49struct intel_tlv {50	u8 type;51	u8 len;52	u8 val[];53} __packed;54 55#define BTINTEL_CNVI_BLAZARI		0x90056 57#define BTINTEL_IMG_BOOTLOADER		0x01	/* Bootloader image */58#define BTINTEL_IMG_IML			0x02	/* Intermediate image */59#define BTINTEL_IMG_OP			0x03	/* Operational image */60 61#define BTINTEL_FWID_MAXLEN 6462 63struct intel_version_tlv {64	u32	cnvi_top;65	u32	cnvr_top;66	u32	cnvi_bt;67	u32	cnvr_bt;68	u16	dev_rev_id;69	u8	img_type;70	u16	timestamp;71	u8	build_type;72	u32	build_num;73	u8	secure_boot;74	u8	otp_lock;75	u8	api_lock;76	u8	debug_lock;77	u8	min_fw_build_nn;78	u8	min_fw_build_cw;79	u8	min_fw_build_yy;80	u8	limited_cce;81	u8	sbe_type;82	u32	git_sha1;83	u8	fw_id[BTINTEL_FWID_MAXLEN];84	bdaddr_t otp_bd_addr;85};86 87struct intel_version {88	u8 status;89	u8 hw_platform;90	u8 hw_variant;91	u8 hw_revision;92	u8 fw_variant;93	u8 fw_revision;94	u8 fw_build_num;95	u8 fw_build_ww;96	u8 fw_build_yy;97	u8 fw_patch_num;98} __packed;99 100struct intel_boot_params {101	__u8     status;102	__u8     otp_format;103	__u8     otp_content;104	__u8     otp_patch;105	__le16   dev_revid;106	__u8     secure_boot;107	__u8     key_from_hdr;108	__u8     key_type;109	__u8     otp_lock;110	__u8     api_lock;111	__u8     debug_lock;112	bdaddr_t otp_bdaddr;113	__u8     min_fw_build_nn;114	__u8     min_fw_build_cw;115	__u8     min_fw_build_yy;116	__u8     limited_cce;117	__u8     unlocked_state;118} __packed;119 120struct intel_bootup {121	__u8     zero;122	__u8     num_cmds;123	__u8     source;124	__u8     reset_type;125	__u8     reset_reason;126	__u8     ddc_status;127} __packed;128 129struct intel_secure_send_result {130	__u8     result;131	__le16   opcode;132	__u8     status;133} __packed;134 135struct intel_reset {136	__u8     reset_type;137	__u8     patch_enable;138	__u8     ddc_reload;139	__u8     boot_option;140	__le32   boot_param;141} __packed;142 143struct intel_debug_features {144	__u8    page1[16];145} __packed;146 147struct intel_offload_use_cases {148	__u8	status;149	__u8	preset[8];150} __packed;151 152#define INTEL_OP_PPAG_CMD		0xFE0B153struct hci_ppag_enable_cmd {154	__le32	ppag_enable_flags;155} __packed;156 157#define INTEL_TLV_TYPE_ID		0x01158 159#define INTEL_TLV_SYSTEM_EXCEPTION	0x00160#define INTEL_TLV_FATAL_EXCEPTION	0x01161#define INTEL_TLV_DEBUG_EXCEPTION	0x02162#define INTEL_TLV_TEST_EXCEPTION	0xDE163 164#define INTEL_HW_PLATFORM(cnvx_bt)	((u8)(((cnvx_bt) & 0x0000ff00) >> 8))165#define INTEL_HW_VARIANT(cnvx_bt)	((u8)(((cnvx_bt) & 0x003f0000) >> 16))166#define INTEL_CNVX_TOP_TYPE(cnvx_top)	((cnvx_top) & 0x00000fff)167#define INTEL_CNVX_TOP_STEP(cnvx_top)	(((cnvx_top) & 0x0f000000) >> 24)168#define INTEL_CNVX_TOP_PACK_SWAB(t, s)	__swab16(((__u16)(((t) << 4) | (s))))169 170enum {171	INTEL_BOOTLOADER,172	INTEL_DOWNLOADING,173	INTEL_FIRMWARE_LOADED,174	INTEL_FIRMWARE_FAILED,175	INTEL_BOOTING,176	INTEL_BROKEN_INITIAL_NCMD,177	INTEL_BROKEN_SHUTDOWN_LED,178	INTEL_ROM_LEGACY,179	INTEL_ROM_LEGACY_NO_WBS_SUPPORT,180	INTEL_ACPI_RESET_ACTIVE,181 182	__INTEL_NUM_FLAGS,183};184 185struct btintel_data {186	DECLARE_BITMAP(flags, __INTEL_NUM_FLAGS);187	int (*acpi_reset_method)(struct hci_dev *hdev);188};189 190#define btintel_set_flag(hdev, nr)					\191	do {								\192		struct btintel_data *intel = hci_get_priv((hdev));	\193		set_bit((nr), intel->flags);				\194	} while (0)195 196#define btintel_clear_flag(hdev, nr)					\197	do {								\198		struct btintel_data *intel = hci_get_priv((hdev));	\199		clear_bit((nr), intel->flags);				\200	} while (0)201 202#define btintel_wake_up_flag(hdev, nr)					\203	do {								\204		struct btintel_data *intel = hci_get_priv((hdev));	\205		wake_up_bit(intel->flags, (nr));			\206	} while (0)207 208#define btintel_get_flag(hdev)						\209	(((struct btintel_data *)hci_get_priv(hdev))->flags)210 211#define btintel_test_flag(hdev, nr)	test_bit((nr), btintel_get_flag(hdev))212#define btintel_test_and_clear_flag(hdev, nr) test_and_clear_bit((nr), btintel_get_flag(hdev))213#define btintel_wait_on_flag_timeout(hdev, nr, m, to)			\214		wait_on_bit_timeout(btintel_get_flag(hdev), (nr), m, to)215 216#if IS_ENABLED(CONFIG_BT_INTEL) || IS_ENABLED(CONFIG_BT_INTEL_PCIE)217 218int btintel_check_bdaddr(struct hci_dev *hdev);219int btintel_enter_mfg(struct hci_dev *hdev);220int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched);221int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);222int btintel_set_diag(struct hci_dev *hdev, bool enable);223 224int btintel_version_info(struct hci_dev *hdev, struct intel_version *ver);225int btintel_load_ddc_config(struct hci_dev *hdev, const char *ddc_name);226int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug);227int btintel_read_version(struct hci_dev *hdev, struct intel_version *ver);228struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,229				   u16 opcode_write);230int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param);231int btintel_read_boot_params(struct hci_dev *hdev,232			     struct intel_boot_params *params);233int btintel_download_firmware(struct hci_dev *dev, struct intel_version *ver,234			      const struct firmware *fw, u32 *boot_param);235int btintel_configure_setup(struct hci_dev *hdev, const char *driver_name);236int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb);237void btintel_bootup(struct hci_dev *hdev, const void *ptr, unsigned int len);238void btintel_secure_send_result(struct hci_dev *hdev,239				const void *ptr, unsigned int len);240int btintel_set_quality_report(struct hci_dev *hdev, bool enable);241int btintel_version_info_tlv(struct hci_dev *hdev,242			     struct intel_version_tlv *version);243int btintel_parse_version_tlv(struct hci_dev *hdev,244			      struct intel_version_tlv *version,245			      struct sk_buff *skb);246void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant);247int btintel_bootloader_setup_tlv(struct hci_dev *hdev,248				 struct intel_version_tlv *ver);249int btintel_shutdown_combined(struct hci_dev *hdev);250void btintel_hw_error(struct hci_dev *hdev, u8 code);251void btintel_print_fseq_info(struct hci_dev *hdev);252#else253 254static inline int btintel_check_bdaddr(struct hci_dev *hdev)255{256	return -EOPNOTSUPP;257}258 259static inline int btintel_enter_mfg(struct hci_dev *hdev)260{261	return -EOPNOTSUPP;262}263 264static inline int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched)265{266	return -EOPNOTSUPP;267}268 269static inline int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)270{271	return -EOPNOTSUPP;272}273 274static inline int btintel_set_diag(struct hci_dev *hdev, bool enable)275{276	return -EOPNOTSUPP;277}278 279static inline int btintel_version_info(struct hci_dev *hdev,280				       struct intel_version *ver)281{282	return -EOPNOTSUPP;283}284 285static inline int btintel_load_ddc_config(struct hci_dev *hdev,286					  const char *ddc_name)287{288	return -EOPNOTSUPP;289}290 291static inline int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug)292{293	return -EOPNOTSUPP;294}295 296static inline int btintel_read_version(struct hci_dev *hdev,297				       struct intel_version *ver)298{299	return -EOPNOTSUPP;300}301 302static inline struct regmap *btintel_regmap_init(struct hci_dev *hdev,303						 u16 opcode_read,304						 u16 opcode_write)305{306	return ERR_PTR(-EINVAL);307}308 309static inline int btintel_send_intel_reset(struct hci_dev *hdev,310					   u32 reset_param)311{312	return -EOPNOTSUPP;313}314 315static inline int btintel_read_boot_params(struct hci_dev *hdev,316					   struct intel_boot_params *params)317{318	return -EOPNOTSUPP;319}320 321static inline int btintel_download_firmware(struct hci_dev *dev,322					    const struct firmware *fw,323					    u32 *boot_param)324{325	return -EOPNOTSUPP;326}327 328static inline int btintel_configure_setup(struct hci_dev *hdev,329					  const char *driver_name)330{331	return -ENODEV;332}333 334static inline void btintel_bootup(struct hci_dev *hdev,335				  const void *ptr, unsigned int len)336{337}338 339static inline void btintel_secure_send_result(struct hci_dev *hdev,340				const void *ptr, unsigned int len)341{342}343 344static inline int btintel_set_quality_report(struct hci_dev *hdev, bool enable)345{346	return -ENODEV;347}348 349static inline int btintel_version_info_tlv(struct hci_dev *hdev,350					   struct intel_version_tlv *version)351{352	return -EOPNOTSUPP;353}354 355static inline int btintel_parse_version_tlv(struct hci_dev *hdev,356					    struct intel_version_tlv *version,357					    struct sk_buff *skb)358{359	return -EOPNOTSUPP;360}361 362static inline void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)363 364{365}366 367static inline int btintel_bootloader_setup_tlv(struct hci_dev *hdev,368					       struct intel_version_tlv *ver)369{370	return -ENODEV;371}372 373static inline int btintel_shutdown_combined(struct hci_dev *hdev)374{375	return -ENODEV;376}377 378static inline void btintel_hw_error(struct hci_dev *hdev, u8 code)379{380}381 382static inline void btintel_print_fseq_info(struct hci_dev *hdev)383{384}385#endif386