Changeset ae203e0d in rtems


Ignore:
Timestamp:
Apr 7, 2017, 6:31:48 AM (2 years ago)
Author:
Daniel Hellstrom <daniel@…>
Branches:
master
Children:
78e56096
Parents:
7075fb11
git-author:
Daniel Hellstrom <daniel@…> (04/07/17 06:31:48)
git-committer:
Daniel Hellstrom <daniel@…> (05/02/17 10:34:45)
Message:

leon, ambapp_bus: IRQ affinity for on-chip AMBAPP bus

Location:
c/src/lib/libbsp/sparc/shared
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus.c

    r7075fb11 rae203e0d  
    5656void ambapp_dev_info(struct drvmgr_dev *, void (*print)(void *p, char *str), void *p);
    5757
     58#ifdef RTEMS_SMP
     59int ambapp_int_set_affinity(
     60        struct drvmgr_dev *dev,
     61        int index,
     62        Processor_mask cpus);
     63#endif
     64
    5865struct drvmgr_bus_ops ambapp_bus_ops =
    5966{
     
    7178        .int_clear      = ambapp_int_clear,
    7279        .int_mask       = ambapp_int_mask,
     80#ifdef RTEMS_SMP
     81        .int_set_affinity = ambapp_int_set_affinity,
     82#endif
    7383        .int_unmask     = ambapp_int_unmask,
    7484        .get_params     = ambapp_get_params,
     
    783793        return DRVMGR_OK;
    784794}
     795
     796#ifdef RTEMS_SMP
     797int ambapp_int_set_affinity(
     798        struct drvmgr_dev *dev,
     799        int index,
     800        Processor_mask cpus)
     801{
     802        struct ambapp_priv *priv;
     803        int irq;
     804
     805        priv = dev->parent->priv;
     806
     807        /* Get IRQ number from index and device information */
     808        irq = ambapp_int_get(dev, index);
     809        if (irq < 0)
     810                return DRVMGR_EINVAL;
     811
     812        DBG("Set interrupt affinity on 0x%x for dev 0x%x (IRQ: %d)\n",
     813                (unsigned int)dev->parent->dev, (unsigned int)dev, irq);
     814
     815        if (priv->config->ops->int_set_affinity) {
     816                /* Let device override driver default */
     817                return priv->config->ops->int_set_affinity(dev, irq, cpus);
     818        } else {
     819                return DRVMGR_ENOSYS;
     820        }
     821}
     822#endif
  • c/src/lib/libbsp/sparc/shared/drvmgr/ambapp_bus_grlib.c

    r7075fb11 rae203e0d  
    4747        struct drvmgr_dev *dev,
    4848        int irq);
     49#ifdef RTEMS_SMP
     50int ambapp_grlib_int_set_affinity(
     51        struct drvmgr_dev *dev,
     52        int irq,
     53        Processor_mask cpus);
     54#endif
    4955int ambapp_grlib_get_params(
    5056        struct drvmgr_dev *dev,
     
    6470        .int_mask = ambapp_grlib_int_mask,
    6571        .int_unmask = ambapp_grlib_int_unmask,
     72#ifdef RTEMS_SMP
     73        .int_set_affinity = ambapp_grlib_int_set_affinity,
     74#endif
    6675        .get_params = ambapp_grlib_get_params
    6776};
     
    220229}
    221230
     231#ifdef RTEMS_SMP
     232int ambapp_grlib_int_set_affinity
     233        (
     234        struct drvmgr_dev *dev,
     235        int irq,
     236        Processor_mask cpus
     237        )
     238{
     239        uint32_t cpu_count = rtems_get_processor_count();
     240        uint32_t cpu_index;
     241        int enabled_cnt = 0;
     242
     243        for (cpu_index = 0; cpu_index < cpu_count; cpu_index++) {
     244                if (_Processor_mask_Is_set(cpus, cpu_index)) {
     245                        BSP_Cpu_Unmask_interrupt(irq, cpu_index);
     246                        enabled_cnt++;
     247                }
     248        }
     249
     250        /* Propagate the interrupt to all CPUs */
     251        if (enabled_cnt > 1) {
     252                LEON_Enable_interrupt_broadcast(irq);
     253        } else {
     254                LEON_Disable_interrupt_broadcast(irq);
     255        }
     256
     257        return DRVMGR_OK;
     258}
     259#endif
     260
    222261int ambapp_grlib_get_params(struct drvmgr_dev *dev, struct drvmgr_bus_params *params)
    223262{
  • c/src/lib/libbsp/sparc/shared/include/drvmgr/ambapp_bus.h

    r7075fb11 rae203e0d  
    8686        int     (*int_mask)(struct drvmgr_dev *dev, int index);
    8787        int     (*int_unmask)(struct drvmgr_dev *dev, int index);
     88#ifdef RTEMS_SMP
     89        int     (*int_set_affinity)(struct drvmgr_dev *dev, int index,
     90                                Processor_mask cpus);
     91#endif
    8892        int     (*get_params)
    8993                (struct drvmgr_dev *, struct drvmgr_bus_params *);
Note: See TracChangeset for help on using the changeset viewer.