Hi Bhushan, I guess you use an EP9315 processor, not a 9215 ? Actually I don't know where your problem could come from. When does it happen ? Has the kernel allready arrived on your board through tftboot ? What I can see is that you try to boot vmlinux. I'm not a uboot expert and maybe the guys on the uboot mailing list could help you better, but I think it is best and easier to boot a 'uImage' when you use uboot (that is what I use to do). To create a uImage, just type 'make uImage' instead of 'make vmlinux' in your kernel directory. If it yells about a not found 'mkimage' script, you can certainly get it somewhere on the web (at least I think this mkimage script is provided by the Denx ELDK toolchain) Regards Yann > Hi Yann, > I am able to build succesfully, > Thanks a lot, > Need some more help. > I am trying to boot EP9215 with the linux (new image) using U-boot loader > through tftpboot. > I am getting error > TFTP from server 139.187.156.18; our IP address is 139.187.156.42 > Filename '/home/white/arm/arm-linux/linux-2.6.11.7/vmlinux'. > Load address: 0x60100000 > Loading: len bad 76 < 78 > > Can you suggest what is this error > I am not able to boot > Thanks and regards > Bhushan Kolarkar > > > |---------+---------------------------------> > | | "Bhushan Kolarkar" | > | | <Bhushan.Kolarkar@nsc.| > | | com> | > | | Sent by: | > | | linux-cirrus-bounce@fr| > | | eelists.org | > | | | > | | | > | | 05/21/2005 01:14 PM | > | | Please respond to | > | | linux-cirrus | > | | | > |---------+---------------------------------> > > >------------------------------------------------------------------------------------------------------------------------------| > | > | > | To: linux-cirrus@xxxxxxxxxxxxx > | > | cc: > | > | Subject: [linux-cirrus] Re: Building Nucleusys tool chain on the > target | > > >------------------------------------------------------------------------------------------------------------------------------| > > > > > Hi Yann, > That was of great help, > I have applied the path > I am trying to resolve the error, > Thanks and regards > Bhushan > > > |---------+---------------------------------> > | | "yann poupet" | > | | <yann.poupet@xxxxxxx> | > | | Sent by: | > | | linux-cirrus-bounce@fr| > | | eelists.org | > | | | > | | | > | | 05/25/2005 12:08 PM | > | | Please respond to | > | | linux-cirrus | > | | | > |---------+---------------------------------> > > >------------------------------------------------------------------------------------------------------------------------------| > > | > | > | To: Bhushan.Kolarkar@xxxxxxx, linux-cirrus@xxxxxxxxxxxxx > | > | cc: > | > | Subject: [linux-cirrus] Re: Building Nucleusys tool chain on the > target | > > >------------------------------------------------------------------------------------------------------------------------------| > > > > > > Hi, > > I've just checked, the patch is here : > http://yann.poupet.free.fr/ep93xx/linux-2.6.11.7-ep93xx-eb.patch > > If you haven't found the patch, that may be the problem if it has not > been applied. > But maybe you problem comes from something else. I can see it is ramfs > related, and I have never tried to use ramfs. > Having a quick look at the file gen_initramfs_list.sh which seems to be > the source of the problem, I can see that this error message is : > > echo " $0: Cannot open '$cpio_source'" > > So, your cpio_source is certainly declared as 'y', which is certainly > not a valid cpio_source. > > I send you the patch attached with this email. > > Regards > > Yann > > Bhushan Kolarkar wrote: > > >Hi Yann, > > > >I have down loaded the linux-2.6.11.7 > >from http://yann.poupet.free.fr/ep93xx/ but could not find the patch > >linux-2.6.11.7-ep93xx-eb.patch you mentaioned in the link. > >I configured the kernel and tried building > >I am getting following error > > CHK usr/initramfs_list > > /home/white/arm/arm-linux/linux-2.6.11.7/scripts/gen_initramfs_list.sh: > Cannot > >open 'y' > >make[1]: *** [usr/initramfs_list] Error 1 > >what could be the problem > >Your suggestion would be of great help, > >Thanks and regards, > >Bhushan Kolarkar > > > > > > > >|---------+---------------------------------> > >| | "yann poupet" | > >| | <yann.poupet@xxxxxxx> | > >| | Sent by: | > >| | linux-cirrus-bounce@fr| > >| | eelists.org | > >| | | > >| | | > >| | 05/24/2005 11:23 PM | > >| | Please respond to | > >| | linux-cirrus | > >| | | > >|---------+---------------------------------> > > > >------------------------------------------------------------------------------------------------------------------------------| > > > > | > | > > | To: linux-cirrus@xxxxxxxxxxxxx > | > > | cc: > | > > | Subject: [linux-cirrus] Re: Building Nucleusys tool chain on the > target | > > > >------------------------------------------------------------------------------------------------------------------------------| > > > > > > > > > > > > > > > > > >>I've posted on my personnal website a quick-made howto about how I got it > >>working. > >> > >>http://yann.poupet.free.fr/ep93xx/ > >> > >>The links in the second part are broken (the scripts and patches) because I > >>don't have access to the file right now. I'll put them on the website > tonight > >>when I'm back home. > >> > >> > >> > >> > >> > > > >Done, script & patches available. > > > >Feel free to ask if something goes wrong. > > > >Regards > > > >Yann > > > > > > > > > > > > > > > > > > > > > > > > > > diff -urN linux-2.6.11.7/arch/arm/kernel/entry-armv.S > linux-2.6.11.7-eb/arch/arm/kernel/entry-armv.S > --- linux-2.6.11.7/arch/arm/kernel/entry-armv.S 2005-04-07 > 20:57:28.000000000 +0200 > +++ linux-2.6.11.7-eb/arch/arm/kernel/entry-armv.S 2005-05-12 > 20:02:14.000000000 +0200 > @@ -188,6 +188,12 @@ > @ > @ r0 - instruction > @ > +#ifdef CONFIG_EP93XX_CRUNCH > + mov r0, sp > + bl crunch_opcode > + cmp r0, #1 > + beq 1f > +#endif > ldr r0, [r2, #-4] > adr r9, 1f > bl call_fpe > @@ -353,6 +359,15 @@ > tst r3, #PSR_T_BIT @ > Thumb > mode? > bne fpundefinstr @ > ignore FP > sub r4, r2, #4 > +#ifdef CONFIG_EP93XX_CRUNCH > +@ bl crunch_in > + mov r0, sp > + bl crunch_opcode > +@ bl crunch_out > + cmp r0, #1 > + beq ret_from_exception > +#endif > +@ bl crunch_out > > @ > @ fall through to the emulation code, which returns using r9 if > @@ -476,6 +491,7 @@ > * This is the return code to user mode for abort handlers > */ > ENTRY(ret_from_exception) > +@ bl crunch_out2 > get_thread_info tsk > mov why, #0 > b ret_to_user > diff -urN linux-2.6.11.7/arch/arm/kernel/setup.c > linux-2.6.11.7-eb/arch/arm/kernel/setup.c > --- linux-2.6.11.7/arch/arm/kernel/setup.c 2005-04-07 > 20:57:42.000000000 +0200 > +++ linux-2.6.11.7-eb/arch/arm/kernel/setup.c 2005-05-12 > 20:03:40.000000000 +0200 > @@ -314,6 +314,9 @@ > sprintf(system_utsname.machine, "%s%c", list->arch_name, > ENDIANNESS); > sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); > elf_hwcap = list->elf_hwcap; > +#ifdef CONFIG_EP93XX_CRUNCH > + elf_hwcap |= HWCAP_CRUNCH; > +#endif > > cpu_proc_init(); > } > @@ -756,6 +759,7 @@ > "vfp", > "edsp", > "java", > + "crunch", > NULL > }; > > diff -urN linux-2.6.11.7/arch/arm/mach-ep93xx/crunch.c > linux-2.6.11.7-eb/arch/arm/mach-ep93xx/crunch.c > --- linux-2.6.11.7/arch/arm/mach-ep93xx/crunch.c 1970-01-01 > 01:00:00.000000000 +0100 > +++ linux-2.6.11.7-eb/arch/arm/mach-ep93xx/crunch.c 2005-05-15 > 22:32:52.000000000 +0200 > @@ -0,0 +1,343 @@ > +/* > + * Cirrus MaverickCrunch support > + * > + * Copyright (c) 2003 Petko Manolov <petkan@xxxxxxxxxxxxx> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * version 2 as published by the Free Software Foundation; > + */ > + > +#include <linux/sched.h> > +#include <linux/init.h> > +#include <asm/io.h> > +#include <asm/arch/crunch.h> > + > +unsigned int read_dspsc_low(void) > +{ > + int res; > + > + asm volatile ( > + "cdp p4, 1, c15, c0, c0, 7\n\t" // "cfmv32sc > mvdx15, dspsc\n\t" > + "mrc p5, 0, %0, c15, c0, 0" // "cfmvr64l %0, > mvdx15" > + :"=r" (res) > + : > + :"memory"); > + > + return res; > +} > + > +unsigned int read_dspsc_high(void) > +{ > + int res; > + > + asm volatile ( > + "cdp p4, 1, c15, c0, c0, 7\n\t" // "cfmv32sc > mvdx15, dspsc\n\t" > + "mrc p5, 0, %0, c15, c0, 1" // "cfmvr64h %0, > mvdx15" > + :"=r" (res) > + : > + :"memory"); > + > + return res; > +} > + > +void write_dspsc(unsigned int dspsc) > +{ > + asm volatile ( > + "mcr p5, 0, %0, c15, c0, 0\n\t" // "cfmv64lr > mvdx15, %0\n\t" > + "cdp p4, 2, c15, c0, c0, 7" // "cfmvsc32 > dspsc, > mvdx15" > + : > + :"r" (dspsc), "rN"(-1) > + :"memory"); > +} > + > +void crunch_init(void) > +{ > + write_dspsc(CRUNCH_INIT); > + current->flags |= PF_USEDCRUNCH; > +} > + > +/* > + * had to do it this way since "clf(); cli();" takes longer > + */ > +static inline void clear_fiq_irq(void) > +{ > + int cpsr; > + > + asm volatile ( > + "mrs %0, CPSR\n\t" > + "orr %0, %0, #192\n\t" > + "msr CPSR_c, %0" > + :"=r" (cpsr) > + : > + :"memory"); > +} > + > +/* > + * had to do it this way since "stf(); sti();" takes (twice) longer > + */ > + > +static inline void restore_fiq_irq(void) > +{ > + int cpsr; > + > + asm volatile ( > + "mrs %0, CPSR\n\t" > + "bic %0, %0, #192\n\t" > + "msr CPSR_c, %0" > + :"=r" (cpsr) > + : > + :"memory"); > +} > + > +#ifdef CONFIG_EP93XX_CRUNCH_ACC > +static inline void save_accumulators(struct task_struct *tsk) > +{ > + int tmp; > + struct fp_crunch_struct *fp = &tsk->thread_info->fpstate.crunch; > + > + /* > + * clear the IRQ & FIQ to avoid some of the bugs in the errata > + */ > + clear_fiq_irq(); > + > + asm volatile ( > + "cdp p4, 1, c0, c0, c0, 2\n\t" // "cfmv32al > mvfx0, mvax0\n\t" > + "stc p5, c0, [%0], #4\n\t" // "cfstr32 > mvfx0, > [%0], 4\n\t" > + "cdp p4, 1, c1, c0, c0, 3\n\t" // "cfmv32am > mvfx1, mvax0\n\t" > + "stc p5, c1, [%0], #4\n\t" // "cfstr32 > mvfx1, > [%0], 4\n\t" > + "cdp p4, 1, c2, c0, c0, 4\n\t" // "cfmv32ah > mvfx2, mvax0\n\t" > + "stc p5, c2, [%0], #4\n\t" // "cfstr32 > mvfx2, > [%0], 4\n\t" > + "cdp p4, 1, c3, c1, c0, 2\n\t" // "cfmv32al > mvfx3, mvax1\n\t" > + "stc p5, c3, [%0], #4\n\t" // "cfstr32 > mvfx3, > [%0], 4\n\t" > + "cdp p4, 1, c4, c1, c0, 3\n\t" // "cfmv32am > mvfx4, mvax1\n\t" > + "stc p5, c4, [%0], #4\n\t" // "cfstr32 > mvfx4, > [%0], 4\n\t" > + "cdp p4, 1, c5, c1, c0, 4\n\t" // "cfmv32ah > mvfx5, mvax1\n\t" > + "stc p5, c5, [%0], #4\n\t" // "cfstr32 > mvfx5, > [%0], 4\n\t" > + "cdp p4, 1, c6, c2, c0, 2\n\t" // "cfmv32al > mvfx6, mvax2\n\t" > + "stc p5, c6, [%0], #4\n\t" // "cfstr32 > mvfx6, > [%0], 4\n\t" > + "cdp p4, 1, c7, c2, c0, 3\n\t" // "cfmv32am > mvfx7, mvax2\n\t" > + "stc p5, c7, [%0], #4\n\t" // "cfstr32 > mvfx7, > [%0], 4\n\t" > + "cdp p4, 1, c8, c2, c0, 4\n\t" // "cfmv32ah > mvfx8, mvax2\n\t" > + "stc p5, c8, [%0], #4\n\t" // "cfstr32 > mvfx8, > [%0], 4\n\t" > + "cdp p4, 1, c9, c3, c0, 2\n\t" // "cfmv32al > mvfx9, mvax3\n\t" > + "stc p5, c9, [%0], #4\n\t" // "cfstr32 > mvfx9, > [%0], 4\n\t" > + "cdp p4, 1, c10, c3, c0, 3\n\t" // "cfmv32am > mvfx10, mvax3\n\t" > + "stc p5,c10, [%0], #4\n\t" // "cfstr32 > mvfx10, > [%0], 4\n\t" > + "cdp p4, 1, c11, c3, c0, 4\n\t" // "cfmv32ah > mvfx11, mvax3\n\t" > + "stc p5, c11, [%0, #0]" // > "cfstr32 > mvfx11, [%0, #0]" > + :"=&r" (tmp) > + :"0" (&fp->acc0[0]) > + :"memory"); > + > + restore_fiq_irq(); > +} > +#endif > + > +#ifdef CONFIG_EP93XX_CRUNCH_ACC > +static inline void restore_accumulators(struct task_struct *tsk) > +{ > + int tmp; > + struct fp_crunch_struct *fp = &tsk->thread_info->fpstate.crunch; > + > + > /* > + > * clear the IRQ & FIQ to avoid some of > the > bugs in the errata > + > */ > + > clear_fiq_irq(); > + > + > asm volatile ( > + "ldc p5, c0, [%0],#4\n\t" // "cfldr32 > mvfx0, > [%0], 4\n\t" > + "cdp p4, 2, c0, c0, c0, 2\n\t" // "cfmval32 > mvax0, mvfx0\n\t" > + "ldc p5, c1, [%0],#4\n\t" // "cfldr32 > mvfx1, > [%0], 4\n\t" > + "cdp p4, 2, c0, c1, c0, 3\n\t" // "cfmvam32 > mvax0, mvfx1\n\t" > + "ldc p5, c2, [%0],#4\n\t" // "cfldr32 > mvfx2, > [%0], 4\n\t" > + "cdp p4, 2, c0, c2, c0, 4\n\t" // "cfmvah32 > mvax0, mvfx2\n\t" > + "ldc p5, c3, [%0],#4\n\t" // "cfldr32 > mvfx3, > [%0], 4\n\t" > + "cdp p4, 2, c1, c3, c0, 2\n\t" // "cfmval32 > mvax1, mvfx3\n\t" > + "ldc p5, c4, [%0],#4\n\t" // "cfldr32 > mvfx4, > [%0], 4\n\t" > + "cdp p4, 2, c1, c4, c0, 3\n\t" // "cfmvam32 > mvax1, mvfx4\n\t" > + "ldc p5, c5, [%0],#4\n\t" // "cfldr32 > mvfx5, > [%0], 4\n\t" > + "cdp p4, 2, c1, c5, c0, 4\n\t" // "cfmvah32 > mvax1, mvfx5\n\t" > + "ldc p5, c6, [%0],#4\n\t" // "cfldr32 > mvfx6, > [%0], 4\n\t" > + "cdp p4, 2, c2, c6, c0, 2\n\t" // "cfmval32 > mvax2, mvfx6\n\t" > + "ldc p5, c7, [%0],#4\n\t" // "cfldr32 > mvfx7, > [%0], 4\n\t" > + "cdp p4, 2, c2, c7, c0, 3\n\t" // "cfmvam32 > mvax2, mvfx7\n\t" > + "ldc p5, c8, [%0],#4\n\t" // "cfldr32 > mvfx8, > [%0], 4\n\t" > + "cdp p4, 2, c2, c8, c0, 4\n\t" // "cfmvah32 > mvax2, mvfx8\n\t" > + "ldc p5, c9, [%0],#4\n\t" // "cfldr32 > mvfx9, > [%0], 4\n\t" > + "cdp p4, 2, c3, c9, c0, 2\n\t" // "cfmval32 > mvax3, mvfx9\n\t" > + "ldc p5, c10, [%0],#4\n\t" // "cfldr32 > mvfx10, [%0], 4\n\t" > + "cdp p4, 2, c3, c10, c0, 3\n\t" // "cfmvam32 > mvax3, mvfx10\n\t" > + "ldc p5, c11, [%0, #0]\n\t" // "cfldr32 > mvfx11, [%0, #0]\n\t" > + "cdp p4, 2, c3, c11, c0, 4" // "cfmvah32 > mvax3, > mvfx11" > + :"=&r" (tmp) > + :"0" (&fp->acc0[0]) > + :"memory"); > + > + restore_fiq_irq(); > +} > +#endif > + > +void save_crunch(struct task_struct *tsk) > +{ > + int tmp; > + struct fp_crunch_struct *fp = &tsk->thread_info->fpstate.crunch; > + > + asm volatile ( > + "stcl p5, c0, [%0],#8\n\t" // "cfstr64 > mvdx0, > [%0], 8\n\t" > + "stcl p5, c1, [%0],#8\n\t" // "cfstr64 > mvdx1, > [%0], 8\n\t" > + "stcl p5, c2, [%0],#8\n\t" // "cfstr64 > mvdx2, > [%0], 8\n\t" > + "stcl p5, c3, [%0],#8\n\t" // "cfstr64 > mvdx3, > [%0], 8\n\t" > + "stcl p5, c4, [%0],#8\n\t" // "cfstr64 > mvdx4, > [%0], 8\n\t" > + "stcl p5, c5, [%0],#8\n\t" // "cfstr64 > mvdx5, > [%0], 8\n\t" > + "stcl p5, c6, [%0],#8\n\t" // "cfstr64 > mvdx6, > [%0], 8\n\t" > + "stcl p5, c7, [%0],#8\n\t" // "cfstr64 > mvdx7, > [%0], 8\n\t" > + "stcl p5, c8, [%0],#8\n\t" // "cfstr64 > mvdx8, > [%0], 8\n\t" > + "stcl p5, c9, [%0],#8\n\t" // "cfstr64 > mvdx9, > [%0], 8\n\t" > + "stcl p5, c10, [%0],#8\n\t" // "cfstr64 > mvdx10, [%0], 8\n\t" > + "stcl p5, c11, [%0],#8\n\t" // "cfstr64 > mvdx11, [%0], 8\n\t" > + "stcl p5, c12, [%0],#8\n\t" // "cfstr64 > mvdx12, [%0], 8\n\t" > + "stcl p5, c13, [%0],#8\n\t" // "cfstr64 > mvdx13, [%0], 8\n\t" > + "stcl p5, c14, [%0],#8\n\t" // "cfstr64 > mvdx14, [%0], 8\n\t" > + "stcl p5, c15, [%0, #0]\n\t" // "cfstr64 > mvdx15, [%0, #0]\n\t" > + "cdp p4, 1, c15, c0, c0, 7\n\t" // "cfmv32sc > mvdx15, dspsc\n\t" > + "stc p5, c15, [%2, #0]" // > "cfstr32 > mvfx15, [%2, #0]" > + :"=&r" (tmp) > + :"0" (&fp->regs[0]), "r" (&fp->dspsc) > + :"memory"); > +#ifdef CONFIG_EP93XX_CRUNCH_ACC > + /* > + * this call should be made exactly here since it's corrupting > + * the contents of most crunch registers ;-) > + */ > + save_accumulators(tsk); > +#endif > +} > + > +void restore_crunch(struct task_struct *tsk) > +{ > + int tmp; > + struct fp_crunch_struct *fp = &tsk->thread_info->fpstate.crunch; > +#ifdef CONFIG_EP93XX_CRUNCH_ACC > + /* > + * same as above, but reversed. if you put the call below the > 'asm' > + * code then you'll corrupt the > + */ > + restore_accumulators(tsk); > +#endif > + asm volatile ( > + "ldc p5, c15, [%2, #0]\n\t" // "cfldr32 mvfx15, > [%2, #0]\n\t" > + "cdp p4, 2, c15, c0, c0, 7\n\t" // "cfmvsc32 > dspsc, mvdx15\n\t" > + "ldcl p5, c0, [%0],#8\n\t" // "cfldr64 mvdx0, > [%0], 8\n\t" > + "ldcl p5, c1, [%0],#8\n\t" // "cfldr64 mvdx1, > [%0], 8\n\t" > + "ldcl p5, c2, [%0],#8\n\t" // "cfldr64 mvdx2, > [%0], 8\n\t" > + "ldcl p5, c3, [%0],#8\n\t" // "cfldr64 mvdx3, > [%0], 8\n\t" > + "ldcl p5, c4, [%0],#8\n\t" // "cfldr64 mvdx4, > [%0], 8\n\t" > + "ldcl p5, c5, [%0],#8\n\t" // "cfldr64 mvdx5, > [%0], 8\n\t" > + "ldcl p5, c6, [%0],#8\n\t" // "cfldr64 mvdx6, > [%0], 8\n\t" > + "ldcl p5, c7, [%0],#8\n\t" // "cfldr64 mvdx7, > [%0], 8\n\t" > + "ldcl p5, c8, [%0],#8\n\t" // "cfldr64 mvdx8, > [%0], 8\n\t" > + "ldcl p5, c9, [%0],#8\n\t" // "cfldr64 mvdx9, > [%0], 8\n\t" > + "ldcl p5, c10, [%0],#8\n\t" // "cfldr64 mvdx10, > [%0], 8\n\t" > + "ldcl p5, c11, [%0],#8\n\t" // "cfldr64 mvdx11, > [%0], 8\n\t" > + "ldcl p5, c12, [%0],#8\n\t" // "cfldr64 mvdx12, > [%0], 8\n\t" > + "ldcl p5, c13, [%0],#8\n\t" // "cfldr64 mvdx13, > [%0], 8\n\t" > + "ldcl p5, c14, [%0],#8\n\t" // "cfldr64 mvdx14, > [%0], 8\n\t" > + "ldcl p5, c15, [%0, #0]" // > "cfldr64 > mvdx15, [%0, #0]" > + :"=&r" (tmp) > + :"0" (&fp->regs[0]), "r" (&fp->dspsc) > + :"memory"); > +} > + > +void crunch_exception(int irq, void *dev_id, struct pt_regs *regs) > +{ > + int sc, opc; > + > + send_sig(SIGFPE, current, 1); > + opc = read_dspsc_high(); > + sc = read_dspsc_low(); > + printk("%s: DSPSC_high=%08x, DSPSC_low=%08x\n", __FUNCTION__, > opc, > sc); > + sc &= ~(1 << 21); /* we recure without this */ > + write_dspsc(sc); > +} > + > +/* > + * only register ep9312 default FPU handler... > + */ > +__init int setup_crunch(void) > +{ > + int res; > + > + res = request_irq(CRUNCH_IRQ, crunch_exception, SA_INTERRUPT, > "FPU", NULL); > + if (res) { > + printk("Crunch IRQ (%d) allocation failure\n", > CRUNCH_IRQ); > + return res; > + } > + > + return res; > +} > + > +static inline int insn_is_crunch(long insn) > +{ > + long tmp; > + > + tmp = (insn >> 24) & 0x0e; > + /* cdp, mcr, mrc */ > + if (tmp == 0x0e || tmp == 0x0c) { > + tmp = (insn >> 8) & 0x0f; > + if (tmp == 4) > + return 1; > + if (tmp == 5) > + return 1; > + if (tmp == 6) > + return 1; > + } > + > + return 0; > +} > + > +int crunch_opcode(struct pt_regs *regs) > +{ > + long *insn; > + struct task_struct *tsk = current; > + > + insn = (long *) (instruction_pointer(regs) - 4); > +// printk("insn : %08lx \n", insn); > + if (!insn_is_crunch(*insn)) { > + /* > + * not a crunch instruction, but might be another > + * (FPA/VFP) floating point one > + */ > +// printk("No Crunch %08lx \n", insn); > + return 0; > + } > + > +// printk("Crunch %08lx \n", insn); > + crunch_enable(); > +// printk("crunch_enable\n"); > + regs->ARM_pc -= 4; /* restart the Crunch instruction > */ > + if (tsk->flags & PF_USEDCRUNCH) { > + restore_crunch(tsk); > + } else { > + crunch_init(); > + } > + tsk->flags |= PF_USEDFPU; > + return 1; > +} > + > +void crunch_in(void) > +{ > + printk("in !\n"); > +} > + > +void crunch_out(void) > +{ > + printk("out !\n"); > +} > + > +void crunch_out2(void) > +{ > + printk("out2 !\n"); > +} > + > +__initcall(setup_crunch); > diff -urN linux-2.6.11.7/arch/arm/mach-ep93xx/dma_ep93xx.c > linux-2.6.11.7-eb/arch/arm/mach-ep93xx/dma_ep93xx.c > --- linux-2.6.11.7/arch/arm/mach-ep93xx/dma_ep93xx.c 2005-05-15 > 22:34:17.000000000 +0200 > +++ linux-2.6.11.7-eb/arch/arm/mach-ep93xx/dma_ep93xx.c 2005-05-12 > 20:46:41.000000000 +0200 > @@ -50,7 +50,7 @@ > #undef DEBUG > /*#define DEBUG 1 */ > #ifdef DEBUG > -#define DPRINTK( x... ) printk( ##x ) > +#define DPRINTK( x... ) printk( x ) > #else > #define DPRINTK( x... ) > #endif > @@ -92,6 +92,7 @@ > { > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA channel # from the handle. > */ > @@ -138,6 +139,7 @@ > ep93xx_dma_dev_t dma_int = UNDEF_INT; > unsigned int read_back, loop, uiCONTROL, uiINTERRUPT; > > + DPRINTK("%s \n", __FUNCTION__); > loop = inl(M2M_reg_base+M2M_OFFSET_INTERRUPT); > > /* > @@ -150,7 +152,7 @@ > else if( inl(M2M_reg_base+M2M_OFFSET_INTERRUPT) & INTERRUPT_M2M_DONEINT > ) > dma_int = DONE; > > - DPRINTK("IRQ: b=%#x st=%#x\n", (int)dma->current_buffer->source, > dma_int); > + DPRINTK("IRQ: b=%#x st=%#x\n", (int)dma->current_buffer/*->source*/, > dma_int); > > /* > * Stall Interrupt: The Channel is stalled, meaning nothing is > @@ -321,15 +323,14 @@ > > DPRINTK("End of stall handling. \n"); > DPRINTK("STATUS - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_STATUS) ); > - DPRINTK("CONTROL - 0x%x \n", > inl(M2M_reg_base+M2M_CONTROL.Value) ); > - DPRINTK("REMAIN - 0x%x \n", > inl(M2M_reg_base+M2M_REMAIN.Value) ); > - DPRINTK("PPALLOC - 0x%x \n", > inl(M2M_reg_base+M2M_PPALLOC.Value) ); > - DPRINTK("BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_BASE0.Value) ); > - DPRINTK("MAXCNT0 - 0x%x \n", > inl(M2M_reg_base+M2M_MAXCNT0.Value) ); > - DPRINTK("CURRENT0 - 0x%x \n", > inl(M2M_reg_base+M2M_CURRENT0.Value) ); > - DPRINTK("BASE1 - 0x%x \n", > inl(M2M_reg_base+M2M_BASE1.Value) ); > - DPRINTK("MAXCNT1 - 0x%x \n", > inl(M2M_reg_base+M2M_MAXCNT1.Value) ); > - DPRINTK("CURRENT1 - 0x%x \n", > inl(M2M_reg_base+M2M_CURRENT1.Value) ); > +// DPRINTK("CONTROL - 0x%x \n", > inl(M2M_reg_base+M2M_CONTROL.Value) ); > +// DPRINTK("REMAIN - 0x%x \n", > inl(M2M_reg_base+M2M_REMAIN.Value) ); > +// DPRINTK("PPALLOC - 0x%x \n", > inl(M2M_reg_base+M2M_PPALLOC.Value) ); > +// DPRINTK("BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_BASE0.Value) > ); > +// DPRINTK("MAXCNT0 - 0x%x \n", > inl(M2M_reg_base+M2M_MAXCNT0.Value) ); > +// DPRINTK("CURRENT0 - 0x%x \n", > inl(M2M_reg_base+M2M_CURRENT0.Value) ); > +// DPRINTK("BASE1 - 0x%x \n", > inl(M2M_reg_base+M2M_BASE1.Value) > ); > +// DPRINTK("MAXCNT1 - 0x%x \n", > inl(M2M_reg_base+M2M_MAXCNT1.Value) ); > > DPRINTK("Buffer buf_id source size last > used \n"); > for(loop = 0; loop < 32; loop ++) > @@ -437,7 +438,7 @@ > DPRINTK("End of NFB handling. \n"); > DPRINTK("STATUS - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_STATUS) ); > DPRINTK("CONTROL - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_CONTROL) ); > - DPRINTK("REMAIN - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_REMAIN) ); > +/* DPRINTK("REMAIN - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_REMAIN) ); > DPRINTK("PPALLOC - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_PPALLOC) ); > DPRINTK("BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_BASE0) ); > DPRINTK("MAXCNT0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_MAXCNT0) ); > @@ -445,7 +446,7 @@ > DPRINTK("BASE1 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_BASE1) ); > DPRINTK("MAXCNT1 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_MAXCNT1) ); > DPRINTK("CURRENT1 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_CURRENT1) ); > - > +*/ > DPRINTK("Buffer buf_id source size last > used \n"); > for(loop = 0; loop < 32; loop ++) > { > @@ -587,7 +588,7 @@ > > DPRINTK("STATUS - 0x%x \n", inl(M2M_reg_base+M2M_OFFSET_STATUS) > ); > DPRINTK("CONTROL - 0x%x \n", inl(M2M_reg_base+M2M_OFFSET_CONTROL) > ); > - DPRINTK("SAR_BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_SAR_BASE0) ); > + /* DPRINTK("SAR_BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_SAR_BASE0) ); > DPRINTK("DAR_BASE0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_DAR_BASE0) ); > DPRINTK("SAR_CURRENT0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_SAR_CURRENT0) ); > DPRINTK("DAR_CURRENT0 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_DAR_CURRENT0) ); > @@ -595,6 +596,7 @@ > DPRINTK("SAR_BASE1 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_SAR_BASE1) ); > DPRINTK("DAR_BASE1 - 0x%x \n", > inl(M2M_reg_base+M2M_OFFSET_DAR_BASE1) > ); > DPRINTK("BCR1 - 0x%x \n", inl(M2M_reg_base+M2M_OFFSET_BCR1) ); > + */ > > > /* > @@ -639,6 +641,7 @@ > ep93xx_dma_dev_t dma_int = UNDEF_INT; > unsigned int loop, uiCONTROL, uiINTERRUPT; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Determine what kind of dma interrupt this is. > */ > @@ -801,7 +804,7 @@ > > DPRINTK("STATUS - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_STATUS) ); > DPRINTK("CONTROL - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_CONTROL) ); > - DPRINTK("REMAIN - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_REMAIN) ); > + /*DPRINTK("REMAIN - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_REMAIN) ); > DPRINTK("PPALLOC - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_PPALLOC) ); > DPRINTK("BASE0 - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_BASE0) ); > DPRINTK("MAXCNT0 - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_MAXCNT0) ); > @@ -809,6 +812,7 @@ > DPRINTK("BASE1 - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_BASE1) ); > DPRINTK("MAXCNT1 - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) ); > DPRINTK("CURRENT1 - 0x%x \n", > inl(M2P_reg_base+M2P_OFFSET_CURRENT1) ); > + */ > > DPRINTK("Buffer buf_id source size last > used \n"); > for(loop = 0; loop < 32; loop ++) > @@ -1070,8 +1074,9 @@ > int channel = -1; > unsigned int loop; > unsigned int M2P_reg_base; > - unsigned int uiPWRCNT; > + unsigned int uiPWRCNT; > > + DPRINTK("%s \n", __FUNCTION__); > DPRINTK("DMA Open M2P with hw dev %d\n", device); > > > @@ -1282,6 +1287,7 @@ > unsigned int M2M_reg_base; > unsigned int uiPWRCNT, uiCONTROL; > > + DPRINTK("%s \n", __FUNCTION__); > DPRINTK("DMA Open M2M with hw dev %d\n", device); > > /* > @@ -1528,6 +1534,7 @@ > unsigned long flags; > unsigned int M2M_reg_base, uiCONTROL; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Make sure the channel is disabled before configuring the channel. > * > @@ -1650,6 +1657,7 @@ > unsigned int M2M_reg_base = dma->reg_base; > unsigned int uiCONTROL; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Mask interrupts while we get this started. > */ > @@ -1767,7 +1775,7 @@ > > DPRINTK("DMA - It's been started!!"); > DPRINTK("STATUS - 0x%x \n", inl(M2M_reg_base+M2M_OFFSET_STATUS) ); > - DPRINTK("CONTROL - 0x%x \n", inl(M2M_reg_base+M2M_CONTROL.Value) ); > + /*DPRINTK("CONTROL - 0x%x \n", inl(M2M_reg_base+M2M_CONTROL.Value) ); > DPRINTK("REMAIN - 0x%x \n", inl(M2M_reg_base+M2M_REMAIN.Value) ); > DPRINTK("PPALLOC - 0x%x \n", inl(M2M_reg_base+M2M_PPALLOC.Value) ); > DPRINTK("BASE0 - 0x%x \n", inl(M2M_reg_base+M2M_BASE0.Value) ); > @@ -1785,6 +1793,7 @@ > DPRINTK("current buffer - %d \n", dma_pointers[0]->current_buffer); > DPRINTK("last buffer - %d \n", dma_pointers[0]->last_buffer); > DPRINTK("used buffers - %d \n", dma_pointers[0]->used_buffers); > + */ > > /* > * Unmask irqs > @@ -1834,6 +1843,7 @@ > unsigned long flags; > unsigned int M2P_reg_base, uiCONTROL; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -1969,6 +1979,7 @@ > unsigned long flags; > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2237,6 +2248,7 @@ > ep93xx_dma_t * dma; > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2363,6 +2375,7 @@ > ep93xx_dma_t *dma; > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2471,6 +2484,7 @@ > int channel; > unsigned int M2M_reg_base, M2P_reg_base; > > + DPRINTK("%s \n", __FUNCTION__); > DPRINTK("ep93xx_dma_pause \n"); > > /* > @@ -2579,6 +2593,7 @@ > int channel; > unsigned int M2P_reg_base; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2665,6 +2680,7 @@ > unsigned long flags; > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2735,6 +2751,7 @@ > int channel; > ep93xx_dma_t * dma; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2786,6 +2803,7 @@ > { > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -2837,6 +2855,7 @@ > unsigned int loop; > unsigned int M2P_reg_base; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Check if the device requesting a DMA channel is a valid device. > */ > @@ -2998,7 +3017,7 @@ > DPRINTK("CURRENT0 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_CURRENT0) ); > DPRINTK("BASE1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_BASE1) ); > DPRINTK("MAXCNT1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_MAXCNT1) ); > - DPRINTK("CURRENT1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_CURRENT1) ); > + //DPRINTK("CURRENT1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_CURRENT1) > ); > > DPRINTK("Buffer source size last used \n"); > for(loop = 0; loop < 5; loop ++) > @@ -3020,7 +3039,7 @@ > DPRINTK("last buffer - %d \n", dma->last_buffer); > DPRINTK("used buffers - %d \n", dma->used_buffers); > > - DPRINTK("CURRENT1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_CURRENT1) ); > + //DPRINTK("CURRENT1 - 0x%x \n", inl(M2P_reg_base+M2P_OFFSET_CURRENT1) > ); > DPRINTK("VIC0IRQSTATUS - 0x%x, VIC0INTENABLE - 0x%x \n", > *(unsigned int *)(VIC0IRQSTATUS), > *(unsigned int *)(VIC0INTENABLE)); > @@ -3047,6 +3066,7 @@ > unsigned int M2M_reg_base, M2P_reg_base, uiCONTROL; > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Get the DMA hw channel # from the handle. > */ > @@ -3138,6 +3158,7 @@ > { > int channel; > > + DPRINTK("%s \n", __FUNCTION__); > /* > * Init some values in each dma instance. > */ > diff -urN linux-2.6.11.7/arch/arm/mach-ep93xx/Kconfig > linux-2.6.11.7-eb/arch/arm/mach-ep93xx/Kconfig > --- linux-2.6.11.7/arch/arm/mach-ep93xx/Kconfig 2005-05-15 > 22:34:17.000000000 +0200 > +++ linux-2.6.11.7-eb/arch/arm/mach-ep93xx/Kconfig 2005-05-12 > 20:47:25.000000000 +0200 > @@ -138,6 +138,13 @@ > Say Y here if you want to enable DMA Support for EP93XX family > CPUs. > > +config EP93XX_CRUNCH > + bool "EP93xx MaverickCrunch Support" > + depends on ARCH_EP9302 || ARCH_EP9312 || ARCH_EP9315 > + default n > + help > + Say Y here if you want to enable MaverickCrunch support for > EP93XX family CPUs. > + > config ARCH_EP93XX_IDE > bool "EP93XX IDE Support" > depends on ARCH_EP9312 || ARCH_EP9315 > diff -urN linux-2.6.11.7/arch/arm/mach-ep93xx/Makefile > linux-2.6.11.7-eb/arch/arm/mach-ep93xx/Makefile > --- linux-2.6.11.7/arch/arm/mach-ep93xx/Makefile 2005-05-15 > 22:34:17.000000000 +0200 > +++ linux-2.6.11.7-eb/arch/arm/mach-ep93xx/Makefile 2005-05-12 > 20:47:59.000000000 +0200 > @@ -19,6 +19,7 @@ > obj-$(CONFIG_MACH_ZEFEERDZQ) += mach-zefeerdzq.o > > obj-$(CONFIG_EP93XX_DMA) += dma_ep93xx.o > +obj-$(CONFIG_EP93XX_CRUNCH) += crunch.o > > obj-$(CONFIG_EP93XX_SSP_LINUX) += ssp.o ssp2.o > obj-$(CONFIG_EP93XX_SSP_CIRRUS) += ssp-cirrus.o > diff -urN linux-2.6.11.7/arch/arm/Makefile > linux-2.6.11.7-eb/arch/arm/Makefile > --- linux-2.6.11.7/arch/arm/Makefile 2005-05-15 > 22:34:17.000000000 > +0200 > +++ linux-2.6.11.7-eb/arch/arm/Makefile 2005-05-12 > 20:49:35.000000000 > +0200 > @@ -59,8 +59,8 @@ > > # Need -Uarm for gcc < 3.x > CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) > -CFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call > cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) > -msoft-float > -Uarm > -AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) > -msoft-float > +CFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call > cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) > -msoft-float > -Wa,-mcpu=ep9312 -Uarm > +AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) > -msoft-float > -Wa,-mcpu=ep9312 > > CHECKFLAGS += -D__arm__ > > diff -urN linux-2.6.11.7/drivers/video/ep93xxfb.c > linux-2.6.11.7-eb/drivers/video/ep93xxfb.c > --- linux-2.6.11.7/drivers/video/ep93xxfb.c 2005-05-15 > 22:34:18.000000000 +0200 > +++ linux-2.6.11.7-eb/drivers/video/ep93xxfb.c 2005-05-12 > 21:18:01.000000000 +0200 > @@ -622,7 +622,9 @@ > * For kernel boot options (in 'video=xxxfb:<options>' format) > */ > > - fb_get_options("ep93xxfb", &option); > + if (fb_get_options("ep93xxfb", &option)) > + return -ENODEV; > + > ep93xxfb_setup(option); > > /* init all the important stuff in info */ > diff -urN linux-2.6.11.7/include/asm-arm/arch-ep93xx/crunch.h > linux-2.6.11.7-eb/include/asm-arm/arch-ep93xx/crunch.h > --- linux-2.6.11.7/include/asm-arm/arch-ep93xx/crunch.h 2005-05-15 > 22:34:18.000000000 +0200 > +++ linux-2.6.11.7-eb/include/asm-arm/arch-ep93xx/crunch.h 2005-05-12 > 21:18:27.000000000 +0200 > @@ -1,6 +1,8 @@ > #ifndef __asm_crunch_h__ > #define __asm_crunch_h__ > > +#include "asm/arch/regmap.h" > + > #define CRUNCH_INIT 0x00900000 > #define CRUNCH_IRQ 58 > > diff -urN linux-2.6.11.7/include/asm-arm/fpstate.h > linux-2.6.11.7-eb/include/asm-arm/fpstate.h > --- linux-2.6.11.7/include/asm-arm/fpstate.h 2005-04-07 > 20:58:31.000000000 +0200 > +++ linux-2.6.11.7-eb/include/asm-arm/fpstate.h 2005-05-15 > 22:31:08.000000000 +0200 > @@ -59,12 +59,28 @@ > unsigned int save[0x98/sizeof(int) + 1]; > }; > > +#ifdef CONFIG_EP93XX_CRUNCH > +struct fp_crunch_struct { > + long long regs[16]; > +#ifdef CONFIG_EP93XX_CRUNCH_ACC > + int acc0[3]; > + int acc1[3]; > + int acc2[3]; > + int acc3[3]; > +#endif > + unsigned long dspsc; > +}; > +#endif > + > union fp_state { > struct fp_hard_struct hard; > struct fp_soft_struct soft; > #ifdef CONFIG_IWMMXT > struct iwmmxt_struct iwmmxt; > #endif > +#ifdef CONFIG_EP93XX_CRUNCH > + struct fp_crunch_struct crunch; > +#endif > }; > > #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) > diff -urN linux-2.6.11.7/include/asm-arm/system.h > linux-2.6.11.7-eb/include/asm-arm/system.h > --- linux-2.6.11.7/include/asm-arm/system.h 2005-05-15 > 22:34:18.000000000 +0200 > +++ linux-2.6.11.7-eb/include/asm-arm/system.h 2005-05-12 > 21:23:12.000000000 +0200 > @@ -159,6 +159,19 @@ > #define task_running(rq,p) > \ > ((rq)->curr == (p) || spin_is_locked(&(p)->switch_lock)) > > +#ifdef CONFIG_EP93XX_CRUNCH > +#include <asm/arch/crunch.h> > +#define crunch_switch(prev, next) \ > + do { > \ > + if (prev->flags & PF_USEDFPU) { > \ > + save_crunch(prev); > \ > + crunch_disable(); > \ > + } > \ > + prev->flags &= ~PF_USEDFPU; \ > + } while (0) > +#else > +#define crunch_switch(prev, next) do { } while (0); > +#endif > /* > * switch_to(prev, next) should switch from task `prev' to `next' > * `prev' will never be the same as `next'. schedule() itself > @@ -168,6 +181,7 @@ > > #define switch_to(prev,next,last) > \ > do { > \ > + crunch_switch(prev, next); > \ > last = __switch_to(prev,prev->thread_info,next->thread_info); > \ > } while (0) > > diff -urN linux-2.6.11.7/include/linux/sched.h > linux-2.6.11.7-eb/include/linux/sched.h > --- linux-2.6.11.7/include/linux/sched.h 2005-05-15 > 22:34:18.000000000 > +0200 > +++ linux-2.6.11.7-eb/include/linux/sched.h 2005-05-12 > 21:23:43.000000000 +0200 > @@ -712,6 +712,7 @@ > do { if (atomic_dec_and_test(&(tsk)->usage)) __put_task_struct(tsk); } > while(0) > > #ifdef CONFIG_EP93XX_CRUNCH > +#define PF_USEDFPU 0x00100000 /* task used FPU this > quantum > (SMP) */ > #define PF_USEDCRUNCH 0x00200000 /* introduced to > preserve PF_USEDFPU > meaning > across > the architecture */ > #endif > > > > > > > > > > > > --