Linux Audio

Check our new training course

Open-source upstreaming

Need help get the support for your hardware in upstream Linux?
Loading...
Note: File does not exist in v4.6.
   1// SPDX-License-Identifier: BSD-3-Clause-Clear
   2/*
   3 * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
   4 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
   5 */
   6
   7#include <linux/module.h>
   8#include <linux/msi.h>
   9#include <linux/pci.h>
  10#include <linux/of.h>
  11
  12#include "pci.h"
  13#include "core.h"
  14#include "hif.h"
  15#include "mhi.h"
  16#include "debug.h"
  17#include "pcic.h"
  18#include "qmi.h"
  19
  20#define ATH11K_PCI_BAR_NUM		0
  21#define ATH11K_PCI_DMA_MASK		32
  22
  23#define TCSR_SOC_HW_VERSION		0x0224
  24#define TCSR_SOC_HW_VERSION_MAJOR_MASK	GENMASK(11, 8)
  25#define TCSR_SOC_HW_VERSION_MINOR_MASK	GENMASK(7, 0)
  26
  27#define QCA6390_DEVICE_ID		0x1101
  28#define QCN9074_DEVICE_ID		0x1104
  29#define WCN6855_DEVICE_ID		0x1103
  30
  31static const struct pci_device_id ath11k_pci_id_table[] = {
  32	{ PCI_VDEVICE(QCOM, QCA6390_DEVICE_ID) },
  33	{ PCI_VDEVICE(QCOM, WCN6855_DEVICE_ID) },
  34	{ PCI_VDEVICE(QCOM, QCN9074_DEVICE_ID) },
  35	{0}
  36};
  37
  38MODULE_DEVICE_TABLE(pci, ath11k_pci_id_table);
  39
  40static int ath11k_pci_bus_wake_up(struct ath11k_base *ab)
  41{
  42	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
  43
  44	return mhi_device_get_sync(ab_pci->mhi_ctrl->mhi_dev);
  45}
  46
  47static void ath11k_pci_bus_release(struct ath11k_base *ab)
  48{
  49	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
  50
  51	mhi_device_put(ab_pci->mhi_ctrl->mhi_dev);
  52}
  53
  54static u32 ath11k_pci_get_window_start(struct ath11k_base *ab, u32 offset)
  55{
  56	if (!ab->hw_params.static_window_map)
  57		return ATH11K_PCI_WINDOW_START;
  58
  59	if ((offset ^ HAL_SEQ_WCSS_UMAC_OFFSET) < ATH11K_PCI_WINDOW_RANGE_MASK)
  60		/* if offset lies within DP register range, use 3rd window */
  61		return 3 * ATH11K_PCI_WINDOW_START;
  62	else if ((offset ^ HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab)) <
  63		 ATH11K_PCI_WINDOW_RANGE_MASK)
  64		 /* if offset lies within CE register range, use 2nd window */
  65		return 2 * ATH11K_PCI_WINDOW_START;
  66	else
  67		return ATH11K_PCI_WINDOW_START;
  68}
  69
  70static inline void ath11k_pci_select_window(struct ath11k_pci *ab_pci, u32 offset)
  71{
  72	struct ath11k_base *ab = ab_pci->ab;
  73
  74	u32 window = FIELD_GET(ATH11K_PCI_WINDOW_VALUE_MASK, offset);
  75
  76	lockdep_assert_held(&ab_pci->window_lock);
  77
  78	if (window != ab_pci->register_window) {
  79		iowrite32(ATH11K_PCI_WINDOW_ENABLE_BIT | window,
  80			  ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS);
  81		ioread32(ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS);
  82		ab_pci->register_window = window;
  83	}
  84}
  85
  86static void
  87ath11k_pci_window_write32(struct ath11k_base *ab, u32 offset, u32 value)
  88{
  89	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
  90	u32 window_start;
  91
  92	window_start = ath11k_pci_get_window_start(ab, offset);
  93
  94	if (window_start == ATH11K_PCI_WINDOW_START) {
  95		spin_lock_bh(&ab_pci->window_lock);
  96		ath11k_pci_select_window(ab_pci, offset);
  97		iowrite32(value, ab->mem + window_start +
  98			  (offset & ATH11K_PCI_WINDOW_RANGE_MASK));
  99		spin_unlock_bh(&ab_pci->window_lock);
 100	} else {
 101		iowrite32(value, ab->mem + window_start +
 102			  (offset & ATH11K_PCI_WINDOW_RANGE_MASK));
 103	}
 104}
 105
 106static u32 ath11k_pci_window_read32(struct ath11k_base *ab, u32 offset)
 107{
 108	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 109	u32 window_start, val;
 110
 111	window_start = ath11k_pci_get_window_start(ab, offset);
 112
 113	if (window_start == ATH11K_PCI_WINDOW_START) {
 114		spin_lock_bh(&ab_pci->window_lock);
 115		ath11k_pci_select_window(ab_pci, offset);
 116		val = ioread32(ab->mem + window_start +
 117			       (offset & ATH11K_PCI_WINDOW_RANGE_MASK));
 118		spin_unlock_bh(&ab_pci->window_lock);
 119	} else {
 120		val = ioread32(ab->mem + window_start +
 121			       (offset & ATH11K_PCI_WINDOW_RANGE_MASK));
 122	}
 123
 124	return val;
 125}
 126
 127int ath11k_pci_get_msi_irq(struct ath11k_base *ab, unsigned int vector)
 128{
 129	struct pci_dev *pci_dev = to_pci_dev(ab->dev);
 130
 131	return pci_irq_vector(pci_dev, vector);
 132}
 133
 134static const struct ath11k_pci_ops ath11k_pci_ops_qca6390 = {
 135	.wakeup = ath11k_pci_bus_wake_up,
 136	.release = ath11k_pci_bus_release,
 137	.get_msi_irq = ath11k_pci_get_msi_irq,
 138	.window_write32 = ath11k_pci_window_write32,
 139	.window_read32 = ath11k_pci_window_read32,
 140};
 141
 142static const struct ath11k_pci_ops ath11k_pci_ops_qcn9074 = {
 143	.wakeup = NULL,
 144	.release = NULL,
 145	.get_msi_irq = ath11k_pci_get_msi_irq,
 146	.window_write32 = ath11k_pci_window_write32,
 147	.window_read32 = ath11k_pci_window_read32,
 148};
 149
 150static const struct ath11k_msi_config msi_config_one_msi = {
 151	.total_vectors = 1,
 152	.total_users = 4,
 153	.users = (struct ath11k_msi_user[]) {
 154		{ .name = "MHI", .num_vectors = 3, .base_vector = 0 },
 155		{ .name = "CE", .num_vectors = 1, .base_vector = 0 },
 156		{ .name = "WAKE", .num_vectors = 1, .base_vector = 0 },
 157		{ .name = "DP", .num_vectors = 1, .base_vector = 0 },
 158	},
 159};
 160
 161static inline void ath11k_pci_select_static_window(struct ath11k_pci *ab_pci)
 162{
 163	u32 umac_window;
 164	u32 ce_window;
 165	u32 window;
 166
 167	umac_window = FIELD_GET(ATH11K_PCI_WINDOW_VALUE_MASK, HAL_SEQ_WCSS_UMAC_OFFSET);
 168	ce_window = FIELD_GET(ATH11K_PCI_WINDOW_VALUE_MASK, HAL_CE_WFSS_CE_REG_BASE);
 169	window = (umac_window << 12) | (ce_window << 6);
 170
 171	iowrite32(ATH11K_PCI_WINDOW_ENABLE_BIT | window,
 172		  ab_pci->ab->mem + ATH11K_PCI_WINDOW_REG_ADDRESS);
 173}
 174
 175static void ath11k_pci_soc_global_reset(struct ath11k_base *ab)
 176{
 177	u32 val, delay;
 178
 179	val = ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
 180
 181	val |= PCIE_SOC_GLOBAL_RESET_V;
 182
 183	ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
 184
 185	/* TODO: exact time to sleep is uncertain */
 186	delay = 10;
 187	mdelay(delay);
 188
 189	/* Need to toggle V bit back otherwise stuck in reset status */
 190	val &= ~PCIE_SOC_GLOBAL_RESET_V;
 191
 192	ath11k_pcic_write32(ab, PCIE_SOC_GLOBAL_RESET, val);
 193
 194	mdelay(delay);
 195
 196	val = ath11k_pcic_read32(ab, PCIE_SOC_GLOBAL_RESET);
 197	if (val == 0xffffffff)
 198		ath11k_warn(ab, "link down error during global reset\n");
 199}
 200
 201static void ath11k_pci_clear_dbg_registers(struct ath11k_base *ab)
 202{
 203	u32 val;
 204
 205	/* read cookie */
 206	val = ath11k_pcic_read32(ab, PCIE_Q6_COOKIE_ADDR);
 207	ath11k_dbg(ab, ATH11K_DBG_PCI, "pcie_q6_cookie_addr 0x%x\n", val);
 208
 209	val = ath11k_pcic_read32(ab, WLAON_WARM_SW_ENTRY);
 210	ath11k_dbg(ab, ATH11K_DBG_PCI, "wlaon_warm_sw_entry 0x%x\n", val);
 211
 212	/* TODO: exact time to sleep is uncertain */
 213	mdelay(10);
 214
 215	/* write 0 to WLAON_WARM_SW_ENTRY to prevent Q6 from
 216	 * continuing warm path and entering dead loop.
 217	 */
 218	ath11k_pcic_write32(ab, WLAON_WARM_SW_ENTRY, 0);
 219	mdelay(10);
 220
 221	val = ath11k_pcic_read32(ab, WLAON_WARM_SW_ENTRY);
 222	ath11k_dbg(ab, ATH11K_DBG_PCI, "wlaon_warm_sw_entry 0x%x\n", val);
 223
 224	/* A read clear register. clear the register to prevent
 225	 * Q6 from entering wrong code path.
 226	 */
 227	val = ath11k_pcic_read32(ab, WLAON_SOC_RESET_CAUSE_REG);
 228	ath11k_dbg(ab, ATH11K_DBG_PCI, "soc reset cause %d\n", val);
 229}
 230
 231static int ath11k_pci_set_link_reg(struct ath11k_base *ab,
 232				   u32 offset, u32 value, u32 mask)
 233{
 234	u32 v;
 235	int i;
 236
 237	v = ath11k_pcic_read32(ab, offset);
 238	if ((v & mask) == value)
 239		return 0;
 240
 241	for (i = 0; i < 10; i++) {
 242		ath11k_pcic_write32(ab, offset, (v & ~mask) | value);
 243
 244		v = ath11k_pcic_read32(ab, offset);
 245		if ((v & mask) == value)
 246			return 0;
 247
 248		mdelay(2);
 249	}
 250
 251	ath11k_warn(ab, "failed to set pcie link register 0x%08x: 0x%08x != 0x%08x\n",
 252		    offset, v & mask, value);
 253
 254	return -ETIMEDOUT;
 255}
 256
 257static int ath11k_pci_fix_l1ss(struct ath11k_base *ab)
 258{
 259	int ret;
 260
 261	ret = ath11k_pci_set_link_reg(ab,
 262				      PCIE_QSERDES_COM_SYSCLK_EN_SEL_REG(ab),
 263				      PCIE_QSERDES_COM_SYSCLK_EN_SEL_VAL,
 264				      PCIE_QSERDES_COM_SYSCLK_EN_SEL_MSK);
 265	if (ret) {
 266		ath11k_warn(ab, "failed to set sysclk: %d\n", ret);
 267		return ret;
 268	}
 269
 270	ret = ath11k_pci_set_link_reg(ab,
 271				      PCIE_PCS_OSC_DTCT_CONFIG1_REG(ab),
 272				      PCIE_PCS_OSC_DTCT_CONFIG1_VAL,
 273				      PCIE_PCS_OSC_DTCT_CONFIG_MSK);
 274	if (ret) {
 275		ath11k_warn(ab, "failed to set dtct config1 error: %d\n", ret);
 276		return ret;
 277	}
 278
 279	ret = ath11k_pci_set_link_reg(ab,
 280				      PCIE_PCS_OSC_DTCT_CONFIG2_REG(ab),
 281				      PCIE_PCS_OSC_DTCT_CONFIG2_VAL,
 282				      PCIE_PCS_OSC_DTCT_CONFIG_MSK);
 283	if (ret) {
 284		ath11k_warn(ab, "failed to set dtct config2: %d\n", ret);
 285		return ret;
 286	}
 287
 288	ret = ath11k_pci_set_link_reg(ab,
 289				      PCIE_PCS_OSC_DTCT_CONFIG4_REG(ab),
 290				      PCIE_PCS_OSC_DTCT_CONFIG4_VAL,
 291				      PCIE_PCS_OSC_DTCT_CONFIG_MSK);
 292	if (ret) {
 293		ath11k_warn(ab, "failed to set dtct config4: %d\n", ret);
 294		return ret;
 295	}
 296
 297	return 0;
 298}
 299
 300static void ath11k_pci_enable_ltssm(struct ath11k_base *ab)
 301{
 302	u32 val;
 303	int i;
 304
 305	val = ath11k_pcic_read32(ab, PCIE_PCIE_PARF_LTSSM);
 306
 307	/* PCIE link seems very unstable after the Hot Reset*/
 308	for (i = 0; val != PARM_LTSSM_VALUE && i < 5; i++) {
 309		if (val == 0xffffffff)
 310			mdelay(5);
 311
 312		ath11k_pcic_write32(ab, PCIE_PCIE_PARF_LTSSM, PARM_LTSSM_VALUE);
 313		val = ath11k_pcic_read32(ab, PCIE_PCIE_PARF_LTSSM);
 314	}
 315
 316	ath11k_dbg(ab, ATH11K_DBG_PCI, "ltssm 0x%x\n", val);
 317
 318	val = ath11k_pcic_read32(ab, GCC_GCC_PCIE_HOT_RST);
 319	val |= GCC_GCC_PCIE_HOT_RST_VAL;
 320	ath11k_pcic_write32(ab, GCC_GCC_PCIE_HOT_RST, val);
 321	val = ath11k_pcic_read32(ab, GCC_GCC_PCIE_HOT_RST);
 322
 323	ath11k_dbg(ab, ATH11K_DBG_PCI, "pcie_hot_rst 0x%x\n", val);
 324
 325	mdelay(5);
 326}
 327
 328static void ath11k_pci_clear_all_intrs(struct ath11k_base *ab)
 329{
 330	/* This is a WAR for PCIE Hotreset.
 331	 * When target receive Hotreset, but will set the interrupt.
 332	 * So when download SBL again, SBL will open Interrupt and
 333	 * receive it, and crash immediately.
 334	 */
 335	ath11k_pcic_write32(ab, PCIE_PCIE_INT_ALL_CLEAR, PCIE_INT_CLEAR_ALL);
 336}
 337
 338static void ath11k_pci_set_wlaon_pwr_ctrl(struct ath11k_base *ab)
 339{
 340	u32 val;
 341
 342	val = ath11k_pcic_read32(ab, WLAON_QFPROM_PWR_CTRL_REG);
 343	val &= ~QFPROM_PWR_CTRL_VDD4BLOW_MASK;
 344	ath11k_pcic_write32(ab, WLAON_QFPROM_PWR_CTRL_REG, val);
 345}
 346
 347static void ath11k_pci_force_wake(struct ath11k_base *ab)
 348{
 349	ath11k_pcic_write32(ab, PCIE_SOC_WAKE_PCIE_LOCAL_REG, 1);
 350	mdelay(5);
 351}
 352
 353static void ath11k_pci_sw_reset(struct ath11k_base *ab, bool power_on)
 354{
 355	mdelay(100);
 356
 357	if (power_on) {
 358		ath11k_pci_enable_ltssm(ab);
 359		ath11k_pci_clear_all_intrs(ab);
 360		ath11k_pci_set_wlaon_pwr_ctrl(ab);
 361		if (ab->hw_params.fix_l1ss)
 362			ath11k_pci_fix_l1ss(ab);
 363	}
 364
 365	ath11k_mhi_clear_vector(ab);
 366	ath11k_pci_clear_dbg_registers(ab);
 367	ath11k_pci_soc_global_reset(ab);
 368	ath11k_mhi_set_mhictrl_reset(ab);
 369}
 370
 371static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab)
 372{
 373	struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg;
 374
 375	cfg->tgt_ce = ab->hw_params.target_ce_config;
 376	cfg->tgt_ce_len = ab->hw_params.target_ce_count;
 377
 378	cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map;
 379	cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len;
 380	ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id;
 381
 382	ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2,
 383				    &cfg->shadow_reg_v2_len);
 384}
 385
 386static void ath11k_pci_msi_config(struct ath11k_pci *ab_pci, bool enable)
 387{
 388	struct pci_dev *dev = ab_pci->pdev;
 389	u16 control;
 390
 391	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
 392
 393	if (enable)
 394		control |= PCI_MSI_FLAGS_ENABLE;
 395	else
 396		control &= ~PCI_MSI_FLAGS_ENABLE;
 397
 398	pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
 399}
 400
 401static void ath11k_pci_msi_enable(struct ath11k_pci *ab_pci)
 402{
 403	ath11k_pci_msi_config(ab_pci, true);
 404}
 405
 406static void ath11k_pci_msi_disable(struct ath11k_pci *ab_pci)
 407{
 408	ath11k_pci_msi_config(ab_pci, false);
 409}
 410
 411static int ath11k_pci_alloc_msi(struct ath11k_pci *ab_pci)
 412{
 413	struct ath11k_base *ab = ab_pci->ab;
 414	const struct ath11k_msi_config *msi_config = ab->pci.msi.config;
 415	struct pci_dev *pci_dev = ab_pci->pdev;
 416	struct msi_desc *msi_desc;
 417	int num_vectors;
 418	int ret;
 419
 420	num_vectors = pci_alloc_irq_vectors(pci_dev,
 421					    msi_config->total_vectors,
 422					    msi_config->total_vectors,
 423					    PCI_IRQ_MSI);
 424	if (num_vectors == msi_config->total_vectors) {
 425		set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags);
 426	} else {
 427		num_vectors = pci_alloc_irq_vectors(ab_pci->pdev,
 428						    1,
 429						    1,
 430						    PCI_IRQ_MSI);
 431		if (num_vectors < 0) {
 432			ret = -EINVAL;
 433			goto reset_msi_config;
 434		}
 435		clear_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags);
 436		ab->pci.msi.config = &msi_config_one_msi;
 437		ath11k_dbg(ab, ATH11K_DBG_PCI, "request one msi vector\n");
 438	}
 439	ath11k_info(ab, "MSI vectors: %d\n", num_vectors);
 440
 441	ath11k_pci_msi_disable(ab_pci);
 442
 443	msi_desc = irq_get_msi_desc(ab_pci->pdev->irq);
 444	if (!msi_desc) {
 445		ath11k_err(ab, "msi_desc is NULL!\n");
 446		ret = -EINVAL;
 447		goto free_msi_vector;
 448	}
 449
 450	ab->pci.msi.ep_base_data = msi_desc->msg.data;
 451
 452	pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO,
 453			      &ab->pci.msi.addr_lo);
 454
 455	if (msi_desc->pci.msi_attrib.is_64) {
 456		pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_HI,
 457				      &ab->pci.msi.addr_hi);
 458	} else {
 459		ab->pci.msi.addr_hi = 0;
 460	}
 461
 462	ath11k_dbg(ab, ATH11K_DBG_PCI, "msi base data is %d\n", ab->pci.msi.ep_base_data);
 463
 464	return 0;
 465
 466free_msi_vector:
 467	pci_free_irq_vectors(ab_pci->pdev);
 468
 469reset_msi_config:
 470	return ret;
 471}
 472
 473static void ath11k_pci_free_msi(struct ath11k_pci *ab_pci)
 474{
 475	pci_free_irq_vectors(ab_pci->pdev);
 476}
 477
 478static int ath11k_pci_config_msi_data(struct ath11k_pci *ab_pci)
 479{
 480	struct msi_desc *msi_desc;
 481
 482	msi_desc = irq_get_msi_desc(ab_pci->pdev->irq);
 483	if (!msi_desc) {
 484		ath11k_err(ab_pci->ab, "msi_desc is NULL!\n");
 485		pci_free_irq_vectors(ab_pci->pdev);
 486		return -EINVAL;
 487	}
 488
 489	ab_pci->ab->pci.msi.ep_base_data = msi_desc->msg.data;
 490
 491	ath11k_dbg(ab_pci->ab, ATH11K_DBG_PCI, "after request_irq msi_ep_base_data %d\n",
 492		   ab_pci->ab->pci.msi.ep_base_data);
 493
 494	return 0;
 495}
 496
 497static int ath11k_pci_claim(struct ath11k_pci *ab_pci, struct pci_dev *pdev)
 498{
 499	struct ath11k_base *ab = ab_pci->ab;
 500	u16 device_id;
 501	int ret = 0;
 502
 503	pci_read_config_word(pdev, PCI_DEVICE_ID, &device_id);
 504	if (device_id != ab_pci->dev_id)  {
 505		ath11k_err(ab, "pci device id mismatch: 0x%x 0x%x\n",
 506			   device_id, ab_pci->dev_id);
 507		ret = -EIO;
 508		goto out;
 509	}
 510
 511	ret = pci_assign_resource(pdev, ATH11K_PCI_BAR_NUM);
 512	if (ret) {
 513		ath11k_err(ab, "failed to assign pci resource: %d\n", ret);
 514		goto out;
 515	}
 516
 517	ret = pci_enable_device(pdev);
 518	if (ret) {
 519		ath11k_err(ab, "failed to enable pci device: %d\n", ret);
 520		goto out;
 521	}
 522
 523	ret = pci_request_region(pdev, ATH11K_PCI_BAR_NUM, "ath11k_pci");
 524	if (ret) {
 525		ath11k_err(ab, "failed to request pci region: %d\n", ret);
 526		goto disable_device;
 527	}
 528
 529	ret = dma_set_mask_and_coherent(&pdev->dev,
 530					DMA_BIT_MASK(ATH11K_PCI_DMA_MASK));
 531	if (ret) {
 532		ath11k_err(ab, "failed to set pci dma mask to %d: %d\n",
 533			   ATH11K_PCI_DMA_MASK, ret);
 534		goto release_region;
 535	}
 536
 537	pci_set_master(pdev);
 538
 539	ab->mem_len = pci_resource_len(pdev, ATH11K_PCI_BAR_NUM);
 540	ab->mem = pci_iomap(pdev, ATH11K_PCI_BAR_NUM, 0);
 541	if (!ab->mem) {
 542		ath11k_err(ab, "failed to map pci bar %d\n", ATH11K_PCI_BAR_NUM);
 543		ret = -EIO;
 544		goto release_region;
 545	}
 546
 547	ab->mem_ce = ab->mem;
 548
 549	ath11k_dbg(ab, ATH11K_DBG_BOOT, "pci_mem 0x%p\n", ab->mem);
 550	return 0;
 551
 552release_region:
 553	pci_release_region(pdev, ATH11K_PCI_BAR_NUM);
 554disable_device:
 555	pci_disable_device(pdev);
 556out:
 557	return ret;
 558}
 559
 560static void ath11k_pci_free_region(struct ath11k_pci *ab_pci)
 561{
 562	struct ath11k_base *ab = ab_pci->ab;
 563	struct pci_dev *pci_dev = ab_pci->pdev;
 564
 565	pci_iounmap(pci_dev, ab->mem);
 566	ab->mem = NULL;
 567	pci_release_region(pci_dev, ATH11K_PCI_BAR_NUM);
 568	if (pci_is_enabled(pci_dev))
 569		pci_disable_device(pci_dev);
 570}
 571
 572static void ath11k_pci_aspm_disable(struct ath11k_pci *ab_pci)
 573{
 574	struct ath11k_base *ab = ab_pci->ab;
 575
 576	pcie_capability_read_word(ab_pci->pdev, PCI_EXP_LNKCTL,
 577				  &ab_pci->link_ctl);
 578
 579	ath11k_dbg(ab, ATH11K_DBG_PCI, "link_ctl 0x%04x L0s %d L1 %d\n",
 580		   ab_pci->link_ctl,
 581		   u16_get_bits(ab_pci->link_ctl, PCI_EXP_LNKCTL_ASPM_L0S),
 582		   u16_get_bits(ab_pci->link_ctl, PCI_EXP_LNKCTL_ASPM_L1));
 583
 584	/* disable L0s and L1 */
 585	pcie_capability_clear_word(ab_pci->pdev, PCI_EXP_LNKCTL,
 586				   PCI_EXP_LNKCTL_ASPMC);
 587
 588	set_bit(ATH11K_PCI_ASPM_RESTORE, &ab_pci->flags);
 589}
 590
 591static void ath11k_pci_aspm_restore(struct ath11k_pci *ab_pci)
 592{
 593	if (test_and_clear_bit(ATH11K_PCI_ASPM_RESTORE, &ab_pci->flags))
 594		pcie_capability_clear_and_set_word(ab_pci->pdev, PCI_EXP_LNKCTL,
 595						   PCI_EXP_LNKCTL_ASPMC,
 596						   ab_pci->link_ctl &
 597						   PCI_EXP_LNKCTL_ASPMC);
 598}
 599
 600static int ath11k_pci_power_up(struct ath11k_base *ab)
 601{
 602	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 603	int ret;
 604
 605	ab_pci->register_window = 0;
 606	clear_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags);
 607	ath11k_pci_sw_reset(ab_pci->ab, true);
 608
 609	/* Disable ASPM during firmware download due to problems switching
 610	 * to AMSS state.
 611	 */
 612	ath11k_pci_aspm_disable(ab_pci);
 613
 614	ath11k_pci_msi_enable(ab_pci);
 615
 616	ret = ath11k_mhi_start(ab_pci);
 617	if (ret) {
 618		ath11k_err(ab, "failed to start mhi: %d\n", ret);
 619		return ret;
 620	}
 621
 622	if (ab->hw_params.static_window_map)
 623		ath11k_pci_select_static_window(ab_pci);
 624
 625	return 0;
 626}
 627
 628static void ath11k_pci_power_down(struct ath11k_base *ab)
 629{
 630	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 631
 632	/* restore aspm in case firmware bootup fails */
 633	ath11k_pci_aspm_restore(ab_pci);
 634
 635	ath11k_pci_force_wake(ab_pci->ab);
 636
 637	ath11k_pci_msi_disable(ab_pci);
 638
 639	ath11k_mhi_stop(ab_pci);
 640	clear_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags);
 641	ath11k_pci_sw_reset(ab_pci->ab, false);
 642}
 643
 644static int ath11k_pci_hif_suspend(struct ath11k_base *ab)
 645{
 646	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);
 647
 648	return ath11k_mhi_suspend(ar_pci);
 649}
 650
 651static int ath11k_pci_hif_resume(struct ath11k_base *ab)
 652{
 653	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);
 654
 655	return ath11k_mhi_resume(ar_pci);
 656}
 657
 658static void ath11k_pci_hif_ce_irq_enable(struct ath11k_base *ab)
 659{
 660	ath11k_pcic_ce_irqs_enable(ab);
 661}
 662
 663static void ath11k_pci_hif_ce_irq_disable(struct ath11k_base *ab)
 664{
 665	ath11k_pcic_ce_irq_disable_sync(ab);
 666}
 667
 668static int ath11k_pci_start(struct ath11k_base *ab)
 669{
 670	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 671
 672	/* TODO: for now don't restore ASPM in case of single MSI
 673	 * vector as MHI register reading in M2 causes system hang.
 674	 */
 675	if (test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags))
 676		ath11k_pci_aspm_restore(ab_pci);
 677	else
 678		ath11k_info(ab, "leaving PCI ASPM disabled to avoid MHI M2 problems\n");
 679
 680	ath11k_pcic_start(ab);
 681
 682	return 0;
 683}
 684
 685static const struct ath11k_hif_ops ath11k_pci_hif_ops = {
 686	.start = ath11k_pci_start,
 687	.stop = ath11k_pcic_stop,
 688	.read32 = ath11k_pcic_read32,
 689	.write32 = ath11k_pcic_write32,
 690	.read = ath11k_pcic_read,
 691	.power_down = ath11k_pci_power_down,
 692	.power_up = ath11k_pci_power_up,
 693	.suspend = ath11k_pci_hif_suspend,
 694	.resume = ath11k_pci_hif_resume,
 695	.irq_enable = ath11k_pcic_ext_irq_enable,
 696	.irq_disable = ath11k_pcic_ext_irq_disable,
 697	.get_msi_address =  ath11k_pcic_get_msi_address,
 698	.get_user_msi_vector = ath11k_pcic_get_user_msi_assignment,
 699	.map_service_to_pipe = ath11k_pcic_map_service_to_pipe,
 700	.ce_irq_enable = ath11k_pci_hif_ce_irq_enable,
 701	.ce_irq_disable = ath11k_pci_hif_ce_irq_disable,
 702	.get_ce_msi_idx = ath11k_pcic_get_ce_msi_idx,
 703};
 704
 705static void ath11k_pci_read_hw_version(struct ath11k_base *ab, u32 *major, u32 *minor)
 706{
 707	u32 soc_hw_version;
 708
 709	soc_hw_version = ath11k_pcic_read32(ab, TCSR_SOC_HW_VERSION);
 710	*major = FIELD_GET(TCSR_SOC_HW_VERSION_MAJOR_MASK,
 711			   soc_hw_version);
 712	*minor = FIELD_GET(TCSR_SOC_HW_VERSION_MINOR_MASK,
 713			   soc_hw_version);
 714
 715	ath11k_dbg(ab, ATH11K_DBG_PCI, "tcsr_soc_hw_version major %d minor %d\n",
 716		   *major, *minor);
 717}
 718
 719static int ath11k_pci_set_irq_affinity_hint(struct ath11k_pci *ab_pci,
 720					    const struct cpumask *m)
 721{
 722	if (test_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab_pci->ab->dev_flags))
 723		return 0;
 724
 725	return irq_set_affinity_hint(ab_pci->pdev->irq, m);
 726}
 727
 728static int ath11k_pci_probe(struct pci_dev *pdev,
 729			    const struct pci_device_id *pci_dev)
 730{
 731	struct ath11k_base *ab;
 732	struct ath11k_pci *ab_pci;
 733	u32 soc_hw_version_major, soc_hw_version_minor, addr;
 734	const struct ath11k_pci_ops *pci_ops;
 735	int ret;
 736
 737	ab = ath11k_core_alloc(&pdev->dev, sizeof(*ab_pci), ATH11K_BUS_PCI);
 738
 739	if (!ab) {
 740		dev_err(&pdev->dev, "failed to allocate ath11k base\n");
 741		return -ENOMEM;
 742	}
 743
 744	ab->dev = &pdev->dev;
 745	pci_set_drvdata(pdev, ab);
 746	ab_pci = ath11k_pci_priv(ab);
 747	ab_pci->dev_id = pci_dev->device;
 748	ab_pci->ab = ab;
 749	ab_pci->pdev = pdev;
 750	ab->hif.ops = &ath11k_pci_hif_ops;
 751	ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL;
 752	pci_set_drvdata(pdev, ab);
 753	spin_lock_init(&ab_pci->window_lock);
 754
 755	/* Set fixed_mem_region to true for platforms support reserved memory
 756	 * from DT. If memory is reserved from DT for FW, ath11k driver need not
 757	 * allocate memory.
 758	 */
 759	ret = of_property_read_u32(ab->dev->of_node, "memory-region", &addr);
 760	if (!ret)
 761		set_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags);
 762
 763	ret = ath11k_pci_claim(ab_pci, pdev);
 764	if (ret) {
 765		ath11k_err(ab, "failed to claim device: %d\n", ret);
 766		goto err_free_core;
 767	}
 768
 769	ath11k_dbg(ab, ATH11K_DBG_BOOT, "pci probe %04x:%04x %04x:%04x\n",
 770		   pdev->vendor, pdev->device,
 771		   pdev->subsystem_vendor, pdev->subsystem_device);
 772
 773	ab->id.vendor = pdev->vendor;
 774	ab->id.device = pdev->device;
 775	ab->id.subsystem_vendor = pdev->subsystem_vendor;
 776	ab->id.subsystem_device = pdev->subsystem_device;
 777
 778	switch (pci_dev->device) {
 779	case QCA6390_DEVICE_ID:
 780		ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
 781					   &soc_hw_version_minor);
 782		switch (soc_hw_version_major) {
 783		case 2:
 784			ab->hw_rev = ATH11K_HW_QCA6390_HW20;
 785			break;
 786		default:
 787			dev_err(&pdev->dev, "Unsupported QCA6390 SOC hardware version: %d %d\n",
 788				soc_hw_version_major, soc_hw_version_minor);
 789			ret = -EOPNOTSUPP;
 790			goto err_pci_free_region;
 791		}
 792
 793		pci_ops = &ath11k_pci_ops_qca6390;
 794		break;
 795	case QCN9074_DEVICE_ID:
 796		pci_ops = &ath11k_pci_ops_qcn9074;
 797		ab->hw_rev = ATH11K_HW_QCN9074_HW10;
 798		break;
 799	case WCN6855_DEVICE_ID:
 800		ab->id.bdf_search = ATH11K_BDF_SEARCH_BUS_AND_BOARD;
 801		ath11k_pci_read_hw_version(ab, &soc_hw_version_major,
 802					   &soc_hw_version_minor);
 803		switch (soc_hw_version_major) {
 804		case 2:
 805			switch (soc_hw_version_minor) {
 806			case 0x00:
 807			case 0x01:
 808				ab->hw_rev = ATH11K_HW_WCN6855_HW20;
 809				break;
 810			case 0x10:
 811			case 0x11:
 812				ab->hw_rev = ATH11K_HW_WCN6855_HW21;
 813				break;
 814			default:
 815				goto unsupported_wcn6855_soc;
 816			}
 817			break;
 818		default:
 819unsupported_wcn6855_soc:
 820			dev_err(&pdev->dev, "Unsupported WCN6855 SOC hardware version: %d %d\n",
 821				soc_hw_version_major, soc_hw_version_minor);
 822			ret = -EOPNOTSUPP;
 823			goto err_pci_free_region;
 824		}
 825
 826		pci_ops = &ath11k_pci_ops_qca6390;
 827		break;
 828	default:
 829		dev_err(&pdev->dev, "Unknown PCI device found: 0x%x\n",
 830			pci_dev->device);
 831		ret = -EOPNOTSUPP;
 832		goto err_pci_free_region;
 833	}
 834
 835	ret = ath11k_pcic_register_pci_ops(ab, pci_ops);
 836	if (ret) {
 837		ath11k_err(ab, "failed to register PCI ops: %d\n", ret);
 838		goto err_pci_free_region;
 839	}
 840
 841	ret = ath11k_pcic_init_msi_config(ab);
 842	if (ret) {
 843		ath11k_err(ab, "failed to init msi config: %d\n", ret);
 844		goto err_pci_free_region;
 845	}
 846
 847	ret = ath11k_pci_alloc_msi(ab_pci);
 848	if (ret) {
 849		ath11k_err(ab, "failed to enable msi: %d\n", ret);
 850		goto err_pci_free_region;
 851	}
 852
 853	ret = ath11k_core_pre_init(ab);
 854	if (ret)
 855		goto err_pci_disable_msi;
 856
 857	ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
 858	if (ret) {
 859		ath11k_err(ab, "failed to set irq affinity %d\n", ret);
 860		goto err_pci_disable_msi;
 861	}
 862
 863	ret = ath11k_mhi_register(ab_pci);
 864	if (ret) {
 865		ath11k_err(ab, "failed to register mhi: %d\n", ret);
 866		goto err_irq_affinity_cleanup;
 867	}
 868
 869	ret = ath11k_hal_srng_init(ab);
 870	if (ret)
 871		goto err_mhi_unregister;
 872
 873	ret = ath11k_ce_alloc_pipes(ab);
 874	if (ret) {
 875		ath11k_err(ab, "failed to allocate ce pipes: %d\n", ret);
 876		goto err_hal_srng_deinit;
 877	}
 878
 879	ath11k_pci_init_qmi_ce_config(ab);
 880
 881	ret = ath11k_pcic_config_irq(ab);
 882	if (ret) {
 883		ath11k_err(ab, "failed to config irq: %d\n", ret);
 884		goto err_ce_free;
 885	}
 886
 887	/* kernel may allocate a dummy vector before request_irq and
 888	 * then allocate a real vector when request_irq is called.
 889	 * So get msi_data here again to avoid spurious interrupt
 890	 * as msi_data will configured to srngs.
 891	 */
 892	ret = ath11k_pci_config_msi_data(ab_pci);
 893	if (ret) {
 894		ath11k_err(ab, "failed to config msi_data: %d\n", ret);
 895		goto err_free_irq;
 896	}
 897
 898	ret = ath11k_core_init(ab);
 899	if (ret) {
 900		ath11k_err(ab, "failed to init core: %d\n", ret);
 901		goto err_free_irq;
 902	}
 903	ath11k_qmi_fwreset_from_cold_boot(ab);
 904	return 0;
 905
 906err_free_irq:
 907	ath11k_pcic_free_irq(ab);
 908
 909err_ce_free:
 910	ath11k_ce_free_pipes(ab);
 911
 912err_hal_srng_deinit:
 913	ath11k_hal_srng_deinit(ab);
 914
 915err_mhi_unregister:
 916	ath11k_mhi_unregister(ab_pci);
 917
 918err_irq_affinity_cleanup:
 919	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
 920
 921err_pci_disable_msi:
 922	ath11k_pci_free_msi(ab_pci);
 923
 924err_pci_free_region:
 925	ath11k_pci_free_region(ab_pci);
 926
 927err_free_core:
 928	ath11k_core_free(ab);
 929
 930	return ret;
 931}
 932
 933static void ath11k_pci_remove(struct pci_dev *pdev)
 934{
 935	struct ath11k_base *ab = pci_get_drvdata(pdev);
 936	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 937
 938	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
 939
 940	if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) {
 941		ath11k_pci_power_down(ab);
 942		ath11k_debugfs_soc_destroy(ab);
 943		ath11k_qmi_deinit_service(ab);
 944		goto qmi_fail;
 945	}
 946
 947	set_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags);
 948
 949	ath11k_core_deinit(ab);
 950
 951qmi_fail:
 952	ath11k_mhi_unregister(ab_pci);
 953
 954	ath11k_pcic_free_irq(ab);
 955	ath11k_pci_free_msi(ab_pci);
 956	ath11k_pci_free_region(ab_pci);
 957
 958	ath11k_hal_srng_deinit(ab);
 959	ath11k_ce_free_pipes(ab);
 960	ath11k_core_free(ab);
 961}
 962
 963static void ath11k_pci_shutdown(struct pci_dev *pdev)
 964{
 965	struct ath11k_base *ab = pci_get_drvdata(pdev);
 966	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);
 967
 968	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
 969	ath11k_pci_power_down(ab);
 970}
 971
 972static __maybe_unused int ath11k_pci_pm_suspend(struct device *dev)
 973{
 974	struct ath11k_base *ab = dev_get_drvdata(dev);
 975	int ret;
 976
 977	if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) {
 978		ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot skipping pci suspend as qmi is not initialised\n");
 979		return 0;
 980	}
 981
 982	ret = ath11k_core_suspend(ab);
 983	if (ret)
 984		ath11k_warn(ab, "failed to suspend core: %d\n", ret);
 985
 986	return 0;
 987}
 988
 989static __maybe_unused int ath11k_pci_pm_resume(struct device *dev)
 990{
 991	struct ath11k_base *ab = dev_get_drvdata(dev);
 992	int ret;
 993
 994	if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) {
 995		ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot skipping pci resume as qmi is not initialised\n");
 996		return 0;
 997	}
 998
 999	ret = ath11k_core_resume(ab);
