示例#1
0
rtems_status_code qoriq_pic_set_priority(
    rtems_vector_number vector,
    int new_priority,
    int *old_priority
)
{
    rtems_status_code sc = RTEMS_SUCCESSFUL;
    uint32_t old_vpr = 0;

    if (bsp_interrupt_is_valid_vector(vector)) {
        int offs = vpr_and_dr_offsets [vector] << 2;
        volatile uint32_t *vpr = (volatile uint32_t *) &qoriq.pic + offs;

        if (QORIQ_PIC_PRIORITY_IS_VALID(new_priority)) {
            rtems_interrupt_level level;

            rtems_interrupt_disable(level);
            old_vpr = *vpr;
            *vpr = VPR_PRIORITY_SET(old_vpr, (uint32_t) new_priority);
            rtems_interrupt_enable(level);
        } else if (new_priority < 0) {
            old_vpr = *vpr;
        } else {
            sc = RTEMS_INVALID_PRIORITY;
        }
    } else {
        sc = RTEMS_INVALID_ID;
    }

    if (old_priority != NULL) {
        *old_priority = (int) VPR_PRIORITY_GET(old_vpr);
    }

    return sc;
}
示例#2
0
rtems_status_code qoriq_pic_set_priority(
    rtems_vector_number vector,
    int new_priority,
    int *old_priority
)
{
    rtems_status_code sc = RTEMS_SUCCESSFUL;
    uint32_t old_vpr = 0;

    if (bsp_interrupt_is_valid_vector(vector)) {
        volatile qoriq_pic_src_cfg *src_cfg = get_src_cfg(vector);

        if (QORIQ_PIC_PRIORITY_IS_VALID(new_priority)) {
            rtems_interrupt_lock_context lock_context;

            rtems_interrupt_lock_acquire(&lock, &lock_context);
            old_vpr = src_cfg->vpr;
            src_cfg->vpr = VPR_PRIORITY_SET(old_vpr, (uint32_t) new_priority);
            rtems_interrupt_lock_release(&lock, &lock_context);
        } else if (new_priority < 0) {
            old_vpr = src_cfg->vpr;
        } else {
            sc = RTEMS_INVALID_PRIORITY;
        }
    } else {
        sc = RTEMS_INVALID_ID;
    }

    if (old_priority != NULL) {
        *old_priority = (int) VPR_PRIORITY_GET(old_vpr);
    }

    return sc;
}