diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-12-03 22:39:46 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-12-03 22:39:46 +0000 |
commit | d3b840b86942eb097df72b1c2e30bb0f82998c2a (patch) | |
tree | 74fda73d50f1e0b68d29c73e3a7b9a00dc130538 /c/src/lib/libbsp/powerpc/shared/irq | |
parent | 2007-12-03 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | rtems-d3b840b86942eb097df72b1c2e30bb0f82998c2a.tar.bz2 |
2007-12-03 Joel Sherrill <joel.sherrill@oarcorp.com>
* shared/irq/irq.c: Spacing.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/irq')
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/irq/irq.c | 433 |
1 files changed, 215 insertions, 218 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/irq/irq.c b/c/src/lib/libbsp/powerpc/shared/irq/irq.c index d613d6bdaa..a4e868b73d 100644 --- a/c/src/lib/libbsp/powerpc/shared/irq/irq.c +++ b/c/src/lib/libbsp/powerpc/shared/irq/irq.c @@ -1,6 +1,7 @@ /* * - * This file contains the PIC-independent implementation of the functions described in irq.h + * This file contains the PIC-independent implementation of the + * functions described in irq.h * * Copyright (C) 1998, 1999 valette@crf.canon.fr * @@ -31,14 +32,14 @@ extern void decrementer_exception_vector_prolog_code(); /* * default handler connected on each irq after bsp initialization */ -static rtems_irq_connect_data default_rtems_entry; +static rtems_irq_connect_data default_rtems_entry; /* * location used to store initial tables used for interrupt * management. */ -static rtems_irq_global_settings* internal_config; -static rtems_irq_connect_data* rtems_hdl_tbl; +static rtems_irq_global_settings* internal_config; +static rtems_irq_connect_data* rtems_hdl_tbl; /* * ------------------------ RTEMS Irq helper functions ---------------- @@ -51,218 +52,212 @@ static rtems_irq_connect_data* rtems_hdl_tbl; static int isValidInterrupt(int irq) { - if ( (irq < internal_config->irqBase) || (irq >= internal_config->irqBase + internal_config->irqNb)) + if ( (irq < internal_config->irqBase) || + (irq >= internal_config->irqBase + internal_config->irqNb)) return 0; return 1; } /* - * ------------------------ RTEMS Shared Irq Handler Mngt Routines ---------------- + * ------------------- RTEMS Shared Irq Handler Mngt Routines ------------ */ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) { - rtems_interrupt_level level; - rtems_irq_connect_data* vchain; + rtems_interrupt_level level; + rtems_irq_connect_data* vchain; - if (!isValidInterrupt(irq->name)) { - printk("Invalid interrupt vector %d\n",irq->name); - return 0; - } + if (!isValidInterrupt(irq->name)) { + printk("Invalid interrupt vector %d\n",irq->name); + return 0; + } - rtems_interrupt_disable(level); + rtems_interrupt_disable(level); - if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) { - rtems_interrupt_enable(level); - printk("IRQ vector %d already connected to an unshared handler\n",irq->name); - return 0; - } + if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) { + rtems_interrupt_enable(level); + printk( + "IRQ vector %d already connected to an unshared handler\n", + irq->name + ); + return 0; + } - vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data)); + vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data)); - /* save off topmost handler */ - vchain[0]= rtems_hdl_tbl[irq->name]; + /* save off topmost handler */ + vchain[0]= rtems_hdl_tbl[irq->name]; - /* - * store the data provided by user - */ - rtems_hdl_tbl[irq->name] = *irq; + /* + * store the data provided by user + */ + rtems_hdl_tbl[irq->name] = *irq; - /* link chain to new topmost handler */ - rtems_hdl_tbl[irq->name].next_handler = (void *)vchain; + /* link chain to new topmost handler */ + rtems_hdl_tbl[irq->name].next_handler = (void *)vchain; - /* - * enable_irq_at_pic is supposed to ignore - * requests to disable interrupts outside - * of the range handled by the PIC - */ - BSP_enable_irq_at_pic(irq->name); + /* + * enable_irq_at_pic is supposed to ignore + * requests to disable interrupts outside + * of the range handled by the PIC + */ + BSP_enable_irq_at_pic(irq->name); - /* - * Enable interrupt on device - */ - if (irq->on) - irq->on(irq); + /* + * Enable interrupt on device + */ + if (irq->on) + irq->on(irq); - rtems_interrupt_enable(level); + rtems_interrupt_enable(level); - return 1; + return 1; } /* - * ------------------------ RTEMS Single Irq Handler Mngt Routines ---------------- + * ------------------- RTEMS Single Irq Handler Mngt Routines ------------ */ int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq) { - rtems_interrupt_level level; + rtems_interrupt_level level; - if (!isValidInterrupt(irq->name)) { - printk("Invalid interrupt vector %d\n",irq->name); - return 0; - } - /* - * Check if default handler is actually connected. If not issue an error. - * You must first get the current handler via i386_get_current_idt_entry - * and then disconnect it using i386_delete_idt_entry. - * RATIONALE : to always have the same transition by forcing the user - * to get the previous handler before accepting to disconnect. - */ - rtems_interrupt_disable(level); - if (rtems_hdl_tbl[irq->name].hdl != default_rtems_entry.hdl) { - rtems_interrupt_enable(level); - printk("IRQ vector %d already connected\n",irq->name); - return 0; - } + if (!isValidInterrupt(irq->name)) { + printk("Invalid interrupt vector %d\n",irq->name); + return 0; + } + /* + * Check if default handler is actually connected. If not issue an error. + * You must first get the current handler via i386_get_current_idt_entry + * and then disconnect it using i386_delete_idt_entry. + * RATIONALE : to always have the same transition by forcing the user + * to get the previous handler before accepting to disconnect. + */ + rtems_interrupt_disable(level); + if (rtems_hdl_tbl[irq->name].hdl != default_rtems_entry.hdl) { + rtems_interrupt_enable(level); + printk("IRQ vector %d already connected\n",irq->name); + return 0; + } - /* - * store the data provided by user - */ - rtems_hdl_tbl[irq->name] = *irq; - rtems_hdl_tbl[irq->name].next_handler = (void *)-1; - - /* - * enable_irq_at_pic is supposed to ignore - * requests to disable interrupts outside - * of the range handled by the PIC - */ - BSP_enable_irq_at_pic(irq->name); - - /* - * Enable interrupt on device - */ - if (irq->on) - irq->on(irq); + /* + * store the data provided by user + */ + rtems_hdl_tbl[irq->name] = *irq; + rtems_hdl_tbl[irq->name].next_handler = (void *)-1; - rtems_interrupt_enable(level); + /* + * enable_irq_at_pic is supposed to ignore + * requests to disable interrupts outside + * of the range handled by the PIC + */ + BSP_enable_irq_at_pic(irq->name); + + /* + * Enable interrupt on device + */ + if (irq->on) + irq->on(irq); + + rtems_interrupt_enable(level); - return 1; + return 1; } -int BSP_get_current_rtems_irq_handler (rtems_irq_connect_data* irq) +int BSP_get_current_rtems_irq_handler (rtems_irq_connect_data* irq) { - rtems_interrupt_level level; + rtems_interrupt_level level; - if (!isValidInterrupt(irq->name)) { - return 0; - } - rtems_interrupt_disable(level); - *irq = rtems_hdl_tbl[irq->name]; - rtems_interrupt_enable(level); - return 1; + if (!isValidInterrupt(irq->name)) { + return 0; + } + rtems_interrupt_disable(level); + *irq = rtems_hdl_tbl[irq->name]; + rtems_interrupt_enable(level); + return 1; } int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) { - rtems_irq_connect_data *pchain= NULL, *vchain = NULL; - rtems_interrupt_level level; + rtems_irq_connect_data *pchain= NULL, *vchain = NULL; + rtems_interrupt_level level; + + if (!isValidInterrupt(irq->name)) { + return 0; + } + /* + * Check if default handler is actually connected. If not issue an error. + * You must first get the current handler via i386_get_current_idt_entry + * and then disconnect it using i386_delete_idt_entry. + * RATIONALE : to always have the same transition by forcing the user + * to get the previous handler before accepting to disconnect. + */ + rtems_interrupt_disable(level); + if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) { + rtems_interrupt_enable(level); + return 0; + } - if (!isValidInterrupt(irq->name)) { + if ( (int)rtems_hdl_tbl[irq->name].next_handler != -1 ) { + int found = 0; + + for( (pchain= NULL, vchain = &rtems_hdl_tbl[irq->name]); + (vchain->hdl != default_rtems_entry.hdl); + (pchain= vchain, + vchain = (rtems_irq_connect_data*)vchain->next_handler) ) { + if ( vchain->hdl == irq->hdl ) { + found = -1; + break; + } + } + + if ( !found ) { + rtems_interrupt_enable(level); return 0; } - /* - * Check if default handler is actually connected. If not issue an error. - * You must first get the current handler via i386_get_current_idt_entry - * and then disconnect it using i386_delete_idt_entry. - * RATIONALE : to always have the same transition by forcing the user - * to get the previous handler before accepting to disconnect. - */ - rtems_interrupt_disable(level); + } else { if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) { rtems_interrupt_enable(level); return 0; } + } - if( (int)rtems_hdl_tbl[irq->name].next_handler != -1 ) - { - int found = 0; - - for( (pchain= NULL, vchain = &rtems_hdl_tbl[irq->name]); - (vchain->hdl != default_rtems_entry.hdl); - (pchain= vchain, vchain = (rtems_irq_connect_data*)vchain->next_handler) ) - { - if( vchain->hdl == irq->hdl ) - { - found= -1; break; - } - } - - if( !found ) - { - rtems_interrupt_enable(level); - return 0; - } - } - else - { - if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) - { - rtems_interrupt_enable(level); - return 0; - } - } + /* + * disable_irq_at_pic is supposed to ignore + * requests to disable interrupts outside + * of the range handled by the PIC + */ + BSP_disable_irq_at_pic(irq->name); - /* - * disable_irq_at_pic is supposed to ignore - * requests to disable interrupts outside - * of the range handled by the PIC - */ - BSP_disable_irq_at_pic(irq->name); - - /* - * Disable interrupt on device - */ - if (irq->off) - irq->off(irq); - - /* - * restore the default irq value - */ - if( !vchain ) - { - /* single handler vector... */ - rtems_hdl_tbl[irq->name] = default_rtems_entry; - } - else - { - if( pchain ) - { - /* non-first handler being removed */ - pchain->next_handler = vchain->next_handler; - } - else - { - /* first handler isn't malloc'ed, so just overwrite it. Since - the contents of vchain are being struct copied, vchain itself - goes away */ - vchain = vchain->next_handler; - rtems_hdl_tbl[irq->name]= *vchain; - } - free(vchain); + /* + * Disable interrupt on device + */ + if (irq->off) + irq->off(irq); + + /* + * restore the default irq value + */ + if( !vchain ) { + /* single handler vector... */ + rtems_hdl_tbl[irq->name] = default_rtems_entry; + } else { + if ( pchain ) { + /* non-first handler being removed */ + pchain->next_handler = vchain->next_handler; + } else { + /* first handler isn't malloc'ed, so just overwrite it. Since + * the contents of vchain are being struct copied, vchain itself + * goes away + */ + vchain = vchain->next_handler; + rtems_hdl_tbl[irq->name]= *vchain; } + free(vchain); + } - rtems_interrupt_enable(level); + rtems_interrupt_enable(level); - return 1; + return 1; } /* @@ -271,65 +266,67 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config) { - int i; - rtems_interrupt_level level; - rtems_irq_connect_data* vchain; - rtems_raw_except_connect_data vectorDesc; - - /* - * Store various code accelerators - */ - internal_config = config; - default_rtems_entry = config->defaultEntry; - rtems_hdl_tbl = config->irqHdlTbl; - - rtems_interrupt_disable(level); - - if ( !BSP_setup_the_pic(config) ) { - printk("PIC setup failed; leaving IRQs OFF\n"); - return 0; - } - - for ( i = config->irqBase; i < config->irqBase + config->irqNb; i++ ) { - for( vchain = &rtems_hdl_tbl[i]; - ((int)vchain != -1 && vchain->hdl != default_rtems_entry.hdl); - vchain = (rtems_irq_connect_data*)vchain->next_handler ) - { - if (vchain->on) - vchain->on(vchain); - } - } + int i; + rtems_interrupt_level level; + rtems_irq_connect_data* vchain; + rtems_raw_except_connect_data vectorDesc; - rtems_interrupt_enable(level); + /* + * Store various code accelerators + */ + internal_config = config; + default_rtems_entry = config->defaultEntry; + rtems_hdl_tbl = config->irqHdlTbl; - /* - * We must connect the raw irq handler for the two - * expected interrupt sources : decrementer and external interrupts. - */ - vectorDesc.exceptIndex = ASM_DEC_VECTOR; - vectorDesc.hdl.vector = ASM_DEC_VECTOR; - vectorDesc.hdl.raw_hdl = decrementer_exception_vector_prolog_code; - vectorDesc.hdl.raw_hdl_size = (unsigned) decrementer_exception_vector_prolog_code_size; - vectorDesc.on = 0; - vectorDesc.off = 0; - vectorDesc.isOn = 0; - if (!ppc_set_exception (&vectorDesc)) { - BSP_panic("Unable to initialize RTEMS decrementer raw exception\n"); - } - vectorDesc.exceptIndex = ASM_EXT_VECTOR; - vectorDesc.hdl.vector = ASM_EXT_VECTOR; - vectorDesc.hdl.raw_hdl = external_exception_vector_prolog_code; - vectorDesc.hdl.raw_hdl_size = (unsigned) external_exception_vector_prolog_code_size; - if (!ppc_set_exception (&vectorDesc)) { - BSP_panic("Unable to initialize RTEMS external raw exception\n"); + rtems_interrupt_disable(level); + + if ( !BSP_setup_the_pic(config) ) { + printk("PIC setup failed; leaving IRQs OFF\n"); + return 0; + } + + for ( i = config->irqBase; i < config->irqBase + config->irqNb; i++ ) { + for( vchain = &rtems_hdl_tbl[i]; + ((int)vchain != -1 && vchain->hdl != default_rtems_entry.hdl); + vchain = (rtems_irq_connect_data*)vchain->next_handler ) { + if (vchain->on) + vchain->on(vchain); } - return 1; + } + + rtems_interrupt_enable(level); + + /* + * We must connect the raw irq handler for the two + * expected interrupt sources : decrementer and external interrupts. + */ + vectorDesc.exceptIndex = ASM_DEC_VECTOR; + vectorDesc.hdl.vector = ASM_DEC_VECTOR; + vectorDesc.hdl.raw_hdl = decrementer_exception_vector_prolog_code; + vectorDesc.hdl.raw_hdl_size = + (unsigned) decrementer_exception_vector_prolog_code_size; + vectorDesc.on = 0; + vectorDesc.off = 0; + vectorDesc.isOn = 0; + if (!ppc_set_exception (&vectorDesc)) { + BSP_panic("Unable to initialize RTEMS decrementer raw exception\n"); + } + + vectorDesc.exceptIndex = ASM_EXT_VECTOR; + vectorDesc.hdl.vector = ASM_EXT_VECTOR; + vectorDesc.hdl.raw_hdl = external_exception_vector_prolog_code; + vectorDesc.hdl.raw_hdl_size = + (unsigned) external_exception_vector_prolog_code_size; + if (!ppc_set_exception (&vectorDesc)) { + BSP_panic("Unable to initialize RTEMS external raw exception\n"); + } + return 1; } int BSP_rtems_irq_mngt_get(rtems_irq_global_settings** config) { - *config = internal_config; - return 0; + *config = internal_config; + return 0; } void _ThreadProcessSignalsFromIrq (BSP_Exception_frame* ctx) |