[PATCH 02/30] drvmgr: ability to configure IRQ affinity

Daniel Hellstrom daniel at gaisler.com
Thu Apr 13 19:31:11 UTC 2017


---
 cpukit/libdrvmgr/drvmgr.h        | 20 ++++++++++++++++++++
 cpukit/libdrvmgr/drvmgr_drvinf.c | 13 +++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/cpukit/libdrvmgr/drvmgr.h b/cpukit/libdrvmgr/drvmgr.h
index 194de66..a8e1c8c 100644
--- a/cpukit/libdrvmgr/drvmgr.h
+++ b/cpukit/libdrvmgr/drvmgr.h
@@ -14,6 +14,7 @@
 #include <drvmgr/drvmgr_list.h>
 #include <stdint.h>
 #include <rtems/score/basedefs.h>
+#include <rtems/score/smpimpl.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -137,6 +138,10 @@ struct drvmgr_bus_ops {
 	int	(*int_clear)(struct drvmgr_dev *, int index);
 	int	(*int_mask)(struct drvmgr_dev *, int index);
 	int	(*int_unmask)(struct drvmgr_dev *, int index);
+#ifdef RTEMS_SMP
+	int	(*int_set_affinity)(struct drvmgr_dev *, int index,
+				    Processor_mask cpus);
+#endif
 
 	/* Get Parameters */
 	int	(*get_params)(struct drvmgr_dev *, struct drvmgr_bus_params *);
@@ -628,6 +633,21 @@ extern int drvmgr_interrupt_mask(
 	struct drvmgr_dev *dev,
 	int index);
 
+/*! Force masking/disable an interrupt on the interrupt controller, this is not normally performed
+ *  since this will stop all other (shared) ISRs to be disabled until _unmask() is called.
+ *
+ *  \param dev        Device to mask interrupt for.
+ *  \param index      Index is used to identify the IRQ number if hardware has multiple IRQ sources.
+ *                    Normally Index is set to 0 to indicated the first and only IRQ source.
+ *                    A negative index is interpreted as a absolute bus IRQ number.
+ */
+#ifdef RTEMS_SMP
+extern int drvmgr_interrupt_set_affinity(
+	struct drvmgr_dev *dev,
+	int index,
+	Processor_mask cpus);
+#endif
+
 /*! drvmgr_translate() translation options */
 enum drvmgr_tr_opts {
 	/* Translate CPU RAM Address (input) to DMA unit accessible address
diff --git a/cpukit/libdrvmgr/drvmgr_drvinf.c b/cpukit/libdrvmgr/drvmgr_drvinf.c
index e0cd50d..5bb6e6e 100644
--- a/cpukit/libdrvmgr/drvmgr_drvinf.c
+++ b/cpukit/libdrvmgr/drvmgr_drvinf.c
@@ -138,6 +138,19 @@ int drvmgr_interrupt_mask(
 	return dev->parent->ops->int_mask(dev, index);
 }
 
+#ifdef RTEMS_SMP
+int drvmgr_interrupt_set_affinity(
+	struct drvmgr_dev *dev,
+	int index,
+	Processor_mask cpus)
+{
+	if (!dev || !dev->parent || !dev->parent->ops->int_set_affinity)
+		return -1;
+
+	return dev->parent->ops->int_set_affinity(dev, index, cpus);
+}
+#endif
+
 int drvmgr_on_rootbus(struct drvmgr_dev *dev)
 {
 	if (dev->parent && dev->parent->dev && dev->parent->dev->parent)
-- 
2.7.4




More information about the devel mailing list