Răsfoiți Sursa

qcacld-3.0: Moselle changes for WHUNT simulation support

Add PLD layer and config changes for simulating
IPCI virtual device in WHUNT.

Change-Id: Ia07ce0884f0e5ffe9b4d23977476c1789390e1c9
CRs-Fixed: 2648150
Karthik Kantamneni 5 ani în urmă
părinte
comite
06a63cafdd

+ 6 - 0
Kbuild

@@ -1979,6 +1979,9 @@ PLD_INC :=	-I$(WLAN_ROOT)/$(PLD_INC_DIR) \
 
 PLD_OBJS :=	$(PLD_SRC_DIR)/pld_common.o
 
+ifeq ($(CONFIG_IPCIE_FW_SIM), y)
+PLD_OBJS +=     $(PLD_SRC_DIR)/pld_pcie_fw_sim.o
+endif
 ifeq ($(CONFIG_PCIE_FW_SIM), y)
 PLD_OBJS +=     $(PLD_SRC_DIR)/pld_pcie_fw_sim.o
 else ifeq ($(CONFIG_HIF_PCI), y)
@@ -2335,6 +2338,9 @@ cppflags-$(CONFIG_FEATURE_COEX) += -DFEATURE_COEX
 cppflags-$(CONFIG_PLD_IPCI_ICNSS_FLAG) += -DCONFIG_PLD_IPCI_ICNSS
 cppflags-$(CONFIG_PLD_SDIO_CNSS_FLAG) += -DCONFIG_PLD_SDIO_CNSS
 
+ifeq ($(CONFIG_IPCIE_FW_SIM), y)
+cppflags-y += -DCONFIG_PLD_IPCIE_FW_SIM
+endif
 ifeq ($(CONFIG_PLD_PCIE_CNSS_FLAG), y)
 ifeq ($(CONFIG_PCIE_FW_SIM), y)
 cppflags-y += -DCONFIG_PLD_PCIE_FW_SIM

+ 8 - 0
configs/default_defconfig

@@ -76,19 +76,27 @@ ifdef CONFIG_ICNSS2
 	CONFIG_ROME_IF = ipci
 endif
 
+ifdef CONFIG_IPCIE_FW_SIM
+	CONFIG_ROME_IF = ipci
+endif
+
 ifeq (y,$(findstring y,$(CONFIG_CNSS) $(CONFIG_CNSS2)))
 ifndef CONFIG_ROME_IF
 	#use pci as default interface
+ifndef CONFIG_IPCIE_FW_SIM
 	CONFIG_ROME_IF = pci
 endif
 endif
+endif
 
 ifeq (m,$(findstring m,$(CONFIG_CNSS2)))
 ifndef CONFIG_ROME_IF
 	#use pci as default interface
+ifndef CONFIG_IPCIE_FW_SIM
 	CONFIG_ROME_IF = pci
 endif
 endif
+endif
 
 # Make WLAN as open-source driver by default
 WLAN_OPEN_SOURCE := y

+ 1 - 0
core/hdd/src/wlan_hdd_driver_ops.c

@@ -245,6 +245,7 @@ static enum qdf_bus_type to_bus_type(enum pld_bus_type bus_type)
 		return QDF_BUS_TYPE_SDIO;
 	case PLD_BUS_TYPE_USB:
 		return QDF_BUS_TYPE_USB;
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 		return QDF_BUS_TYPE_IPCI;
 	default:

+ 2 - 0
core/pld/inc/pld_common.h

@@ -52,6 +52,7 @@
  * @PLD_BUS_TYPE_SNOC_FW_SIM : SNOC FW SIM bus
  * @PLD_BUS_TYPE_PCIE_FW_SIM : PCIE FW SIM bus
  * @PLD_BUS_TYPE_IPCI : IPCI bus
