[U-Boot-Users] possible ELDK4 gcc compiler bug

Matthias Fuchs matthias.fuchs at esd-electronics.com
Thu Dec 7 17:21:10 CET 2006


Hi,

I noticed some strange behavior when using the ELDK4 gcc for compiling 
U-Boot for a (new) 405 target based on the current PMC405 board.

The code needs to read-modify-write a memory mapped FPGA internal register.
But the FPGA access does not appear in the object and therefore it is never 
done.

Here are some code snippets:

1) my 'fifo' BSP command:

int do_fifo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	struct pmc405v2_fpga_s *fpga = (struct pmc405v2_fpga_s *)FPGA_BA;
	int i;
	int n = 0;
	u32 ctrl, data, f;
	char str[] = "\\|/-";
	int abort = 0;
	int count = 0;
	int count2 = 0;

	switch(argc) {
	case 2:
		/* completely read out fifo 'n' */
		if (!strcmp(argv[1],"read")) {
			printf("  #   fifo level data\n");
			printf("__________________________________\n");

			for (i=0; i<FIFO_COUNT; i++) {
				dump_fifo(fpga, i, &n);
			}
		} else if (!strcmp(argv[1],"wait")) {
			got_fifoirq = 0;

			irq_install_handler (FPGA_IRQ,
					     (interrupt_handler_t *)fpga_interrupt,
					     (void*)fpga);

			printf("  #   fifo level data\n");
			printf("__________________________________\n");

			fpga->ctrl |= CTRL_FIFO_IE;
			for (i=0; i<FIFO_COUNT; i++) {
				/* enable interrupts from all fifos */
				printf("DEBUG1: %p:%08x\n", 
				       &(fpga->fifo[i].ctrl), fpga->fifo[i].ctrl);
--> These RMW-ops do not appear in the object and is never done!
-->				fpga->fifo[i].ctrl |= 0x8000;
				printf("DEBUG2: %p:%08x\n", 
				       &(fpga->fifo[i].ctrl), fpga->fifo[i].ctrl);
			}

			while (1) {
				/* wait loop */
				while(!got_fifoirq) {
...


2) Here are the used structs for the fpga variable:
struct pmc405v2_fifo_s {
	volatile u32 data;
	volatile u32 ctrl;
};

/* fifo ctrl register */
#define FIFO_OVERFLOW   0x00000400
#define FIFO_EMPTY      0x00000200
#define FIFO_FULL       0x00000100
#define FIFO_IE         0x00008000
#define FIFO_LEVEL_MASK 0x000000ff

#define FIFO_COUNT      4

struct pmc405v2_fpga_s {
	volatile u32 ctrl;
	volatile u32 status;
	volatile u32 test1;
	volatile u32 test2;
	u32 pad1[0x60 / sizeof(u32) - 4];
	volatile u32 hostctrl;                   /* 0x0060 */
	u32 pad2[0x20 / sizeof(u32) - 1];
	struct pmc405v2_fifo_s fifo[FIFO_COUNT]; /* 0x0080..0x009f */
};


3) Here are some lines from the objectdump. I do not find anything from the 
RMW-op to the FPGA register (fpga->fifo[i].ctrl |= 0x8000;).


/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:556
     dd8:       48 00 00 01     bl      dd8 <do_fifo+0x178>
                        dd8: R_PPC_PLTREL24     printf
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:558
     ddc:       3d 20 ef 00     lis     r9,-4352
     de0:       80 09 00 00     lwz     r0,0(r9)
     de4:       3b 40 00 00     li      r26,0
     de8:       60 00 02 00     ori     r0,r0,512
     dec:       90 09 00 00     stw     r0,0(r9)
     df0:       7f 7f db 78     mr      r31,r27
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:561
                        for (i=0; i<FIFO_COUNT; i++) {
                                /* enable interrupts from all fifos */
                                printf("DEBUG1: %p:%08x\n",
     df4:       83 9b 00 00     lwz     r28,0(r27)
     df8:       80 7e 80 cc     lwz     r3,-32564(r30)
     dfc:       7f e4 fb 78     mr      r4,r31
     e00:       7f 85 e3 78     mr      r5,r28
     e04:       48 00 00 01     bl      e04 <do_fifo+0x1a4>
                        e04: R_PPC_PLTREL24     printf
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:564
                                       &(fpga->fifo[i].ctrl), 
fpga->fifo[i].ctrl);
                                fpga->fifo[i].ctrl |= 0x8000;
                                printf("DEBUG2: %p:%08x\n",
     e08:       80 7e 80 d0     lwz     r3,-32560(r30)
     e0c:       7f e4 fb 78     mr      r4,r31
     e10:       7f 85 e3 78     mr      r5,r28
     e14:       48 00 00 01     bl      e14 <do_fifo+0x1b4>
                        e14: R_PPC_PLTREL24     printf
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:559
     e18:       2f 9a 00 03     cmpwi   cr7,r26,3
     e1c:       3b ff 00 08     addi    r31,r31,8
     e20:       3b 7b 00 08     addi    r27,r27,8
     e24:       3b 5a 00 01     addi    r26,r26,1
     e28:       40 9e ff cc     bne+    cr7,df4 <do_fifo+0x194>
     e2c:       3b e0 00 00     li      r31,0
     e30:       48 00 00 6c     b       e9c <do_fifo+0x23c>
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:571
                                       &(fpga->fifo[i].ctrl), 
fpga->fifo[i].ctrl);
                        }

                        while (1) {
                                /* wait loop */
                                while(!got_fifoirq) {
                                        count++;
     e34:       3b ff 00 01     addi    r31,r31,1
/data/home/matthias/projects/pmc405/V2_u-boot.git/board/esd/pmc405v2/cmd_pmc405v2.c:572


4) This is how the compiler is called for the code file:
ppc_4xx-gcc -g  -Os   -fPIC -ffixed-r14 -meabi -fno-strict-aliasing -D__KERNEL__ -DTEXT_BASE=0xFFF80000 
-I/data/home/matthias/projects/pmc405/V2_u-boot.git/include -fno-builtin -ffreestanding -nostdinc 
-isystem /opt/eldk_400/usr/bin/../lib/gcc/powerpc-linux/4.0.0/include -pipe  -DCONFIG_PPC -D__powerpc__ 
-DCONFIG_4xx -ffixed-r2 -ffixed-r29 -mstring -Wa,-m405 -mcpu=405 -msoft-float -Wall -Wstrict-prototypes -c -o
cmd_pmc405v2.o cmd_pmc405v2.c


Any idea about what I am doing wrong?

BTW: Using -O0 instead of -Os makes everything fine - at least for the code 
above.

Matthias

-- 
-----------------------------------------------------------------------
Dipl.-Ing. Matthias Fuchs             esd electronic system design gmbh
http://www.esd-electronics.com                    Vahrenwalder Str. 207
phone: +49-511-37298-0, fax: -68                30165 Hannover, Germany
-----------------------------------------------------------------------





More information about the U-Boot mailing list