Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 559cceed authored by Chaoli Zhou's avatar Chaoli Zhou Committed by Gerrit - the friendly Code Review server
Browse files

CNSS2: Add Genoa support for CNSS2



Add Genoa specific qmi configuraion and power on/off
handle.

Change-Id: I60508e3befb15be8cd3fdba26aab6df768f53a5b
Signed-off-by: default avatarChaoli Zhou <zchaoli@codeaurora.org>
parent bc1f52b9
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,7 @@ enum cnss_dev_bus_type cnss_get_bus_type(struct cnss_plat_data *plat_priv)
	case QCA6174_DEVICE_ID:
	case QCA6174_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		bus_type = CNSS_BUS_PCI;
		bus_type = CNSS_BUS_PCI;
		break;
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_COMPOSITE_DEVICE_ID:
@@ -430,3 +431,18 @@ int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
		return -EINVAL;
		return -EINVAL;
	}
	}
}
}

int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv,
			    char *msi_name,
			    int *num_vectors, u32 *user_base_data,
			    u32 *base_vector)
{
	struct cnss_pci_data *pci_priv;

	pci_priv = plat_priv->bus_priv;
	return cnss_get_user_msi_assignment(&pci_priv->pci_dev->dev,
					    msi_name,
					    num_vectors,
					    user_base_data,
					    base_vector);
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -62,4 +62,9 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
			   enum cnss_driver_status status);
			   enum cnss_driver_status status);
bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv);
bool cnss_bus_req_mem_ind_valid(struct cnss_plat_data *plat_priv);
int cnss_get_msi_assignment(struct cnss_plat_data *plat_priv,
			    char *msi_name,
			    int *num_vectors,
			    u32 *user_base_data,
			    u32 *base_vector);
#endif /* _CNSS_BUS_H */
#endif /* _CNSS_BUS_H */
+13 −0
Original line number Original line Diff line number Diff line
@@ -258,6 +258,9 @@ int cnss_wlan_enable(struct device *dev,
	if (mode == CNSS_WALTEST || mode == CNSS_CCPM)
	if (mode == CNSS_WALTEST || mode == CNSS_CCPM)
		goto skip_cfg;
		goto skip_cfg;


	if (plat_priv->device_id == QCN7605_DEVICE_ID)
		config->send_msi_ce = true;

	ret = cnss_wlfw_wlan_cfg_send_sync(plat_priv, config, host_version);
	ret = cnss_wlfw_wlan_cfg_send_sync(plat_priv, config, host_version);
	if (ret)
	if (ret)
		goto out;
		goto out;
@@ -367,11 +370,17 @@ static int cnss_fw_mem_ready_hdlr(struct cnss_plat_data *plat_priv)


	cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_REGDB);
	cnss_wlfw_bdf_dnld_send_sync(plat_priv, CNSS_BDF_REGDB);


	if (plat_priv->device_id == QCN7605_DEVICE_ID)
		plat_priv->ctrl_params.bdf_type = CNSS_BDF_BIN;

	ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv,
	ret = cnss_wlfw_bdf_dnld_send_sync(plat_priv,
					   plat_priv->ctrl_params.bdf_type);
					   plat_priv->ctrl_params.bdf_type);
	if (ret)
	if (ret)
		goto out;
		goto out;


	if (plat_priv->device_id == QCN7605_DEVICE_ID)
		return 0;

	ret = cnss_bus_load_m3(plat_priv);
	ret = cnss_bus_load_m3(plat_priv);
	if (ret)
	if (ret)
		goto out;
		goto out;
@@ -1595,6 +1604,7 @@ int cnss_register_ramdump(struct cnss_plat_data *plat_priv)
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		ret = cnss_register_ramdump_v2(plat_priv);
		ret = cnss_register_ramdump_v2(plat_priv);
		break;
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_COMPOSITE_DEVICE_ID:
@@ -1616,6 +1626,7 @@ void cnss_unregister_ramdump(struct cnss_plat_data *plat_priv)
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		cnss_unregister_ramdump_v2(plat_priv);
		cnss_unregister_ramdump_v2(plat_priv);
		break;
		break;
	case QCN7605_COMPOSITE_DEVICE_ID:
	case QCN7605_COMPOSITE_DEVICE_ID:
