Changeset 37731c2b in rtems
- Timestamp:
- 04/06/01 15:54:20 (23 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- bde9bb5
- Parents:
- 35bb69b
- Location:
- c/src/lib
- Files:
-
- 5 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/powerpc/support/new_exception_processing/cpu.h
r35bb69b r37731c2b 441 441 boolean exceptions_in_RAM; /* TRUE if in RAM */ 442 442 443 #if (defined(ppc403) || defined(mpc860) || defined(mpc821)) 444 unsigned32 serial_per_sec; /* Serial clocks per second */ 445 boolean serial_external_clock; 446 boolean serial_xon_xoff; 447 boolean serial_cts_rts; 448 unsigned32 serial_rate; 449 unsigned32 timer_average_overhead; /* Average overhead of timer in ticks */ 450 unsigned32 timer_least_valid; /* Least valid number from timer */ 451 boolean timer_internal_clock; /* TRUE, when timer runs with CPU clk */ 452 #endif 453 454 #if (defined(mpc860) || defined(mpc821)) 455 unsigned32 clock_speed; /* Speed of CPU in Hz */ 456 #endif 443 457 } rtems_cpu_table; 444 458 -
c/src/lib/libcpu/powerpc/ChangeLog
r35bb69b r37731c2b 1 2001-03-30 Eric Valette <valette@crf.canon.fr> 2 3 * mpc8xx/exceptions/.cvsignore, mpc8xx/exceptions/Makefile.am, 4 mpc8xx/exceptions/asm_utils.S, mpc8xx/exceptions/raw_exception.c, 5 mpc8xx/exceptions/raw_exception.h: New files. 6 * configure.in, mpc6xx/mmu/bat.h, mpc8xx/Makefile.am, 7 mpc8xx/clock/clock.c, 8 mpc8xx/console-generic/console-generic.c, 9 mpc8xx/include/mpc8xx.h, mpc8xx/mmu/mmu.c, 10 new_exception_processing/cpu.h, shared/include/byteorder.h, 11 wrapup/Makefile.am: This is conversion of the 12 mpc8xx CPU to the "new exception processing model." 13 1 14 2001-02-27 Ralf Corsepius <corsepiu@faw.uni-ulm.de> 2 15 -
c/src/lib/libcpu/powerpc/configure.in
r35bb69b r37731c2b 38 38 AM_CONDITIONAL(new_exception_processing, \ 39 39 test "$RTEMS_CPU_MODEL" = "mpc750" || \ 40 test "$RTEMS_CPU_MODEL" = "mpc604") 40 test "$RTEMS_CPU_MODEL" = "mpc604" || \ 41 test "$RTEMS_CPU_MODEL" = "mpc8xx" || \ 42 test "$RTEMS_CPU_MODEL" = "mpc860") 41 43 42 44 ## The goal is to get rid of the old exception processing code but … … 46 48 test "$RTEMS_CPU_MODEL" = "ppc403" || \ 47 49 test "$RTEMS_CPU_MODEL" = "mpc505" || \ 48 test "$RTEMS_CPU_MODEL" = "ppc603e" || \ 49 test "$RTEMS_CPU_MODEL" = "mpc8xx" \ 50 test "$RTEMS_CPU_MODEL" = "ppc603e" \ 50 51 ) 51 52 … … 71 72 mpc8xx/console-generic/Makefile 72 73 mpc8xx/cpm/Makefile 74 mpc8xx/exceptions/Makefile 73 75 mpc8xx/include/Makefile 74 76 mpc8xx/mmu/Makefile 75 77 mpc8xx/timer/Makefile 76 mpc8xx/vectors/Makefile77 78 ppc403/Makefile 78 79 ppc403/clock/Makefile -
c/src/lib/libcpu/powerpc/mpc6xx/mmu/bat.h
r35bb69b r37731c2b 26 26 #include <libcpu/mmu.h> 27 27 #include <libcpu/pgtable.h> 28 #include <bsp /consoleIo.h>28 #include <bspIo.h> 29 29 30 30 #define IO_PAGE (_PAGE_NO_CACHE | _PAGE_GUARDED | _PAGE_RW) -
c/src/lib/libcpu/powerpc/mpc8xx/Makefile.am
r35bb69b r37731c2b 5 5 AUTOMAKE_OPTIONS = foreign 1.4 6 6 7 SUBDIRS = include console-generic clock timer vectors cpm mmu7 SUBDIRS = include console-generic clock timer cpm mmu exceptions 8 8 9 9 include $(top_srcdir)/../../../../../automake/subdirs.am -
c/src/lib/libcpu/powerpc/mpc8xx/clock/clock.c
r35bb69b r37731c2b 46 46 volatile rtems_unsigned32 Clock_driver_ticks; 47 47 extern volatile m8xx_t m8xx; 48 extern int BSP_get_clock_irq_level(); 49 extern int BSP_connect_clock_handler(rtems_isr_entry); 50 extern int BSP_disconnect_clock_handler(); 48 51 49 52 void Clock_exit( void ); 50 53 51 54 /* 52 55 * These are set by clock driver during its init … … 66 69 } 67 70 68 void Install_clock(rtems_isr_entry clock_isr)71 void clockOn(void* unused) 69 72 { 70 #ifdef EPPCBUG_SMC1 71 extern unsigned32 simask_copy; 72 #endif /* EPPCBUG_SMC1 */ 73 74 rtems_isr_entry previous_isr; 73 unsigned desiredLevel; 75 74 rtems_unsigned32 pit_value; 76 77 Clock_driver_ticks = 0;78 75 79 76 pit_value = (rtems_configuration_get_microseconds_per_tick() * … … 82 79 if (pit_value > 0xffff) { /* pit is only 16 bits long */ 83 80 rtems_fatal_error_occurred(-1); 84 } 85 86 /* 87 * initialize the interval here 88 * First tick is set to right amount of time in the future 89 * Future ticks will be incremented over last value set 90 * in order to provide consistent clicks in the face of 91 * interrupt overhead 92 */ 93 94 rtems_interrupt_catch(clock_isr, PPC_IRQ_LVL0, &previous_isr); 95 81 } 96 82 m8xx.sccr &= ~(1<<24); 97 83 m8xx.pitc = pit_value; 98 84 85 desiredLevel = BSP_get_clock_irq_level(); 99 86 /* set PIT irq level, enable PIT, PIT interrupts */ 100 87 /* and clear int. status */ 101 m8xx.piscr = M8xx_PISCR_PIRQ(0) | 102 M8xx_PISCR_PTE | M8xx_PISCR_PS | M8xx_PISCR_PIE; 103 104 #ifdef EPPCBUG_SMC1 105 simask_copy = m8xx.simask | M8xx_SIMASK_LVM0; 106 #endif /* EPPCBUG_SMC1 */ 107 m8xx.simask |= M8xx_SIMASK_LVM0; 108 atexit(Clock_exit); 88 m8xx.piscr = M8xx_PISCR_PIRQ(desiredLevel) | 89 M8xx_PISCR_PTE | M8xx_PISCR_PS | M8xx_PISCR_PIE; 90 } 91 /* 92 * Called via atexit() 93 * Remove the clock interrupt handler by setting handler to NULL 94 */ 95 void 96 clockOff(void* unused) 97 { 98 /* disable PIT and PIT interrupts */ 99 m8xx.piscr &= ~(M8xx_PISCR_PTE | M8xx_PISCR_PIE); 109 100 } 110 101 111 void 112 ReInstall_clock(rtems_isr_entry new_clock_isr) 102 int clockIsOn(void* unused) 113 103 { 114 rtems_isr_entry previous_isr; 115 rtems_unsigned32 isrlevel = 0; 116 117 rtems_interrupt_disable(isrlevel); 118 119 rtems_interrupt_catch(new_clock_isr, PPC_IRQ_LVL0, &previous_isr); 120 121 rtems_interrupt_enable(isrlevel); 104 if (m8xx.piscr & M8xx_PISCR_PIE) return 1; 105 return 0; 122 106 } 123 124 107 125 108 /* … … 130 113 Clock_exit(void) 131 114 { 132 /* disable PIT and PIT interrupts */ 133 m8xx.piscr &= ~(M8xx_PISCR_PTE | M8xx_PISCR_PIE); 134 135 (void) set_vector(0, PPC_IRQ_LVL0, 1); 115 (void) BSP_disconnect_clock_handler (); 136 116 } 117 118 void Install_clock(rtems_isr_entry clock_isr) 119 { 120 Clock_driver_ticks = 0; 121 122 BSP_connect_clock_handler (clock_isr); 123 atexit(Clock_exit); 124 } 125 126 void 127 ReInstall_clock(rtems_isr_entry new_clock_isr) 128 { 129 BSP_connect_clock_handler (new_clock_isr); 130 } 131 137 132 138 133 rtems_device_driver Clock_initialize( … … 143 138 { 144 139 Install_clock( Clock_isr ); 145 140 146 141 /* 147 142 * make major/minor avail to others such as shared memory driver -
c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c
r35bb69b r37731c2b 54 54 #include <unistd.h> 55 55 #include <termios.h> 56 #include <bsp/irq.h> 57 #include <bspIo.h> /* for printk */ 56 58 57 59 extern rtems_cpu_table Cpu_table; … … 59 61 /* BSP supplied routine */ 60 62 extern int mbx8xx_console_get_configuration(); 61 62 #ifdef EPPCBUG_SMC163 extern unsigned32 simask_copy;64 #endif65 63 66 64 /* … … 89 87 struct rtems_termios_tty *ttyp[NUM_PORTS]; 90 88 91 /* Used to record previous ISR */92 static rtems_isr_entry old_handler[NUM_PORTS];93 94 89 /* 95 90 * Device-specific routines … … 100 95 static int m8xx_smc_set_attributes(int, const struct termios*); 101 96 static int m8xx_scc_set_attributes(int, const struct termios*); 102 static rtems_isr m8xx_smc1_interrupt_handler(rtems_vector_number);103 static rtems_isr m8xx_smc2_interrupt_handler(rtems_vector_number);104 static rtems_isr m8xx_scc2_interrupt_handler(rtems_vector_number);97 static void m8xx_smc1_interrupt_handler(void); 98 static void m8xx_smc2_interrupt_handler(void); 99 static void m8xx_scc2_interrupt_handler(void); 105 100 #if defined(mpc860) 106 static rtems_isr m8xx_scc3_interrupt_handler(rtems_vector_number);107 static rtems_isr m8xx_scc4_interrupt_handler(rtems_vector_number);101 static void m8xx_scc3_interrupt_handler(void); 102 static void m8xx_scc4_interrupt_handler(void); 108 103 #endif 109 104 … … 388 383 * Interrupt handlers 389 384 */ 390 static rtems_isr 391 m8xx_scc2_interrupt_handler (rtems_vector_number v) 385 static void m8xx_scc2_interrupt_handler () 392 386 { 393 387 int nb_overflow; … … 426 420 (int)TxBd[SCC2_MINOR]->length); 427 421 } 428 m8xx.cisr = 1UL << 29; /* Clear SCC2 interrupt-in-service bit */429 422 } 430 423 431 424 432 425 #ifdef mpc860 433 static rtems_isr434 m8xx_scc3_interrupt_handler ( rtems_vector_number v)426 static void 427 m8xx_scc3_interrupt_handler (void) 435 428 { 436 429 int nb_overflow; … … 469 462 (int)TxBd[SCC3_MINOR]->length); 470 463 } 471 m8xx.cisr = 1UL << 28; /* Clear SCC3 interrupt-in-service bit */ 472 } 473 474 475 static rtems_isr 476 m8xx_scc4_interrupt_handler (rtems_vector_number v) 464 } 465 466 467 static void 468 m8xx_scc4_interrupt_handler (void) 477 469 { 478 470 int nb_overflow; … … 511 503 (int)TxBd[SCC4_MINOR]->length); 512 504 } 513 m8xx.cisr = 1UL << 27; /* Clear SCC4 interrupt-in-service bit */514 505 } 515 506 #endif 516 507 517 static rtems_isr518 m8xx_smc1_interrupt_handler ( rtems_vector_number v)508 static void 509 m8xx_smc1_interrupt_handler (void) 519 510 { 520 511 int nb_overflow; … … 553 544 (int)TxBd[SMC1_MINOR]->length); 554 545 } 555 m8xx.cisr = 1UL << 4; /* Clear SMC1 interrupt-in-service bit */ 556 } 557 558 559 static rtems_isr 560 m8xx_smc2_interrupt_handler (rtems_vector_number v) 546 } 547 548 549 static void 550 m8xx_smc2_interrupt_handler (void) 561 551 { 562 552 int nb_overflow; … … 595 585 (int)TxBd[SMC2_MINOR]->length); 596 586 } 597 m8xx.cisr = 1UL << 3; /* Clear SMC2 interrupt-in-service bit */ 598 } 599 600 587 } 588 589 void m8xx_scc_enable(const rtems_irq_connect_data* ptr) 590 { 591 volatile m8xxSCCRegisters_t *sccregs = 0; 592 switch (ptr->name) { 593 #if defined(mpc860) 594 case BSP_CPM_IRQ_SCC4 : 595 sccregs = &m8xx.scc4; 596 break; 597 case BSP_CPM_IRQ_SCC3 : 598 sccregs = &m8xx.scc3; 599 break; 600 #endif 601 case BSP_CPM_IRQ_SCC2 : 602 sccregs = &m8xx.scc2; 603 break; 604 case BSP_CPM_IRQ_SCC1 : 605 sccregs = &m8xx.scc1; 606 break; 607 default: 608 break; 609 } 610 sccregs->sccm = 3; 611 } 612 613 void m8xx_scc_disable(const rtems_irq_connect_data* ptr) 614 { 615 volatile m8xxSCCRegisters_t *sccregs = 0; 616 switch (ptr->name) { 617 #if defined(mpc860) 618 case BSP_CPM_IRQ_SCC4 : 619 sccregs = &m8xx.scc4; 620 break; 621 case BSP_CPM_IRQ_SCC3 : 622 sccregs = &m8xx.scc3; 623 break; 624 #endif 625 case BSP_CPM_IRQ_SCC2 : 626 sccregs = &m8xx.scc2; 627 break; 628 case BSP_CPM_IRQ_SCC1 : 629 sccregs = &m8xx.scc1; 630 break; 631 default: 632 break; 633 } 634 sccregs->sccm &= (~3); 635 } 636 637 int m8xx_scc_isOn(const rtems_irq_connect_data* ptr) 638 { 639 return BSP_irq_enabled_at_cpm (ptr->name); 640 } 641 642 static rtems_irq_connect_data consoleIrqData = 643 { 644 BSP_CPM_IRQ_SCC2, 645 (rtems_irq_hdl)m8xx_scc2_interrupt_handler, 646 (rtems_irq_enable) m8xx_scc_enable, 647 (rtems_irq_disable) m8xx_scc_disable, 648 (rtems_irq_is_enabled) m8xx_scc_isOn 649 }; 650 601 651 void 602 652 m8xx_uart_scc_initialize (int minor) … … 605 655 volatile m8xxSCCparms_t *sccparms = 0; 606 656 volatile m8xxSCCRegisters_t *sccregs = 0; 657 int res; 607 658 608 659 /* … … 778 829 switch (minor) { 779 830 case SCC2_MINOR: 780 rtems_interrupt_catch (m8xx_scc2_interrupt_handler,781 PPC_IRQ_CPM_SCC2,782 &old_handler[minor]);783 784 sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */785 m8xx.cimr |= 1UL << 29; /* Enable SCC2 interrupts */786 831 break; 787 832 788 833 #ifdef mpc860 789 case SCC3_MINOR: 790 rtems_interrupt_catch (m8xx_scc3_interrupt_handler, 791 PPC_IRQ_CPM_SCC3, 792 &old_handler[minor]); 793 794 sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */ 795 m8xx.cimr |= 1UL << 28; /* Enable SCC2 interrupts */ 796 break; 834 case SCC3_MINOR: 835 consoleIrqData.name = BSP_CPM_IRQ_SCC3; 836 consoleIrqData.hdl = m8xx_scc3_interrupt_handler; 837 break; 797 838 798 case SCC4_MINOR: 799 rtems_interrupt_catch (m8xx_scc4_interrupt_handler, 800 PPC_IRQ_CPM_SCC4, 801 &old_handler[minor]); 802 803 sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */ 804 m8xx.cimr |= 1UL << 27; /* Enable SCC2 interrupts */ 805 break; 839 case SCC4_MINOR: 840 consoleIrqData.name = BSP_CPM_IRQ_SCC4; 841 consoleIrqData.hdl = m8xx_scc4_interrupt_handler; 842 break; 806 843 #endif /* mpc860 */ 807 844 } 808 } 809 } 810 845 if (!BSP_install_rtems_irq_handler (&consoleIrqData)) { 846 printk("Unable to connect SCC Irq handler\n"); 847 rtems_fatal_error_occurred(1); 848 } 849 } 850 } 851 852 void m8xx_smc_enable(const rtems_irq_connect_data* ptr) 853 { 854 volatile m8xxSMCRegisters_t *smcregs = 0; 855 switch (ptr->name) { 856 case BSP_CPM_IRQ_SMC1 : 857 smcregs = &m8xx.smc1; 858 break; 859 case BSP_CPM_IRQ_SMC2_OR_PIP : 860 smcregs = &m8xx.smc2; 861 break; 862 default: 863 break; 864 } 865 smcregs->smcm = 3; 866 } 867 868 void m8xx_smc_disable(const rtems_irq_connect_data* ptr) 869 { 870 volatile m8xxSMCRegisters_t *smcregs = 0; 871 switch (ptr->name) { 872 case BSP_CPM_IRQ_SMC1 : 873 smcregs = &m8xx.smc1; 874 break; 875 case BSP_CPM_IRQ_SMC2_OR_PIP : 876 smcregs = &m8xx.smc2; 877 break; 878 default: 879 break; 880 } 881 smcregs->smcm &= (~3); 882 } 883 884 int m8xx_smc_isOn(const rtems_irq_connect_data* ptr) 885 { 886 return BSP_irq_enabled_at_cpm (ptr->name); 887 } 811 888 812 889 void … … 924 1001 smcregs->smcmr |= M8xx_SMCMR_TEN | M8xx_SMCMR_REN; 925 1002 if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 ) { 1003 consoleIrqData.on = m8xx_smc_enable; 1004 consoleIrqData.off = m8xx_smc_disable; 1005 consoleIrqData.isOn = m8xx_smc_isOn; 926 1006 switch (minor) { 927 case SMC1_MINOR: 928 rtems_interrupt_catch (m8xx_smc1_interrupt_handler, 929 PPC_IRQ_CPM_SMC1, 930 &old_handler[minor]); 931 932 smcregs->smcm = 3; /* Enable SMC1 Rx & Tx interrupts */ 933 m8xx.cimr |= 1UL << 4; /* Enable SMC1 interrupts */ 934 break; 1007 case SMC1_MINOR: 1008 consoleIrqData.name = BSP_CPM_IRQ_SMC1; 1009 consoleIrqData.hdl = m8xx_smc1_interrupt_handler; 1010 break; 935 1011 936 937 rtems_interrupt_catch (m8xx_smc2_interrupt_handler, 938 PPC_IRQ_CPM_SMC2, 939 &old_handler[minor]);940 941 smcregs->smcm = 3; /* Enable SMC2 Rx & Tx interrupts */942 m8xx.cimr |= 1UL << 3; /* Enable SMC2 interrupts */943 break;1012 case SMC2_MINOR: 1013 consoleIrqData.name = BSP_CPM_IRQ_SMC2_OR_PIP; 1014 consoleIrqData.hdl = m8xx_smc2_interrupt_handler; 1015 break; 1016 } 1017 if (!BSP_install_rtems_irq_handler (&consoleIrqData)) { 1018 printk("Unable to connect SMC Irq handler\n"); 1019 rtems_fatal_error_occurred(1); 944 1020 } 945 1021 } … … 957 1033 } 958 1034 959 960 void961 m8xx_uart_interrupts_initialize(void)962 {963 #ifdef mpc860964 m8xx.cicr = 0x00E43F80; /* SCaP=SCC1, SCbP=SCC2, SCcP=SCC3,965 SCdP=SCC4, IRL=1, HP=PC15, IEN=1 */966 #else967 m8xx.cicr = 0x00043F80; /* SCaP=SCC1, SCbP=SCC2, IRL=1, HP=PC15, IEN=1 */968 #endif969 m8xx.simask |= M8xx_SIMASK_LVM1; /* Enable level interrupts */970 #ifdef EPPCBUG_SMC1971 simask_copy = m8xx.simask;972 #endif973 }974 1035 975 1036 -
c/src/lib/libcpu/powerpc/mpc8xx/include/mpc8xx.h
r35bb69b r37731c2b 650 650 */ 651 651 typedef struct m8xxBufferDescriptor_ { 652 rtems_unsigned16 status;653 rtems_unsigned16 length;654 volatile void *buffer;652 volatile rtems_unsigned16 status; 653 rtems_unsigned16 length; 654 volatile void *buffer; 655 655 } m8xxBufferDescriptor_t; 656 656 -
c/src/lib/libcpu/powerpc/mpc8xx/mmu/mmu.c
r35bb69b r37731c2b 116 116 * Turn on address translation by setting MSR[IR] and MSR[DR]. 117 117 */ 118 _CPU_MSR_ Value( reg1 );118 _CPU_MSR_GET( reg1 ); 119 119 reg1 |= PPC_MSR_IR | PPC_MSR_DR; 120 120 _CPU_MSR_SET( reg1 ); -
c/src/lib/libcpu/powerpc/new_exception_processing/cpu.h
r35bb69b r37731c2b 441 441 boolean exceptions_in_RAM; /* TRUE if in RAM */ 442 442 443 #if (defined(ppc403) || defined(mpc860) || defined(mpc821)) 444 unsigned32 serial_per_sec; /* Serial clocks per second */ 445 boolean serial_external_clock; 446 boolean serial_xon_xoff; 447 boolean serial_cts_rts; 448 unsigned32 serial_rate; 449 unsigned32 timer_average_overhead; /* Average overhead of timer in ticks */ 450 unsigned32 timer_least_valid; /* Least valid number from timer */ 451 boolean timer_internal_clock; /* TRUE, when timer runs with CPU clk */ 452 #endif 453 454 #if (defined(mpc860) || defined(mpc821)) 455 unsigned32 clock_speed; /* Speed of CPU in Hz */ 456 #endif 443 457 } rtems_cpu_table; 444 458 -
c/src/lib/libcpu/powerpc/shared/include/byteorder.h
r35bb69b r37731c2b 19 19 #ifndef _PPC_BYTEORDER_H 20 20 #define _PPC_BYTEORDER_H 21 22 /*23 * $Id$24 */25 21 26 22 #ifdef __GNUC__ -
c/src/lib/libcpu/powerpc/wrapup/Makefile.am
r35bb69b r37731c2b 11 11 CPU_SPECIFIC_OBJS = $(wildcard ../$(RTEMS_CPU_MODEL)/*/$(ARCH)/*.o) 12 12 FAMILY_OBJS = \ 13 $(wildcard ../shared/$(ARCH)/*.o ../shared/*/$(ARCH)/*.o ../old_exception_processing/*/$(ARCH)/*.o ../new_exception_processing/*/$(ARCH)/*.o ../mpc6xx/*/$(ARCH)/*.o) 13 $(wildcard ../shared/$(ARCH)/*.o ../shared/*/$(ARCH)/*.o \ 14 ../old_exception_processing/*/$(ARCH)/*.o \ 15 ../new_exception_processing/*/$(ARCH)/*.o \ 16 ../mpc6xx/*/$(ARCH)/*.o) 14 17 15 18 LIB = $(ARCH)/libcpu.a
Note: See TracChangeset
for help on using the changeset viewer.