Explorar o código

qcacmn: Featurize support for grp irq affinity

Add a feature flag for grp irq affinity support
changes.

Change-Id: I0a97dd85369aae66450e4869b591c7af74a66960
CRs-Fixed: 3070324
Yeshwanth Sriram Guntuka %!s(int64=3) %!d(string=hai) anos
pai
achega
299b26a366

+ 8 - 0
hif/inc/hif.h

@@ -2092,6 +2092,7 @@ static inline int hif_system_pm_state_check(struct hif_opaque_softc *hif)
 }
 #endif
 
+#ifdef FEATURE_IRQ_AFFINITY
 /**
  * hif_set_grp_intr_affinity() - API to set affinity for grp
  *  intrs set in the bitmap
@@ -2104,4 +2105,11 @@ static inline int hif_system_pm_state_check(struct hif_opaque_softc *hif)
  */
 void hif_set_grp_intr_affinity(struct hif_opaque_softc *scn,
 			       uint32_t grp_intr_bitmask, bool perf);
+#else
+static inline
+void hif_set_grp_intr_affinity(struct hif_opaque_softc *scn,
+			       uint32_t grp_intr_bitmask, bool perf)
+{
+}
+#endif
 #endif /* _HIF_H_ */

+ 2 - 0
hif/src/dispatcher/dummy.c

@@ -458,7 +458,9 @@ int hif_dummy_disable_grp_irqs(struct hif_softc *scn)
 	return -EOPNOTSUPP;
 }
 
+#ifdef FEATURE_IRQ_AFFINITY
 void hif_dummy_set_grp_intr_affinity(struct hif_softc *scn,
 				     uint32_t grp_intr_bitmap, bool perf)
 {
 }
+#endif

+ 2 - 0
hif/src/dispatcher/dummy.h

@@ -96,5 +96,7 @@ int hif_dummy_enable_grp_irqs(struct hif_softc *scn);
 int hif_dummy_disable_grp_irqs(struct hif_softc *scn);
 void hif_dummy_config_irq_clear_cpu_affinity(struct hif_softc *scn,
 					     int intr_ctxt_id, int cpu);
+#ifdef FEATURE_IRQ_AFFINITY
 void hif_dummy_set_grp_intr_affinity(struct hif_softc *scn,
 				     uint32_t grp_intr_bitmask, bool perf);
+#endif

+ 4 - 0
hif/src/dispatcher/multibus.c

@@ -67,7 +67,9 @@ static void hif_initialize_default_ops(struct hif_softc *hif_sc)
 	bus_ops->hif_disable_grp_irqs = &hif_dummy_enable_grp_irqs;
 	bus_ops->hif_config_irq_clear_cpu_affinity =
 		&hif_dummy_config_irq_clear_cpu_affinity;
+#ifdef FEATURE_IRQ_AFFINITY
 	bus_ops->hif_set_grp_intr_affinity = &hif_dummy_set_grp_intr_affinity;
+#endif
 }
 
 #define NUM_OPS (sizeof(struct hif_bus_ops) / sizeof(void *))
@@ -711,6 +713,7 @@ int hif_enable_grp_irqs(struct hif_opaque_softc *scn)
 	return hif_sc->bus_ops.hif_enable_grp_irqs(hif_sc);
 }
 
+#ifdef FEATURE_IRQ_AFFINITY
 void hif_set_grp_intr_affinity(struct hif_opaque_softc *scn,
 			       uint32_t grp_intr_bitmask, bool perf)
 {
@@ -722,3 +725,4 @@ void hif_set_grp_intr_affinity(struct hif_opaque_softc *scn,
 	hif_sc->bus_ops.hif_set_grp_intr_affinity(hif_sc, grp_intr_bitmask,
 						  perf);
 }
+#endif

+ 2 - 0
hif/src/dispatcher/multibus.h

@@ -100,8 +100,10 @@ struct hif_bus_ops {
 				 unsigned int *offset);
 	int (*hif_enable_grp_irqs)(struct hif_softc *scn);
 	int (*hif_disable_grp_irqs)(struct hif_softc *scn);
+#ifdef FEATURE_IRQ_AFFINITY
 	void (*hif_set_grp_intr_affinity)(struct hif_softc *scn,
 					  uint32_t grp_intr_bitmask, bool perf);
+#endif
 };
 
 #ifdef HIF_SNOC

+ 0 - 1
hif/src/dispatcher/multibus_ahb.c

@@ -79,7 +79,6 @@ QDF_STATUS hif_initialize_ahb_ops(struct hif_bus_ops *bus_ops)
 		&hif_dummy_config_irq_affinity;
 	bus_ops->hif_config_irq_by_ceid = &hif_ahb_configure_irq_by_ceid;
 	bus_ops->hif_log_bus_info = &hif_dummy_log_bus_info;