+ * @PLD_BUS_TYPE_IPCI_FW_SIM : IPCI FW SIM bus
  */
 enum pld_bus_type {
 	PLD_BUS_TYPE_NONE = -1,
@@ -62,6 +63,7 @@ enum pld_bus_type {
 	PLD_BUS_TYPE_SNOC_FW_SIM,
 	PLD_BUS_TYPE_PCIE_FW_SIM,
 	PLD_BUS_TYPE_IPCI,
+	PLD_BUS_TYPE_IPCI_FW_SIM,
 };
 
 #define PLD_MAX_FIRMWARE_SIZE (1 * 1024 * 1024)

+ 65 - 0
core/pld/src/pld_common.c

@@ -415,6 +415,7 @@ int pld_wlan_enable(struct device *dev, struct pld_wlan_enable_cfg *config,
 						  QWLAN_VERSIONSTR);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_wlan_enable(dev, config, mode,
 						  QWLAN_VERSIONSTR);
 		break;
@@ -462,6 +463,7 @@ int pld_wlan_disable(struct device *dev, enum pld_driver_mode mode)
 		ret = pld_snoc_fw_sim_wlan_disable(dev, mode);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_wlan_disable(dev, mode);
 		break;
 	case PLD_BUS_TYPE_SDIO:
@@ -499,6 +501,7 @@ int pld_set_fw_log_mode(struct device *dev, u8 fw_log_mode)
 		ret = pld_snoc_set_fw_log_mode(dev, fw_log_mode);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SDIO:
 		break;
@@ -566,6 +569,7 @@ int pld_get_fw_files_for_target(struct device *dev,
 						       target_version);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -646,6 +650,7 @@ void pld_is_pci_link_down(struct device *dev)
 {
 	switch (pld_get_bus_type(dev)) {
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		pld_pcie_link_down(dev);
@@ -677,6 +682,7 @@ void pld_schedule_recovery_work(struct device *dev,
 		pld_pcie_schedule_recovery_work(dev, reason);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -708,6 +714,7 @@ int pld_wlan_pm_control(struct device *dev, bool vote)
 		ret = pld_pcie_wlan_pm_control(dev, vote);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -739,6 +746,7 @@ void *pld_get_virt_ramdump_mem(struct device *dev, unsigned long *size)
 		mem = pld_pcie_get_virt_ramdump_mem(dev, size);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -761,6 +769,7 @@ void pld_release_virt_ramdump_mem(struct device *dev, void *address)
 		pld_pcie_release_virt_ramdump_mem(address);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -790,6 +799,7 @@ void pld_device_crashed(struct device *dev)
 		pld_pcie_device_crashed(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -819,6 +829,7 @@ void pld_device_self_recovery(struct device *dev,
 		pld_pcie_device_self_recovery(dev, reason);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -848,6 +859,7 @@ void pld_intr_notify_q6(struct device *dev)
 		pld_pcie_intr_notify_q6(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -874,6 +886,7 @@ void pld_request_pm_qos(struct device *dev, u32 qos_val)
 		pld_pcie_request_pm_qos(dev, qos_val);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -905,6 +918,7 @@ void pld_remove_pm_qos(struct device *dev)
 		pld_pcie_remove_pm_qos(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -938,6 +952,7 @@ int pld_request_bus_bandwidth(struct device *dev, int bandwidth)
 		ret = pld_pcie_request_bus_bandwidth(dev, bandwidth);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -973,6 +988,7 @@ int pld_get_platform_cap(struct device *dev, struct pld_platform_cap *cap)
 		ret = pld_pcie_get_platform_cap(dev, cap);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_get_platform_cap(dev, cap);
 		break;
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
@@ -1014,6 +1030,7 @@ int pld_get_sha_hash(struct device *dev, const u8 *data,
 					    hash_idx, out);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -1044,6 +1061,7 @@ void *pld_get_fw_ptr(struct device *dev)
 		ptr = pld_pcie_get_fw_ptr(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -1074,6 +1092,7 @@ int pld_auto_suspend(struct device *dev)
 		ret = pld_pcie_auto_suspend(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -1105,6 +1124,7 @@ int pld_auto_resume(struct device *dev)
 		ret = pld_pcie_auto_resume(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 		break;
@@ -1137,6 +1157,7 @@ int pld_force_wake_request(struct device *dev)
 		ret = pld_pcie_force_wake_request(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_SDIO:
@@ -1170,6 +1191,7 @@ int pld_is_device_awake(struct device *dev)
 		ret = pld_pcie_is_device_awake(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_SDIO:
@@ -1202,6 +1224,7 @@ int pld_force_wake_release(struct device *dev)
 		ret = pld_pcie_force_wake_release(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_SDIO:
@@ -1245,6 +1268,7 @@ int pld_ce_request_irq(struct device *dev, unsigned int ce_id,
 						     handler, flags, name, ctx);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 		break;
 	case PLD_BUS_TYPE_IPCI:
@@ -1278,6 +1302,7 @@ int pld_ce_free_irq(struct device *dev, unsigned int ce_id, void *ctx)
 		ret = pld_snoc_fw_sim_ce_free_irq(dev, ce_id, ctx);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 		break;
 	case PLD_BUS_TYPE_IPCI:
@@ -1307,6 +1332,7 @@ void pld_enable_irq(struct device *dev, unsigned int ce_id)
 		pld_snoc_fw_sim_enable_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -1335,6 +1361,7 @@ void pld_disable_irq(struct device *dev, unsigned int ce_id)
 		pld_snoc_fw_sim_disable_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -1368,6 +1395,7 @@ int pld_get_soc_info(struct device *dev, struct pld_soc_info *info)
 		ret = pld_snoc_fw_sim_get_soc_info(dev, info);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_get_soc_info(dev, info);
 		break;
 	case PLD_BUS_TYPE_PCIE:
@@ -1408,6 +1436,7 @@ int pld_get_ce_id(struct device *dev, int irq)
 		ret = pld_pcie_get_ce_id(dev, irq);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -1440,6 +1469,7 @@ int pld_get_irq(struct device *dev, int ce_id)
 	case PLD_BUS_TYPE_IPCI:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 	default:
 		ret = -EINVAL;
@@ -1462,6 +1492,7 @@ void pld_lock_pm_sem(struct device *dev)
 		pld_pcie_lock_pm_sem(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -1489,6 +1520,7 @@ void pld_release_pm_sem(struct device *dev)
 		pld_pcie_release_pm_sem(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -1519,6 +1551,7 @@ void pld_lock_reg_window(struct device *dev, unsigned long *flags)
 		pld_pcie_lock_reg_window(dev, flags);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -1549,6 +1582,7 @@ void pld_unlock_reg_window(struct device *dev, unsigned long *flags)
 		pld_pcie_unlock_reg_window(dev, flags);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_IPCI:
@@ -1582,6 +1616,7 @@ int pld_power_on(struct device *dev)
 		 */
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_SNOC:
@@ -1617,6 +1652,7 @@ int pld_power_off(struct device *dev)
 		 */
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_SNOC:
@@ -1666,6 +1702,7 @@ int pld_athdiag_read(struct device *dev, uint32_t offset,
 					   datalen, output);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -1710,6 +1747,7 @@ int pld_athdiag_write(struct device *dev, uint32_t offset,
 					    datalen, input);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -1741,6 +1779,7 @@ void *pld_smmu_get_domain(struct device *dev)
 		ptr = pld_pcie_smmu_get_domain(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_IPCI:
@@ -1774,6 +1813,7 @@ void *pld_smmu_get_mapping(struct device *dev)
 		ptr = pld_snoc_smmu_get_mapping(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_IPCI:
@@ -1811,6 +1851,7 @@ int pld_smmu_map(struct device *dev, phys_addr_t paddr,
 		ret = pld_snoc_smmu_map(dev, paddr, iova_addr, size);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_IPCI:
@@ -1891,6 +1932,7 @@ int pld_get_user_msi_assignment(struct device *dev, char *user_name,
 						       base_vector);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_get_user_msi_assignment(dev, user_name,
 							      num_vectors,
 							      user_base_data,
@@ -1943,6 +1985,7 @@ int pld_srng_request_irq(struct device *dev, int irq, irq_handler_t handler,
 		ret = request_irq(irq, handler, irqflags, devname, dev_data);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_request_irq(dev, irq, handler,
 						  irqflags, devname,
 						  dev_data);
@@ -1988,6 +2031,7 @@ int pld_srng_free_irq(struct device *dev, int irq, void *dev_data)
 		free_irq(irq, dev_data);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_free_irq(dev, irq, dev_data);
 		break;
 	case PLD_BUS_TYPE_SNOC:
@@ -2023,6 +2067,7 @@ void pld_srng_enable_irq(struct device *dev, int irq)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		pld_pcie_fw_sim_enable_irq(dev, irq);
 		break;
 	case PLD_BUS_TYPE_PCIE:
@@ -2053,6 +2098,7 @@ void pld_srng_disable_irq(struct device *dev, int irq)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		pld_pcie_fw_sim_disable_irq(dev, irq);
 		break;
 	case PLD_BUS_TYPE_PCIE:
@@ -2087,6 +2133,7 @@ int pld_pci_read_config_word(struct pci_dev *pdev, int offset, uint16_t *val)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_IPCI:
 		break;
@@ -2121,6 +2168,7 @@ int pld_pci_write_config_word(struct pci_dev *pdev, int offset, uint16_t val)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pci_write_config_word(pdev, offset, val);
@@ -2155,6 +2203,7 @@ int pld_pci_read_config_dword(struct pci_dev *pdev, int offset, uint32_t *val)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pci_read_config_dword(pdev, offset, val);
@@ -2189,6 +2238,7 @@ int pld_pci_write_config_dword(struct pci_dev *pdev, int offset, uint32_t val)
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pci_write_config_dword(pdev, offset, val);
@@ -2223,6 +2273,7 @@ int pld_get_msi_irq(struct device *dev, unsigned int vector)
 		ret = pld_pcie_get_msi_irq(dev, vector);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = pld_pcie_fw_sim_get_msi_irq(dev, vector);
 		break;
 	case PLD_BUS_TYPE_SNOC:
@@ -2262,6 +2313,7 @@ void pld_get_msi_address(struct device *dev, uint32_t *msi_addr_low,
 		pld_pcie_get_msi_address(dev, msi_addr_low, msi_addr_high);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		pld_pcie_fw_sim_get_msi_address(dev, msi_addr_low,
 						msi_addr_high);
 		break;
@@ -2298,6 +2350,7 @@ int pld_is_drv_connected(struct device *dev)
 		ret = pld_pcie_is_drv_connected(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_SDIO:
@@ -2329,6 +2382,7 @@ unsigned int pld_socinfo_get_serial_number(struct device *dev)
 		ret = pld_snoc_socinfo_get_serial_number(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 		pr_err("Not supported on type %d\n", type);
 		break;
@@ -2366,6 +2420,7 @@ int pld_is_qmi_disable(struct device *dev)
 	case PLD_BUS_TYPE_IPCI:
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_PCIE:
 	case PLD_BUS_TYPE_SDIO:
 		pr_err("Not supported on type %d\n", type);
@@ -2405,6 +2460,7 @@ int pld_is_fw_down(struct device *dev)
 		ret = pld_snoc_fw_sim_is_fw_down(dev);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		break;
 	case PLD_BUS_TYPE_PCIE:
 		ret = pld_pcie_is_fw_down(dev);
@@ -2446,6 +2502,7 @@ int pld_force_assert_target(struct device *dev)
 	case PLD_BUS_TYPE_PCIE:
 		return pld_pcie_force_assert_target(dev);
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		return -EOPNOTSUPP;
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SDIO:
@@ -2474,6 +2531,7 @@ int pld_collect_rddm(struct device *dev)
 	case PLD_BUS_TYPE_PCIE:
 		return pld_pcie_collect_rddm(dev);
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_SNOC:
 	case PLD_BUS_TYPE_SDIO:
@@ -2595,6 +2653,7 @@ bool pld_is_fw_dump_skipped(struct device *dev)
 		ret = pld_sdio_is_fw_dump_skipped();
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 	default:
@@ -2613,6 +2672,7 @@ int pld_is_pdr(struct device *dev)
 		ret = pld_snoc_is_pdr();
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 	default:
@@ -2631,6 +2691,7 @@ int pld_is_fw_rejuvenate(struct device *dev)
 		ret = pld_snoc_is_fw_rejuvenate();
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_IPCI:
 	default:
@@ -2648,6 +2709,7 @@ bool pld_have_platform_driver_support(struct device *dev)
 		ret = pld_pcie_platform_driver_support();
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 		ret = true;
 		break;
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
@@ -2687,6 +2749,7 @@ int pld_idle_shutdown(struct device *dev,
 			errno = pld_pcie_idle_shutdown(dev);
 			break;
 		case PLD_BUS_TYPE_PCIE_FW_SIM:
+		case PLD_BUS_TYPE_IPCI_FW_SIM:
 			errno = pld_pcie_fw_sim_idle_shutdown(dev);
 			break;
 		case PLD_BUS_TYPE_SNOC_FW_SIM:
@@ -2723,6 +2786,7 @@ int pld_idle_restart(struct device *dev,
 			errno = pld_pcie_idle_restart(dev);
 			break;
 		case PLD_BUS_TYPE_PCIE_FW_SIM:
+		case PLD_BUS_TYPE_IPCI_FW_SIM:
 			errno = pld_pcie_fw_sim_idle_restart(dev);
 			break;
 		case PLD_BUS_TYPE_SNOC_FW_SIM:
@@ -2766,6 +2830,7 @@ int pld_get_audio_wlan_timestamp(struct device *dev,
 	case PLD_BUS_TYPE_PCIE:
 	case PLD_BUS_TYPE_SNOC_FW_SIM:
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_IPCI_FW_SIM:
 	case PLD_BUS_TYPE_SDIO:
 	case PLD_BUS_TYPE_USB:
 	case PLD_BUS_TYPE_IPCI:

+ 254 - 2
core/pld/src/pld_pcie_fw_sim.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -24,7 +24,7 @@
 
 #include "pld_pcie_fw_sim.h"
 
-#ifdef CONFIG_PLD_PCIE_FW_SIM
+#if defined(CONFIG_PLD_PCIE_FW_SIM) || defined(CONFIG_PLD_IPCIE_FW_SIM)
 
 #ifdef QCA_WIFI_3_0_ADRASTEA
 #define CE_COUNT_MAX 12
@@ -32,6 +32,255 @@
 #define CE_COUNT_MAX 8
 #endif
 
+#endif
+
+#ifdef CONFIG_PLD_IPCIE_FW_SIM
+/**
+ * pld_pcie_fw_sim_probe() - Probe function for PCIE platform driver
+ * @pdev: PCIE device
+ * @id: PCIE device ID table
+ *
+ * The probe function will be called when PCIE device provided
+ * in the ID table is detected.
+ *
+ * Return: int
+ */
+static int pld_pcie_fw_sim_probe(struct pci_dev *pdev,
+				 const struct pci_device_id *id)
+{
+	struct pld_context *pld_context;
+	int ret = 0;
+
+	pld_context = pld_get_global_context();
+	if (!pld_context) {
+		ret = -ENODEV;
+		goto out;
+	}
+
+	ret = pld_add_dev(pld_context, &pdev->dev, NULL,
+			  PLD_BUS_TYPE_IPCI_FW_SIM);
+	if (ret)
+		goto out;
+
+	return pld_context->ops->probe(&pdev->dev,
+		       PLD_BUS_TYPE_IPCI_FW_SIM, NULL, NULL);
+
+out:
+	return ret;
+}
+
+/**
+ * pld_pcie_fw_sim_remove() - Remove function for PCIE device
+ * @pdev: PCIE device
+ *
+ * The remove function will be called when PCIE device is disconnected
+ *
+ * Return: void
+ */
+static void pld_pcie_fw_sim_remove(struct pci_dev *pdev)
+{
+	struct pld_context *pld_context;
+	int errno;
+	struct osif_psoc_sync *psoc_sync;
+
+	errno = osif_psoc_sync_trans_start_wait(&pdev->dev, &psoc_sync);
+	if (errno)
+		return;
+
+	osif_psoc_sync_unregister(&pdev->dev);
+	osif_psoc_sync_wait_for_ops(psoc_sync);
+
+	pld_context = pld_get_global_context();
+
+	if (!pld_context)
+		goto out;
+
+	pld_context->ops->remove(&pdev->dev, PLD_BUS_TYPE_IPCI_FW_SIM);
+
+	pld_del_dev(pld_context, &pdev->dev);
+
+out:
+	osif_psoc_sync_trans_stop(psoc_sync);
+	osif_psoc_sync_destroy(psoc_sync);
+}
+
+/**
+ * pld_pcie_fw_sim_idle_restart_cb() - Perform idle restart
+ * @pdev: PCIE device
+ * @id: PCIE device ID
+ *
+ * This function will be called if there is an idle restart request
+ *
+ * Return: int
+ */
+static int pld_pcie_fw_sim_idle_restart_cb(struct pci_dev *pdev,
+					   const struct pci_device_id *id)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->idle_restart)
+		return pld_context->ops->idle_restart(&pdev->dev,
+						      PLD_BUS_TYPE_IPCI_FW_SIM);
+
+	return -ENODEV;
+}
+
+/**
+ * pld_pcie_fw_sim_idle_shutdown_cb() - Perform idle shutdown
+ * @pdev: PCIE device
+ * @id: PCIE device ID
+ *
+ * This function will be called if there is an idle shutdown request
+ *
+ * Return: int
+ */
+static int pld_pcie_fw_sim_idle_shutdown_cb(struct pci_dev *pdev)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->shutdown)
+		return pld_context->ops->idle_shutdown(&pdev->dev,
+						PLD_BUS_TYPE_IPCI_FW_SIM);
+
+	return -ENODEV;
+}
+
+/**
+ * pld_pcie_fw_sim_reinit() - SSR re-initialize function for PCIE device
+ * @pdev: PCIE device
+ * @id: PCIE device ID
+ *
+ * During subsystem restart(SSR), this function will be called to
+ * re-initialize pcie device.
+ *
+ * Return: int
+ */
+static int pld_pcie_fw_sim_reinit(struct pci_dev *pdev,
+				  const struct pci_device_id *id)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->reinit)
+		return pld_context->ops->reinit(&pdev->dev,
+				PLD_BUS_TYPE_IPCI_FW_SIM, NULL, NULL);
+
+	return -ENODEV;
+}
+
+/**
+ * pld_pcie_fw_sim_shutdown() - SSR shutdown function for PCIE device
+ * @pdev: PCIE device
+ *
+ * During SSR, this function will be called to shutdown PCIE device.
+ *
+ * Return: void
+ */
+static void pld_pcie_fw_sim_shutdown(struct pci_dev *pdev)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->shutdown)
+		pld_context->ops->shutdown(&pdev->dev,
+						PLD_BUS_TYPE_IPCI_FW_SIM);
+}
+
+/**
+ * pld_pcie_fw_sim_crash_shutdown() - Crash shutdown function for PCIE device
+ * @pdev: PCIE device
+ *
+ * This function will be called when a crash is detected, it will shutdown
+ * the PCIE device.
+ *
+ * Return: void
+ */
+static void pld_pcie_fw_sim_crash_shutdown(struct pci_dev *pdev)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->crash_shutdown)
+		pld_context->ops->crash_shutdown(&pdev->dev,
+						PLD_BUS_TYPE_IPCI_FW_SIM);
+}
+
+/**
+ * pld_pcie_fw_sim_notify_handler() - Modem state notification callback function
+ * @pdev: PCIE device
+ * @state: modem power state
+ *
+ * This function will be called when there's a modem power state change.
+ *
+ * Return: void
+ */
+static void pld_pcie_fw_sim_notify_handler(struct pci_dev *pdev, int state)
+{
+	struct pld_context *pld_context;
+
+	pld_context = pld_get_global_context();
+	if (pld_context->ops->modem_status)
+		pld_context->ops->modem_status(&pdev->dev,
+					       PLD_BUS_TYPE_IPCI_FW_SIM, state);
+}
+
+/**
+ * pld_pcie_fw_sim_uevent() - update wlan driver status callback function
+ * @pdev: PCIE device
+ * @status driver uevent status
+ *
+ * This function will be called when platform driver wants to update wlan
+ * driver's status.
+ *
+ * Return: void
+ */
+static void pld_pcie_fw_sim_uevent(struct pci_dev *pdev, uint32_t status)
+{
+	struct pld_context *pld_context;
+	struct pld_uevent_data data;
+
+	pld_context = pld_get_global_context();
+	if (!pld_context)
+		return;
+
+	switch (status) {
+	case CNSS_RECOVERY:
+		data.uevent = PLD_FW_RECOVERY_START;
+		break;
+	case CNSS_FW_DOWN:
+		data.uevent = PLD_FW_DOWN;
+		break;
+	default:
+		goto out;
+	}
+
+	if (pld_context->ops->uevent)
+		pld_context->ops->uevent(&pdev->dev, &data);
+
+out:
+	return;
+}
+
+static struct pci_device_id pld_pcie_fw_sim_id_table[] = {
+	{ 0x168c, 0x003c, PCI_ANY_ID, PCI_ANY_ID },
+	{ 0x168c, 0x003e, PCI_ANY_ID, PCI_ANY_ID },
+	{ 0x168c, 0x0041, PCI_ANY_ID, PCI_ANY_ID },
+	{ 0x168c, 0xabcd, PCI_ANY_ID, PCI_ANY_ID },
+	{ 0x168c, 0x7021, PCI_ANY_ID, PCI_ANY_ID },
+	{ 0 }
+};
+
+#ifdef MULTI_IF_NAME
+#define PLD_PCIE_FW_SIM_OPS_NAME "pld_ipcie_fw_sim_" MULTI_IF_NAME
+#else
+#define PLD_PCIE_FW_SIM_OPS_NAME "pld_ipcie_fw_sim"
+#endif
+
+#endif
+
+#ifdef CONFIG_PLD_PCIE_FW_SIM
 /**
  * pld_pcie_fw_sim_probe() - Probe function for PCIE platform driver
  * @pdev: PCIE device
@@ -275,6 +524,9 @@ static struct pci_device_id pld_pcie_fw_sim_id_table[] = {
 #define PLD_PCIE_FW_SIM_OPS_NAME "pld_pcie_fw_sim"
 #endif
 
+#endif
+
+#if defined(CONFIG_PLD_PCIE_FW_SIM) || defined(CONFIG_PLD_IPCIE_FW_SIM)
 struct cnss_wlan_driver pld_pcie_fw_sim_ops = {
 	.name       = PLD_PCIE_FW_SIM_OPS_NAME,
 	.id_table   = pld_pcie_fw_sim_id_table,

+ 2 - 2
core/pld/src/pld_pcie_fw_sim.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -21,7 +21,7 @@
 
 #include "pld_internal.h"
 
-#ifndef CONFIG_PLD_PCIE_FW_SIM
+#if !defined(CONFIG_PLD_PCIE_FW_SIM) && !defined(CONFIG_PLD_IPCIE_FW_SIM)
 
 static inline int pld_pcie_fw_sim_register_driver(void)
 {