@@ -1689,6 +1700,7 @@ static ssize_t cnss_fs_ready_store(struct device *dev,
	switch (plat_priv->device_id) {
	switch (plat_priv->device_id) {
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		break;
		break;
	default:
	default:
		cnss_pr_err("Not supported for device ID 0x%lx\n",
		cnss_pr_err("Not supported for device ID 0x%lx\n",
@@ -1826,6 +1838,7 @@ static const struct cnss_fw_path cnss_fw_path_table[] = {
	{ QCA6174_DEVICE_ID, "qca6174/" },
	{ QCA6174_DEVICE_ID, "qca6174/" },
	{ QCA6290_DEVICE_ID, "qca6290/" },
	{ QCA6290_DEVICE_ID, "qca6290/" },
	{ QCA6390_DEVICE_ID, "qca6390/" },
	{ QCA6390_DEVICE_ID, "qca6390/" },
	{ QCN7605_DEVICE_ID, "qcn7605/" },
	{ 0, "" }
	{ 0, "" }
};
};


+10 −1
Original line number Original line Diff line number Diff line
@@ -836,6 +836,7 @@ int cnss_pci_dev_powerup(struct cnss_pci_data *pci_priv)
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		ret = cnss_qca6290_powerup(pci_priv);
		ret = cnss_qca6290_powerup(pci_priv);
		break;
		break;
	default:
	default:
@@ -862,6 +863,7 @@ int cnss_pci_dev_shutdown(struct cnss_pci_data *pci_priv)
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		ret = cnss_qca6290_shutdown(pci_priv);
		ret = cnss_qca6290_shutdown(pci_priv);
		break;
		break;
	default:
	default:
@@ -914,6 +916,7 @@ int cnss_pci_dev_ramdump(struct cnss_pci_data *pci_priv)
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		ret = cnss_qca6290_ramdump(pci_priv);
		ret = cnss_qca6290_ramdump(pci_priv);
		break;
		break;
	default:
	default:
@@ -2569,7 +2572,11 @@ static int cnss_pci_register_mhi(struct cnss_pci_data *pci_priv)
	mhi_ctrl->runtime_put = cnss_mhi_pm_runtime_put_noidle;
	mhi_ctrl->runtime_put = cnss_mhi_pm_runtime_put_noidle;


	mhi_ctrl->rddm_size = pci_priv->plat_priv->ramdump_info_v2.ramdump_size;
	mhi_ctrl->rddm_size = pci_priv->plat_priv->ramdump_info_v2.ramdump_size;
	if (pci_priv->device_id == QCN7605_DEVICE_ID)
		mhi_ctrl->sbl_size = SZ_256K;
	else
		mhi_ctrl->sbl_size = SZ_512K;
		mhi_ctrl->sbl_size = SZ_512K;

	mhi_ctrl->seg_len = SZ_512K;
	mhi_ctrl->seg_len = SZ_512K;
	mhi_ctrl->fbc_download = true;
	mhi_ctrl->fbc_download = true;


@@ -3023,6 +3030,7 @@ static int cnss_pci_probe(struct pci_dev *pci_dev,
		break;
		break;
	case QCA6290_DEVICE_ID:
	case QCA6290_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCA6390_DEVICE_ID:
	case QCN7605_DEVICE_ID:
		setup_timer(&pci_priv->dev_rddm_timer,
		setup_timer(&pci_priv->dev_rddm_timer,
			    cnss_dev_rddm_timeout_hdlr,
			    cnss_dev_rddm_timeout_hdlr,
			    (unsigned long)pci_priv);
			    (unsigned long)pci_priv);
@@ -3105,6 +3113,7 @@ static const struct pci_device_id cnss_pci_id_table[] = {
	{ QCA6174_VENDOR_ID, QCA6174_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCA6174_VENDOR_ID, QCA6174_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCA6290_VENDOR_ID, QCA6290_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCA6390_VENDOR_ID, QCA6390_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID },
	{ QCN7605_VENDOR_ID, QCN7605_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID},
	{ 0 }
	{ 0 }
};
};
MODULE_DEVICE_TABLE(pci, cnss_pci_id_table);
MODULE_DEVICE_TABLE(pci, cnss_pci_id_table);
+37 −1
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@
#define BIN_BDF_FILE_NAME_PREFIX	"bdwlan.b"
#define BIN_BDF_FILE_NAME_PREFIX	"bdwlan.b"
#define REGDB_FILE_NAME			"regdb.bin"
#define REGDB_FILE_NAME			"regdb.bin"
#define DUMMY_BDF_FILE_NAME		"bdwlan.dmy"
#define DUMMY_BDF_FILE_NAME		"bdwlan.dmy"
#define CE_MSI_NAME			"CE"


#define QMI_WLFW_TIMEOUT_MS		(plat_priv->ctrl_params.qmi_timeout)
#define QMI_WLFW_TIMEOUT_MS		(plat_priv->ctrl_params.qmi_timeout)
#define QMI_WLFW_TIMEOUT_JF		msecs_to_jiffies(QMI_WLFW_TIMEOUT_MS)
#define QMI_WLFW_TIMEOUT_JF		msecs_to_jiffies(QMI_WLFW_TIMEOUT_MS)
@@ -749,7 +750,7 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv,
	struct wlfw_wlan_cfg_req_msg_v01 *req;
	struct wlfw_wlan_cfg_req_msg_v01 *req;
	struct wlfw_wlan_cfg_resp_msg_v01 *resp;
	struct wlfw_wlan_cfg_resp_msg_v01 *resp;
	struct qmi_txn txn;
	struct qmi_txn txn;
	u32 i;
	u32 i, ce_id, num_vectors, user_base_data, base_vector;
	int ret = 0;
	int ret = 0;


	cnss_pr_dbg("Sending WLAN config message, state: 0x%lx\n",
	cnss_pr_dbg("Sending WLAN config message, state: 0x%lx\n",
@@ -796,6 +797,17 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv,
		req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num;
		req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num;
	}
	}


	if (config->num_shadow_reg_cfg) {
		req->shadow_reg_valid = 1;
		if (config->num_shadow_reg_cfg >
		    QMI_WLFW_MAX_NUM_SHADOW_REG_V01)
			req->shadow_reg_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V01;
		else
			req->shadow_reg_len = config->num_shadow_reg_cfg;
		memcpy(req->shadow_reg, config->shadow_reg_cfg,
		       sizeof(struct wlfw_shadow_reg_cfg_s_v01)
		       * req->shadow_reg_len);
	}
	req->shadow_reg_v2_valid = 1;
	req->shadow_reg_v2_valid = 1;
	if (config->num_shadow_reg_v2_cfg >
	if (config->num_shadow_reg_v2_cfg >
	    QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01)
	    QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01)
@@ -806,6 +818,30 @@ int cnss_wlfw_wlan_cfg_send_sync(struct cnss_plat_data *plat_priv,
	memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg,
	memcpy(req->shadow_reg_v2, config->shadow_reg_v2_cfg,
	       sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01)
	       sizeof(struct wlfw_shadow_reg_v2_cfg_s_v01)
	       * req->shadow_reg_v2_len);
	       * req->shadow_reg_v2_len);
	if (config->rri_over_ddr_cfg_valid) {
		req->rri_over_ddr_cfg_valid = 1;
		req->rri_over_ddr_cfg.base_addr_low =
			config->rri_over_ddr_cfg.base_addr_low;
		req->rri_over_ddr_cfg.base_addr_high =
			config->rri_over_ddr_cfg.base_addr_high;
	}
	if (config->send_msi_ce) {
		ret = cnss_get_msi_assignment(plat_priv,
					      CE_MSI_NAME,
					      &num_vectors,
					      &user_base_data,
					      &base_vector);
		if (!ret) {
			req->msi_cfg_valid = 1;
			req->msi_cfg_len = QMI_WLFW_MAX_NUM_CE_V01;
			for (ce_id = 0; ce_id < QMI_WLFW_MAX_NUM_CE_V01;
				ce_id++) {
				req->msi_cfg[ce_id].ce_id = ce_id;
				req->msi_cfg[ce_id].msi_vector =
					(ce_id % num_vectors) + base_vector;
			}
		}
	}


	ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
	ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
			   wlfw_wlan_cfg_resp_msg_v01_ei, resp);
			   wlfw_wlan_cfg_resp_msg_v01_ei, resp);
Loading