-	bus_ops->hif_set_grp_intr_affinity = &hif_dummy_set_grp_intr_affinity;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 0 - 1
hif/src/dispatcher/multibus_ipci.c

@@ -92,7 +92,6 @@ QDF_STATUS hif_initialize_ipci_ops(struct hif_softc *hif_sc)
 	bus_ops->hif_log_bus_info = &hif_dummy_log_bus_info;
 	bus_ops->hif_enable_grp_irqs = hif_ipci_enable_grp_irqs;
 	bus_ops->hif_disable_grp_irqs = hif_ipci_disable_grp_irqs;
-	bus_ops->hif_set_grp_intr_affinity = &hif_dummy_set_grp_intr_affinity;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 0
hif/src/dispatcher/multibus_pci.c

@@ -99,7 +99,9 @@ QDF_STATUS hif_initialize_pci_ops(struct hif_softc *hif_sc)
 	bus_ops->hif_config_irq_clear_cpu_affinity =
 		&hif_pci_config_irq_clear_cpu_affinity;
 	bus_ops->hif_log_bus_info = &hif_log_pcie_info;
+#ifdef FEATURE_IRQ_AFFINITY
 	bus_ops->hif_set_grp_intr_affinity = &hif_pci_set_grp_intr_affinity;
+#endif
 
 	return QDF_STATUS_SUCCESS;
 }

+ 0 - 1
hif/src/dispatcher/multibus_snoc.c

@@ -81,7 +81,6 @@ QDF_STATUS hif_initialize_snoc_ops(struct hif_bus_ops *bus_ops)
 	bus_ops->hif_config_irq_affinity = &hif_dummy_config_irq_affinity;
 	bus_ops->hif_config_irq_by_ceid = &hif_dummy_config_irq_by_ceid;
 	bus_ops->hif_log_bus_info = &hif_dummy_log_bus_info;
-	bus_ops->hif_set_grp_intr_affinity = &hif_dummy_set_grp_intr_affinity;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 0
hif/src/dispatcher/pci_api.h

@@ -98,6 +98,7 @@ const char *hif_pci_get_irq_name(int irq_no);
 void hif_pci_config_irq_affinity(struct hif_softc *scn);
 int hif_ce_msi_configure_irq_by_ceid(struct hif_softc *scn, int ce_id);
 
+#ifdef FEATURE_IRQ_AFFINITY
 /*
  * hif_pci_set_grp_intr_affinity() - Set irq affinity hint for grp
  *  intrs based on bitmask
@@ -109,4 +110,5 @@ int hif_ce_msi_configure_irq_by_ceid(struct hif_softc *scn, int ce_id);
  */
 void hif_pci_set_grp_intr_affinity(struct hif_softc *scn,
 				   uint32_t grp_intr_bitmask, bool perf);
+#endif
 #endif /* _PCI_API_H_ */

+ 29 - 2
hif/src/hif_exec.c

@@ -593,6 +593,20 @@ void hif_latency_profile_start(struct hif_exec_context *hif_ext_group)
 #endif
 
 #ifdef FEATURE_NAPI
