162306a36Sopenharmony_ci/* SPDX-License-Identifier: ISC */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2018 The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _ATH10K_QMI_H_
662306a36Sopenharmony_ci#define _ATH10K_QMI_H_
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/soc/qcom/qmi.h>
962306a36Sopenharmony_ci#include <linux/qrtr.h>
1062306a36Sopenharmony_ci#include "qmi_wlfw_v01.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define MAX_NUM_MEMORY_REGIONS			2
1362306a36Sopenharmony_ci#define MAX_TIMESTAMP_LEN			32
1462306a36Sopenharmony_ci#define MAX_BUILD_ID_LEN			128
1562306a36Sopenharmony_ci#define MAX_NUM_CAL_V01			5
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cienum ath10k_qmi_driver_event_type {
1862306a36Sopenharmony_ci	ATH10K_QMI_EVENT_SERVER_ARRIVE,
1962306a36Sopenharmony_ci	ATH10K_QMI_EVENT_SERVER_EXIT,
2062306a36Sopenharmony_ci	ATH10K_QMI_EVENT_FW_READY_IND,
2162306a36Sopenharmony_ci	ATH10K_QMI_EVENT_FW_DOWN_IND,
2262306a36Sopenharmony_ci	ATH10K_QMI_EVENT_MSA_READY_IND,
2362306a36Sopenharmony_ci	ATH10K_QMI_EVENT_MAX,
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct ath10k_msa_mem_info {
2762306a36Sopenharmony_ci	phys_addr_t addr;
2862306a36Sopenharmony_ci	u32 size;
2962306a36Sopenharmony_ci	bool secure;
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistruct ath10k_qmi_chip_info {
3362306a36Sopenharmony_ci	u32 chip_id;
3462306a36Sopenharmony_ci	u32 chip_family;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct ath10k_qmi_board_info {
3862306a36Sopenharmony_ci	u32 board_id;
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct ath10k_qmi_soc_info {
4262306a36Sopenharmony_ci	u32 soc_id;
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct ath10k_qmi_cal_data {
4662306a36Sopenharmony_ci	u32 cal_id;
4762306a36Sopenharmony_ci	u32 total_size;
4862306a36Sopenharmony_ci	u8 *data;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct ath10k_tgt_pipe_cfg {
5262306a36Sopenharmony_ci	__le32 pipe_num;
5362306a36Sopenharmony_ci	__le32 pipe_dir;
5462306a36Sopenharmony_ci	__le32 nentries;
5562306a36Sopenharmony_ci	__le32 nbytes_max;
5662306a36Sopenharmony_ci	__le32 flags;
5762306a36Sopenharmony_ci	__le32 reserved;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct ath10k_svc_pipe_cfg {
6162306a36Sopenharmony_ci	__le32 service_id;
6262306a36Sopenharmony_ci	__le32 pipe_dir;
6362306a36Sopenharmony_ci	__le32 pipe_num;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct ath10k_shadow_reg_cfg {
6762306a36Sopenharmony_ci	__le16 ce_id;
6862306a36Sopenharmony_ci	__le16 reg_offset;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct ath10k_qmi_wlan_enable_cfg {
7262306a36Sopenharmony_ci	u32 num_ce_tgt_cfg;
7362306a36Sopenharmony_ci	struct ath10k_tgt_pipe_cfg *ce_tgt_cfg;
7462306a36Sopenharmony_ci	u32 num_ce_svc_pipe_cfg;
7562306a36Sopenharmony_ci	struct ath10k_svc_pipe_cfg *ce_svc_cfg;
7662306a36Sopenharmony_ci	u32 num_shadow_reg_cfg;
7762306a36Sopenharmony_ci	struct ath10k_shadow_reg_cfg *shadow_reg_cfg;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistruct ath10k_qmi_driver_event {
8162306a36Sopenharmony_ci	struct list_head list;
8262306a36Sopenharmony_ci	enum ath10k_qmi_driver_event_type type;
8362306a36Sopenharmony_ci	void *data;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cienum ath10k_qmi_state {
8762306a36Sopenharmony_ci	ATH10K_QMI_STATE_INIT_DONE,
8862306a36Sopenharmony_ci	ATH10K_QMI_STATE_DEINIT,
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistruct ath10k_qmi {
9262306a36Sopenharmony_ci	struct ath10k *ar;
9362306a36Sopenharmony_ci	struct qmi_handle qmi_hdl;
9462306a36Sopenharmony_ci	struct sockaddr_qrtr sq;
9562306a36Sopenharmony_ci	struct work_struct event_work;
9662306a36Sopenharmony_ci	struct workqueue_struct *event_wq;
9762306a36Sopenharmony_ci	struct list_head event_list;
9862306a36Sopenharmony_ci	spinlock_t event_lock; /* spinlock for qmi event list */
9962306a36Sopenharmony_ci	u32 nr_mem_region;
10062306a36Sopenharmony_ci	struct ath10k_msa_mem_info mem_region[MAX_NUM_MEMORY_REGIONS];
10162306a36Sopenharmony_ci	struct ath10k_qmi_chip_info chip_info;
10262306a36Sopenharmony_ci	struct ath10k_qmi_board_info board_info;
10362306a36Sopenharmony_ci	struct ath10k_qmi_soc_info soc_info;
10462306a36Sopenharmony_ci	char fw_build_id[MAX_BUILD_ID_LEN + 1];
10562306a36Sopenharmony_ci	u32 fw_version;
10662306a36Sopenharmony_ci	bool fw_ready;
10762306a36Sopenharmony_ci	char fw_build_timestamp[MAX_TIMESTAMP_LEN + 1];
10862306a36Sopenharmony_ci	struct ath10k_qmi_cal_data cal_data[MAX_NUM_CAL_V01];
10962306a36Sopenharmony_ci	bool msa_fixed_perm;
11062306a36Sopenharmony_ci	enum ath10k_qmi_state state;
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ciint ath10k_qmi_wlan_enable(struct ath10k *ar,
11462306a36Sopenharmony_ci			   struct ath10k_qmi_wlan_enable_cfg *config,
11562306a36Sopenharmony_ci			   enum wlfw_driver_mode_enum_v01 mode,
11662306a36Sopenharmony_ci			   const char *version);
11762306a36Sopenharmony_ciint ath10k_qmi_wlan_disable(struct ath10k *ar);
11862306a36Sopenharmony_ciint ath10k_qmi_init(struct ath10k *ar, u32 msa_size);
11962306a36Sopenharmony_ciint ath10k_qmi_deinit(struct ath10k *ar);
12062306a36Sopenharmony_ciint ath10k_qmi_set_fw_log_mode(struct ath10k *ar, u8 fw_log_mode);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#endif /* ATH10K_QMI_H */
123