Parcourir la source

qcacld-3.0: Add pld support for get irq by ce id

Add pld support to get irq number by ce id.

Change-Id: I31499fa12ed3176c7cf3f38e65530764f169520c
CRs-Fixed: 3381121
Venkateswara Naralasetty il y a 2 ans
Parent
commit
058c73bc44

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

@@ -1350,9 +1350,12 @@ int pld_get_irq(struct device *dev, int ce_id)
 		ret = pld_snoc_fw_sim_get_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_IPCI:
+		ret = pld_ipci_get_irq(dev, ce_id);
 		break;
 	case PLD_BUS_TYPE_PCIE_FW_SIM:
 	case PLD_BUS_TYPE_IPCI_FW_SIM:
+		ret = pld_pcie_fw_sim_get_irq(dev, ce_id);
+		break;
 	case PLD_BUS_TYPE_PCIE:
 	default:
 		ret = -EINVAL;

+ 29 - 0
core/pld/src/pld_ipci.c

@@ -617,4 +617,33 @@ int pld_ipci_get_soc_info(struct device *dev, struct pld_soc_info *info)
 
 	return 0;
 }
+
+/*
+ * pld_ipci_get_irq() - Get irq by ce_id
+ * @dev: device
+ * @ce_id: CE id for which irq is requested
+ *
+ * Return irq number.
+ *
+ * Return: irq number for success
+ *		Non zero failure code for errors
+ */
+int pld_ipci_get_irq(struct device *dev, int ce_id)
+{
+	uint32_t msi_data_start;
+	uint32_t msi_data_count;
+	uint32_t msi_irq_start;
+	uint32_t msi_data;
+	int ret;
+
+	ret = icnss_get_user_msi_assignment(dev, "CE", &msi_data_count,
+					    &msi_data_start, &msi_irq_start);
+	if (ret)
+		return ret;
+
+	msi_data = (ce_id % msi_data_count) + msi_irq_start;
+	ret = icnss_get_msi_irq(dev, msi_data);
+
+	return ret;
+}
 #endif

+ 6 - 0
core/pld/src/pld_ipci.h

@@ -210,6 +210,11 @@ static inline int pld_ipci_is_pci_ep_awake(struct device *dev)
 {
 	return 0;
 }
+
+static inline int pld_ipci_get_irq(struct device *dev, int ce_id)
+{
+	return 0;
+}
 #else
 /**
  * pld_ipci_register_driver() - Register platform device callback functions
@@ -265,6 +270,7 @@ int pld_ipci_wlan_disable(struct device *dev, enum pld_driver_mode mode);
  *         Non zero failure code for errors
  */
 int pld_ipci_get_soc_info(struct device *dev, struct pld_soc_info *info);
+int pld_ipci_get_irq(struct device *dev, int ce_id);
 
 static inline int pld_ipci_power_on(struct device *dev)
 {

+ 30 - 0
core/pld/src/pld_pcie_fw_sim.c

@@ -785,4 +785,34 @@ int pld_pcie_fw_sim_get_platform_cap(struct device *dev,
 	return 0;
 }
 
+/*
+ * pld_pcie_get_irq() - Get irq by ce_id
+ * @dev: device
+ * @ce_id: CE id for which irq is requested
+ *
+ * Return irq number.
+ *
+ * Return: irq number for success
+ *             Non zero failure code for errors
+ */
+int pld_pcie_fw_sim_get_irq(struct device *dev, int ce_id)
+{
+	uint32_t msi_data_start;
+	uint32_t msi_data_count;
+	uint32_t msi_irq_start;
+	uint32_t msi_data;
+	int ret;
+
+	ret = cnss_fw_sim_get_user_msi_assignment(dev, "CE",
+						  &msi_data_count,
+						  &msi_data_start,
+						  &msi_irq_start);
+	if (ret)
+		return ret;
+
+	msi_data = (ce_id % msi_data_count) + msi_irq_start;
+	ret = cnss_fw_sim_get_msi_irq(dev, msi_data);
+
+	return ret;
+}
 #endif

+ 6 - 0
core/pld/src/pld_pcie_fw_sim.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@@ -153,6 +154,10 @@ static inline int pld_pcie_fw_sim_exit_power_save(struct device *dev)
 	return 0;
 }
 
+static inline int pld_pcie_fw_sim_get_irq(struct device *dev, int ce_id)
+{
+	return 0;
+}
 #else
 #include <net/cnss2.h>
 
@@ -166,6 +171,7 @@ void pld_pcie_fw_sim_unregister_driver(void);
 int pld_pcie_fw_sim_get_platform_cap(struct device *dev,
 				     struct pld_platform_cap *cap);
 int pld_pcie_fw_sim_get_soc_info(struct device *dev, struct pld_soc_info *info);
+int pld_pcie_fw_sim_get_irq(struct device *dev, int ce_id);
 
 static inline int pld_pcie_fw_sim_get_user_msi_assignment(struct device *dev,
 							  char *user_name,