--- c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c | 38 +++++++++++++++++++++ .../libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c | 39 ++++++++++++++++++++++ .../sparc/shared/include/drvmgr/ambapp_bus.h | 4 +++ 3 files changed, 81 insertions(+)
diff --git a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c index c48d12d..c80a2ad 100644 --- a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c +++ b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c @@ -54,6 +54,13 @@ int ambapp_bus_freq_get( unsigned int *freq_hz); void ambapp_dev_info(struct drvmgr_dev *, void (*print)(void *p, char *str), void *p); +#ifdef RTEMS_SMP +int ambapp_int_set_affinity( + struct drvmgr_dev *dev, + int index, + Processor_mask cpus); +#endif + struct drvmgr_bus_ops ambapp_bus_ops = { .init = @@ -69,6 +76,9 @@ struct drvmgr_bus_ops ambapp_bus_ops = .int_unregister = ambapp_int_unregister, .int_clear = ambapp_int_clear, .int_mask = ambapp_int_mask, +#ifdef RTEMS_SMP + .int_set_affinity = ambapp_int_set_affinity, +#endif .int_unmask = ambapp_int_unmask, .get_params = ambapp_get_params, .get_freq = ambapp_bus_freq_get, @@ -781,3 +791,31 @@ int ambapp_bus_remove(struct drvmgr_bus *bus) { return DRVMGR_OK; } + +#ifdef RTEMS_SMP +int ambapp_int_set_affinity( + struct drvmgr_dev *dev, + int index, + Processor_mask cpus) +{ + struct ambapp_priv *priv; + int irq; + + priv = dev->parent->priv; + + /* Get IRQ number from index and device information */ + irq = ambapp_int_get(dev, index); + if (irq < 0) + return DRVMGR_EINVAL; + + DBG("Set interrupt affinity on 0x%x for dev 0x%x (IRQ: %d)\n", + (unsigned int)dev->parent->dev, (unsigned int)dev, irq); + + if (priv->config->ops->int_set_affinity) { + /* Let device override driver default */ + return priv->config->ops->int_set_affinity(dev, irq, cpus); + } else { + return DRVMGR_ENOSYS; + } +} +#endif diff --git a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c index b0c47ff..5305527 100644 --- a/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c +++ b/c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c @@ -46,6 +46,12 @@ int ambapp_grlib_int_mask( int ambapp_grlib_int_unmask( struct drvmgr_dev *dev, int irq); +#ifdef RTEMS_SMP +int ambapp_grlib_int_set_affinity( + struct drvmgr_dev *dev, + int irq, + Processor_mask cpus); +#endif int ambapp_grlib_get_params( struct drvmgr_dev *dev, struct drvmgr_bus_params *params); @@ -63,6 +69,9 @@ struct ambapp_ops ambapp_grlib_ops = { .int_clear = ambapp_grlib_int_clear, .int_mask = ambapp_grlib_int_mask, .int_unmask = ambapp_grlib_int_unmask, +#ifdef RTEMS_SMP + .int_set_affinity = ambapp_grlib_int_set_affinity, +#endif .get_params = ambapp_grlib_get_params }; @@ -219,6 +228,36 @@ int ambapp_grlib_int_unmask return DRVMGR_OK; } +#ifdef RTEMS_SMP +int ambapp_grlib_int_set_affinity + ( + struct drvmgr_dev *dev, + int irq, + Processor_mask cpus + ) +{ + uint32_t cpu_count = rtems_get_processor_count(); + uint32_t cpu_index; + int enabled_cnt = 0; + + for (cpu_index = 0; cpu_index < cpu_count; cpu_index++) { + if (_Processor_mask_Is_set(cpus, cpu_index)) { + BSP_Cpu_Unmask_interrupt(irq, cpu_index); + enabled_cnt++; + } + } + + /* Propagate the interrupt to all CPUs */ + if (enabled_cnt > 1) { + LEON_Enable_interrupt_broadcast(irq); + } else { + LEON_Disable_interrupt_broadcast(irq); + } + + return DRVMGR_OK; +} +#endif + int ambapp_grlib_get_params(struct drvmgr_dev *dev, struct drvmgr_bus_params *params) { /* Leave params->freq_hz untouched for default */ diff --git a/c/src/lib/libbsp/sparc/shared/include/drvmgr/ambapp_bus.h b/c/src/lib/libbsp/sparc/shared/include/drvmgr/ambapp_bus.h index 1e8dde8..ee4a152 100644 --- a/c/src/lib/libbsp/sparc/shared/include/drvmgr/ambapp_bus.h +++ b/c/src/lib/libbsp/sparc/shared/include/drvmgr/ambapp_bus.h @@ -85,6 +85,10 @@ struct ambapp_ops { int (*int_clear)(struct drvmgr_dev *dev, int index); int (*int_mask)(struct drvmgr_dev *dev, int index); int (*int_unmask)(struct drvmgr_dev *dev, int index); +#ifdef RTEMS_SMP + int (*int_set_affinity)(struct drvmgr_dev *dev, int index, + Processor_mask cpus); +#endif int (*get_params) (struct drvmgr_dev *, struct drvmgr_bus_params *); }; -- 2.7.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel