[U-Boot] [PATCH v2 06/10] powerpc/ppc4xx: Use generic FPGA accessors on all gdsys 405ep/ex boards

Dirk Eibach dirk.eibach at gdsys.cc
Tue May 7 22:45:22 CEST 2013


Hi Wolfgang,

in my example we have four FPGAs. One is memory mapped while the other 
three are not.
They all have the same register interface which is mapped by
   struct ihs_fpga {
	u16 reflection_low;
	u16 versions;
	...
	u16 mc_tx_address;
	u16 mc_tx_data;
	u16 mc_tx_cmd;
	...
   };

To have instances of those FPGA structs, we might create an array like 
this:
   struct ihs_fpga system_fpgas[] = {
	(struct ihs_fpga *)CONFIG_SYS_FPGA_BASE,
	(struct ihs_fpga *)NULL,
	(struct ihs_fpga *)NULL,
	(struct ihs_fpga *)NULL,
   };
The first element ist our memory mapped FPGA with base address 
CONFIG_SYS_FPGA_BASE. For the other three I use NULL as base address 
because I don't have any better idea what else to choose.

To probe those FPGAs we might have to do something like:
   for (k=0; k < 4; ++k)
	fpga_set_reg(k, &system_fpgas[k].reflection_low, 
REFLECTION_TESTPATTERN);

The implementation of fpga_set_reg() might look like:

void fpga_set_reg(unsigned int fpga, u16 *reg, u16 data)
{
	switch (fpga) {
	case 0:
		out_le16(reg, data);
		break;
	default:
		mclink_send(fpga - 1, (u16)reg, data);
		break;
	}
}

where mclink_send() is the routine to access the non memory mapped 
FPGAs through the memory mapped FPGA:
   int mclink_send(u8 slave, u16 addr, u16 data)
   {
	...
	fpga_set_reg(0, &system_fpgas[0].mc_tx_address, addr);
	fpga_set_reg(0, &system_fpgas[0].mc_tx_data, data);
	fpga_set_reg(0, &system_fpgas[0].mc_tx_cmd, (slave & 0x03) << 14);
   }

The cast to u16 I am talking about happens, when mclink_send() is 
called.

Cheers
Dirk


More information about the U-Boot mailing list