+#ifdef FEATURE_IRQ_AFFINITY
+static inline int32_t
+hif_is_force_napi_complete_required(struct hif_exec_context *hif_ext_group)
+{
+	return qdf_atomic_inc_not_zero(&hif_ext_group->force_napi_complete);
+}
+#else
+static inline int32_t
+hif_is_force_napi_complete_required(struct hif_exec_context *hif_ext_group)
+{
+	return 0;
+}
+#endif
+
 /**
  * hif_exec_poll() - napi poll
  * napi: napi struct
@@ -628,7 +642,7 @@ static int hif_exec_poll(struct napi_struct *napi, int budget)
 
 	actual_dones = work_done;
 
-	if (qdf_atomic_inc_not_zero(&hif_ext_group->force_napi_complete) ||
+	if (hif_is_force_napi_complete_required(hif_ext_group) ||
 	    (!hif_ext_group->force_break && work_done < normalized_budget)) {
 		hif_record_event(hif_ext_group->hif, hif_ext_group->grp_id,
 				 0, 0, 0, HIF_EVENT_BH_COMPLETE);
@@ -967,6 +981,19 @@ void hif_exec_kill(struct hif_opaque_softc *hif_ctx)
 	qdf_atomic_set(&hif_state->ol_sc.active_grp_tasklet_cnt, 0);
 }
 
+#ifdef FEATURE_IRQ_AFFINITY
+static inline void
+hif_init_force_napi_complete(struct hif_exec_context *hif_ext_group)
+{
+	qdf_atomic_init(&hif_ext_group->force_napi_complete);
+}
+#else
+static inline void
+hif_init_force_napi_complete(struct hif_exec_context *hif_ext_group)
+{
+}
+#endif
+
 /**
  * hif_register_ext_group() - API to register external group
  * interrupt handler.
@@ -1020,7 +1047,7 @@ QDF_STATUS hif_register_ext_group(struct hif_opaque_softc *hif_ctx,
 	hif_ext_group->hif = hif_ctx;
 	hif_ext_group->context_name = context_name;
 	hif_ext_group->type = type;
-	qdf_atomic_init(&hif_ext_group->force_napi_complete);
+	hif_init_force_napi_complete(hif_ext_group);
 
 	hif_state->hif_num_extgroup++;
 	return QDF_STATUS_SUCCESS;

+ 14 - 0
hif/src/hif_exec.h

@@ -76,6 +76,7 @@ struct hif_execution_ops {
  * @force_break: flag to indicate if HIF execution context was forced to return
  *		 to HIF. This means there is more work to be done. Hence do not
  *		 call napi_complete.
+ * @force_napi_complete: do a force napi_complete when this flag is set to -1
  */
 struct hif_exec_context {
 	struct hif_execution_ops *sched_ops;
@@ -107,9 +108,14 @@ struct hif_exec_context {
 	enum hif_exec_type type;
 	unsigned long long poll_start_time;
 	bool force_break;
+#if defined(FEATURE_IRQ_AFFINITY) || defined(HIF_CPU_PERF_AFFINE_MASK) || \
+	defined(HIF_CPU_CLEAR_AFFINITY)
 	/* Stores the affinity hint mask for each WLAN IRQ */
 	qdf_cpu_mask new_cpu_mask[HIF_MAX_GRP_IRQ];
+#endif
+#ifdef FEATURE_IRQ_AFFINITY
 	qdf_atomic_t force_napi_complete;
+#endif
 };
 
 /**
@@ -160,6 +166,7 @@ struct hif_exec_context *hif_exec_get_ctx(struct hif_opaque_softc *hif,
 					  uint8_t id);
 void hif_exec_kill(struct hif_opaque_softc *scn);
 
+#if defined(HIF_CPU_PERF_AFFINE_MASK) || defined(FEATURE_IRQ_AFFINITY)
 /**
  * hif_pci_irq_set_affinity_hint() - API to set IRQ affinity
  * @hif_ext_group: hif_ext_group to extract the irq info
@@ -172,6 +179,13 @@ void hif_exec_kill(struct hif_opaque_softc *scn);
  */
 void hif_pci_irq_set_affinity_hint(struct hif_exec_context *hif_ext_group,
 				   bool perf);
+#else
+static inline
+void hif_pci_irq_set_affinity_hint(struct hif_exec_context *hif_ext_group,
+				   bool perf)
+{
+}
+#endif
 
 #ifdef HIF_CPU_PERF_AFFINE_MASK
 

+ 4 - 0
hif/src/pcie/if_pci.c

@@ -3020,6 +3020,7 @@ const char *hif_pci_get_irq_name(int irq_no)
 	return "pci-dummy";
 }
 
+#if defined(FEATURE_IRQ_AFFINITY) || defined(HIF_CPU_PERF_AFFINE_MASK)
 void hif_pci_irq_set_affinity_hint(struct hif_exec_context *hif_ext_group,
 				   bool perf)
 {
@@ -3064,6 +3065,7 @@ void hif_pci_irq_set_affinity_hint(struct hif_exec_context *hif_ext_group,
 		}
 	}
 }
+#endif
 
 #ifdef HIF_CPU_PERF_AFFINE_MASK
 void hif_pci_ce_irq_set_affinity_hint(
@@ -3217,6 +3219,7 @@ int hif_pci_configure_grp_irq(struct hif_softc *scn,
 	return 0;
 }
 
+#ifdef FEATURE_IRQ_AFFINITY
 void hif_pci_set_grp_intr_affinity(struct hif_softc *scn,
 				   uint32_t grp_intr_bitmask, bool perf)
 {
@@ -3233,6 +3236,7 @@ void hif_pci_set_grp_intr_affinity(struct hif_softc *scn,
 		qdf_atomic_set(&hif_ext_group->force_napi_complete, -1);
 	}
 }
+#endif
 
 #if (defined(QCA_WIFI_QCA6390) || defined(QCA_WIFI_QCA6490) || \
 	defined(QCA_WIFI_WCN7850))