1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Bluetooth support for Intel devices
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (C) 2015 Intel Corporation
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun /* List of tlv type */
10*4882a593Smuzhiyun enum {
11*4882a593Smuzhiyun INTEL_TLV_CNVI_TOP = 0x10,
12*4882a593Smuzhiyun INTEL_TLV_CNVR_TOP,
13*4882a593Smuzhiyun INTEL_TLV_CNVI_BT,
14*4882a593Smuzhiyun INTEL_TLV_CNVR_BT,
15*4882a593Smuzhiyun INTEL_TLV_CNVI_OTP,
16*4882a593Smuzhiyun INTEL_TLV_CNVR_OTP,
17*4882a593Smuzhiyun INTEL_TLV_DEV_REV_ID,
18*4882a593Smuzhiyun INTEL_TLV_USB_VENDOR_ID,
19*4882a593Smuzhiyun INTEL_TLV_USB_PRODUCT_ID,
20*4882a593Smuzhiyun INTEL_TLV_PCIE_VENDOR_ID,
21*4882a593Smuzhiyun INTEL_TLV_PCIE_DEVICE_ID,
22*4882a593Smuzhiyun INTEL_TLV_PCIE_SUBSYSTEM_ID,
23*4882a593Smuzhiyun INTEL_TLV_IMAGE_TYPE,
24*4882a593Smuzhiyun INTEL_TLV_TIME_STAMP,
25*4882a593Smuzhiyun INTEL_TLV_BUILD_TYPE,
26*4882a593Smuzhiyun INTEL_TLV_BUILD_NUM,
27*4882a593Smuzhiyun INTEL_TLV_FW_BUILD_PRODUCT,
28*4882a593Smuzhiyun INTEL_TLV_FW_BUILD_HW,
29*4882a593Smuzhiyun INTEL_TLV_FW_STEP,
30*4882a593Smuzhiyun INTEL_TLV_BT_SPEC,
31*4882a593Smuzhiyun INTEL_TLV_MFG_NAME,
32*4882a593Smuzhiyun INTEL_TLV_HCI_REV,
33*4882a593Smuzhiyun INTEL_TLV_LMP_SUBVER,
34*4882a593Smuzhiyun INTEL_TLV_OTP_PATCH_VER,
35*4882a593Smuzhiyun INTEL_TLV_SECURE_BOOT,
36*4882a593Smuzhiyun INTEL_TLV_KEY_FROM_HDR,
37*4882a593Smuzhiyun INTEL_TLV_OTP_LOCK,
38*4882a593Smuzhiyun INTEL_TLV_API_LOCK,
39*4882a593Smuzhiyun INTEL_TLV_DEBUG_LOCK,
40*4882a593Smuzhiyun INTEL_TLV_MIN_FW,
41*4882a593Smuzhiyun INTEL_TLV_LIMITED_CCE,
42*4882a593Smuzhiyun INTEL_TLV_SBE_TYPE,
43*4882a593Smuzhiyun INTEL_TLV_OTP_BDADDR,
44*4882a593Smuzhiyun INTEL_TLV_UNLOCKED_STATE
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun struct intel_tlv {
48*4882a593Smuzhiyun u8 type;
49*4882a593Smuzhiyun u8 len;
50*4882a593Smuzhiyun u8 val[];
51*4882a593Smuzhiyun } __packed;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun struct intel_version_tlv {
54*4882a593Smuzhiyun u32 cnvi_top;
55*4882a593Smuzhiyun u32 cnvr_top;
56*4882a593Smuzhiyun u32 cnvi_bt;
57*4882a593Smuzhiyun u32 cnvr_bt;
58*4882a593Smuzhiyun u16 dev_rev_id;
59*4882a593Smuzhiyun u8 img_type;
60*4882a593Smuzhiyun u16 timestamp;
61*4882a593Smuzhiyun u8 build_type;
62*4882a593Smuzhiyun u32 build_num;
63*4882a593Smuzhiyun u8 secure_boot;
64*4882a593Smuzhiyun u8 otp_lock;
65*4882a593Smuzhiyun u8 api_lock;
66*4882a593Smuzhiyun u8 debug_lock;
67*4882a593Smuzhiyun u8 min_fw_build_nn;
68*4882a593Smuzhiyun u8 min_fw_build_cw;
69*4882a593Smuzhiyun u8 min_fw_build_yy;
70*4882a593Smuzhiyun u8 limited_cce;
71*4882a593Smuzhiyun u8 sbe_type;
72*4882a593Smuzhiyun bdaddr_t otp_bd_addr;
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun struct intel_version {
76*4882a593Smuzhiyun u8 status;
77*4882a593Smuzhiyun u8 hw_platform;
78*4882a593Smuzhiyun u8 hw_variant;
79*4882a593Smuzhiyun u8 hw_revision;
80*4882a593Smuzhiyun u8 fw_variant;
81*4882a593Smuzhiyun u8 fw_revision;
82*4882a593Smuzhiyun u8 fw_build_num;
83*4882a593Smuzhiyun u8 fw_build_ww;
84*4882a593Smuzhiyun u8 fw_build_yy;
85*4882a593Smuzhiyun u8 fw_patch_num;
86*4882a593Smuzhiyun } __packed;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun struct intel_boot_params {
89*4882a593Smuzhiyun __u8 status;
90*4882a593Smuzhiyun __u8 otp_format;
91*4882a593Smuzhiyun __u8 otp_content;
92*4882a593Smuzhiyun __u8 otp_patch;
93*4882a593Smuzhiyun __le16 dev_revid;
94*4882a593Smuzhiyun __u8 secure_boot;
95*4882a593Smuzhiyun __u8 key_from_hdr;
96*4882a593Smuzhiyun __u8 key_type;
97*4882a593Smuzhiyun __u8 otp_lock;
98*4882a593Smuzhiyun __u8 api_lock;
99*4882a593Smuzhiyun __u8 debug_lock;
100*4882a593Smuzhiyun bdaddr_t otp_bdaddr;
101*4882a593Smuzhiyun __u8 min_fw_build_nn;
102*4882a593Smuzhiyun __u8 min_fw_build_cw;
103*4882a593Smuzhiyun __u8 min_fw_build_yy;
104*4882a593Smuzhiyun __u8 limited_cce;
105*4882a593Smuzhiyun __u8 unlocked_state;
106*4882a593Smuzhiyun } __packed;
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun struct intel_bootup {
109*4882a593Smuzhiyun __u8 zero;
110*4882a593Smuzhiyun __u8 num_cmds;
111*4882a593Smuzhiyun __u8 source;
112*4882a593Smuzhiyun __u8 reset_type;
113*4882a593Smuzhiyun __u8 reset_reason;
114*4882a593Smuzhiyun __u8 ddc_status;
115*4882a593Smuzhiyun } __packed;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun struct intel_secure_send_result {
118*4882a593Smuzhiyun __u8 result;
119*4882a593Smuzhiyun __le16 opcode;
120*4882a593Smuzhiyun __u8 status;
121*4882a593Smuzhiyun } __packed;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun struct intel_reset {
124*4882a593Smuzhiyun __u8 reset_type;
125*4882a593Smuzhiyun __u8 patch_enable;
126*4882a593Smuzhiyun __u8 ddc_reload;
127*4882a593Smuzhiyun __u8 boot_option;
128*4882a593Smuzhiyun __le32 boot_param;
129*4882a593Smuzhiyun } __packed;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun struct intel_debug_features {
132*4882a593Smuzhiyun __u8 page1[16];
133*4882a593Smuzhiyun } __packed;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_BT_INTEL)
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun int btintel_check_bdaddr(struct hci_dev *hdev);
138*4882a593Smuzhiyun int btintel_enter_mfg(struct hci_dev *hdev);
139*4882a593Smuzhiyun int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched);
140*4882a593Smuzhiyun int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
141*4882a593Smuzhiyun int btintel_set_diag(struct hci_dev *hdev, bool enable);
142*4882a593Smuzhiyun int btintel_set_diag_mfg(struct hci_dev *hdev, bool enable);
143*4882a593Smuzhiyun void btintel_hw_error(struct hci_dev *hdev, u8 code);
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun void btintel_version_info(struct hci_dev *hdev, struct intel_version *ver);
146*4882a593Smuzhiyun void btintel_version_info_tlv(struct hci_dev *hdev, struct intel_version_tlv *version);
147*4882a593Smuzhiyun int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type, u32 plen,
148*4882a593Smuzhiyun const void *param);
149*4882a593Smuzhiyun int btintel_load_ddc_config(struct hci_dev *hdev, const char *ddc_name);
150*4882a593Smuzhiyun int btintel_set_event_mask(struct hci_dev *hdev, bool debug);
151*4882a593Smuzhiyun int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug);
152*4882a593Smuzhiyun int btintel_read_version(struct hci_dev *hdev, struct intel_version *ver);
153*4882a593Smuzhiyun int btintel_read_version_tlv(struct hci_dev *hdev, struct intel_version_tlv *ver);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,
156*4882a593Smuzhiyun u16 opcode_write);
157*4882a593Smuzhiyun int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param);
158*4882a593Smuzhiyun int btintel_read_boot_params(struct hci_dev *hdev,
159*4882a593Smuzhiyun struct intel_boot_params *params);
160*4882a593Smuzhiyun int btintel_download_firmware(struct hci_dev *dev, const struct firmware *fw,
161*4882a593Smuzhiyun u32 *boot_param);
162*4882a593Smuzhiyun int btintel_download_firmware_newgen(struct hci_dev *hdev,
163*4882a593Smuzhiyun const struct firmware *fw,
164*4882a593Smuzhiyun u32 *boot_param, u8 hw_variant,
165*4882a593Smuzhiyun u8 sbe_type);
166*4882a593Smuzhiyun void btintel_reset_to_bootloader(struct hci_dev *hdev);
167*4882a593Smuzhiyun int btintel_read_debug_features(struct hci_dev *hdev,
168*4882a593Smuzhiyun struct intel_debug_features *features);
169*4882a593Smuzhiyun int btintel_set_debug_features(struct hci_dev *hdev,
170*4882a593Smuzhiyun const struct intel_debug_features *features);
171*4882a593Smuzhiyun #else
172*4882a593Smuzhiyun
btintel_check_bdaddr(struct hci_dev * hdev)173*4882a593Smuzhiyun static inline int btintel_check_bdaddr(struct hci_dev *hdev)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun return -EOPNOTSUPP;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
btintel_enter_mfg(struct hci_dev * hdev)178*4882a593Smuzhiyun static inline int btintel_enter_mfg(struct hci_dev *hdev)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun return -EOPNOTSUPP;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
btintel_exit_mfg(struct hci_dev * hdev,bool reset,bool patched)183*4882a593Smuzhiyun static inline int btintel_exit_mfg(struct hci_dev *hdev, bool reset, bool patched)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun return -EOPNOTSUPP;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
btintel_set_bdaddr(struct hci_dev * hdev,const bdaddr_t * bdaddr)188*4882a593Smuzhiyun static inline int btintel_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun return -EOPNOTSUPP;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun
btintel_set_diag(struct hci_dev * hdev,bool enable)193*4882a593Smuzhiyun static inline int btintel_set_diag(struct hci_dev *hdev, bool enable)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun return -EOPNOTSUPP;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
btintel_set_diag_mfg(struct hci_dev * hdev,bool enable)198*4882a593Smuzhiyun static inline int btintel_set_diag_mfg(struct hci_dev *hdev, bool enable)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun return -EOPNOTSUPP;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun
btintel_hw_error(struct hci_dev * hdev,u8 code)203*4882a593Smuzhiyun static inline void btintel_hw_error(struct hci_dev *hdev, u8 code)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun
btintel_version_info(struct hci_dev * hdev,struct intel_version * ver)207*4882a593Smuzhiyun static inline void btintel_version_info(struct hci_dev *hdev,
208*4882a593Smuzhiyun struct intel_version *ver)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
btintel_version_info_tlv(struct hci_dev * hdev,struct intel_version_tlv * version)212*4882a593Smuzhiyun static inline void btintel_version_info_tlv(struct hci_dev *hdev,
213*4882a593Smuzhiyun struct intel_version_tlv *version)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
btintel_secure_send(struct hci_dev * hdev,u8 fragment_type,u32 plen,const void * param)217*4882a593Smuzhiyun static inline int btintel_secure_send(struct hci_dev *hdev, u8 fragment_type,
218*4882a593Smuzhiyun u32 plen, const void *param)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun return -EOPNOTSUPP;
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun
btintel_load_ddc_config(struct hci_dev * hdev,const char * ddc_name)223*4882a593Smuzhiyun static inline int btintel_load_ddc_config(struct hci_dev *hdev,
224*4882a593Smuzhiyun const char *ddc_name)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun return -EOPNOTSUPP;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
btintel_set_event_mask(struct hci_dev * hdev,bool debug)229*4882a593Smuzhiyun static inline int btintel_set_event_mask(struct hci_dev *hdev, bool debug)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun return -EOPNOTSUPP;
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun
btintel_set_event_mask_mfg(struct hci_dev * hdev,bool debug)234*4882a593Smuzhiyun static inline int btintel_set_event_mask_mfg(struct hci_dev *hdev, bool debug)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun return -EOPNOTSUPP;
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
btintel_read_version(struct hci_dev * hdev,struct intel_version * ver)239*4882a593Smuzhiyun static inline int btintel_read_version(struct hci_dev *hdev,
240*4882a593Smuzhiyun struct intel_version *ver)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun return -EOPNOTSUPP;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun
btintel_read_version_tlv(struct hci_dev * hdev,struct intel_version_tlv * ver)245*4882a593Smuzhiyun static inline int btintel_read_version_tlv(struct hci_dev *hdev,
246*4882a593Smuzhiyun struct intel_version_tlv *ver)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun return -EOPNOTSUPP;
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun
btintel_regmap_init(struct hci_dev * hdev,u16 opcode_read,u16 opcode_write)251*4882a593Smuzhiyun static inline struct regmap *btintel_regmap_init(struct hci_dev *hdev,
252*4882a593Smuzhiyun u16 opcode_read,
253*4882a593Smuzhiyun u16 opcode_write)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun
btintel_send_intel_reset(struct hci_dev * hdev,u32 reset_param)258*4882a593Smuzhiyun static inline int btintel_send_intel_reset(struct hci_dev *hdev,
259*4882a593Smuzhiyun u32 reset_param)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun return -EOPNOTSUPP;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
btintel_read_boot_params(struct hci_dev * hdev,struct intel_boot_params * params)264*4882a593Smuzhiyun static inline int btintel_read_boot_params(struct hci_dev *hdev,
265*4882a593Smuzhiyun struct intel_boot_params *params)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun return -EOPNOTSUPP;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
btintel_download_firmware(struct hci_dev * dev,const struct firmware * fw,u32 * boot_param)270*4882a593Smuzhiyun static inline int btintel_download_firmware(struct hci_dev *dev,
271*4882a593Smuzhiyun const struct firmware *fw,
272*4882a593Smuzhiyun u32 *boot_param)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun return -EOPNOTSUPP;
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun
btintel_download_firmware_newgen(struct hci_dev * hdev,const struct firmware * fw,u32 * boot_param,u8 hw_variant,u8 sbe_type)277*4882a593Smuzhiyun static inline int btintel_download_firmware_newgen(struct hci_dev *hdev,
278*4882a593Smuzhiyun const struct firmware *fw,
279*4882a593Smuzhiyun u32 *boot_param,
280*4882a593Smuzhiyun u8 hw_variant, u8 sbe_type)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun return -EOPNOTSUPP;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun
btintel_reset_to_bootloader(struct hci_dev * hdev)285*4882a593Smuzhiyun static inline void btintel_reset_to_bootloader(struct hci_dev *hdev)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
btintel_read_debug_features(struct hci_dev * hdev,struct intel_debug_features * features)289*4882a593Smuzhiyun static inline int btintel_read_debug_features(struct hci_dev *hdev,
290*4882a593Smuzhiyun struct intel_debug_features *features)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun return -EOPNOTSUPP;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
btintel_set_debug_features(struct hci_dev * hdev,const struct intel_debug_features * features)295*4882a593Smuzhiyun static inline int btintel_set_debug_features(struct hci_dev *hdev,
296*4882a593Smuzhiyun const struct intel_debug_features *features)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun return -EOPNOTSUPP;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun #endif
302