1000	if (ret)
1001		ath11k_warn(ab, "failed to resume core: %d\n", ret);
1002
1003	return ret;
1004}
1005
1006static SIMPLE_DEV_PM_OPS(ath11k_pci_pm_ops,
1007			 ath11k_pci_pm_suspend,
1008			 ath11k_pci_pm_resume);
1009
1010static struct pci_driver ath11k_pci_driver = {
1011	.name = "ath11k_pci",
1012	.id_table = ath11k_pci_id_table,
1013	.probe = ath11k_pci_probe,
1014	.remove = ath11k_pci_remove,
1015	.shutdown = ath11k_pci_shutdown,
1016#ifdef CONFIG_PM
1017	.driver.pm = &ath11k_pci_pm_ops,
1018#endif
1019};
1020
1021static int ath11k_pci_init(void)
1022{
1023	int ret;
1024
1025	ret = pci_register_driver(&ath11k_pci_driver);
1026	if (ret)
1027		pr_err("failed to register ath11k pci driver: %d\n",
1028		       ret);
1029
1030	return ret;
1031}
1032module_init(ath11k_pci_init);
1033
1034static void ath11k_pci_exit(void)
1035{
1036	pci_unregister_driver(&ath11k_pci_driver);
1037}
1038
1039module_exit(ath11k_pci_exit);
1040
1041MODULE_DESCRIPTION("Driver support for Qualcomm Technologies PCIe 802.11ax WLAN devices");
1042MODULE_LICENSE("Dual BSD/GPL");
1043
1044/* firmware files */
1045MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/*");
1046MODULE_FIRMWARE(ATH11K_FW_DIR "/QCN9074/hw1.0/*");
1047MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.0/*");
1048MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.1/*");