This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PCIe outbound address translation changes between C6678 v1 and v2 silicon?

We are unable to read back correctly on the outbound address on v2 silicon, where it does work on v1 silicon.

C66xx is in EP mode, and needs to talk to our FPGA device via PCIe.

The FPGA has 2 4MB bars.

The host sends a message to the DSP and tells the PCIe bar addresses.

The DSP does the setup of the outbound address translation.

Printing the application registers here:

read register 0x00000000, value 0x4e301101: v2 silicon

read register 0x00000004, value 0x00000007

read register 0x00000008, value 0x00000000

read register 0x0000000c, value 0x00000000

read register 0x00000010, value 0x00000000

read register 0x00000014, value 0x00010000

read register 0x00000020, value 0x00000000

read register 0x00000024, value 0x00000000

read register 0x00000028, value 0x00000000

read register 0x00000030, value 0x00000002 : 4MB outbound translation window

read register 0x00000034, value 0x00000000

read register 0x00000038, value 0x00000000

read register 0x0000003c, value 0x00000000

read register 0x00000050, value 0x00000000

read register 0x00000054, value 0x00000000

read register 0x00000064, value 0x00000000

read register 0x00000068, value 0x00000000

read register 0x0000006c, value 0x00000000

read register 0x00000070, value 0x00000000

read register 0x00000074, value 0x00000000

read register 0x00000078, value 0x00000000

read register 0x0000007c, value 0x00000000

read register 0x00000100, value 0x00000001

read register 0x00000104, value 0x00000001

read register 0x00000108, value 0x00000001

read register 0x0000010c, value 0x00000001

read register 0x00000110, value 0x00000000

read register 0x00000114, value 0x00000000

read register 0x00000118, value 0x00000000

read register 0x0000011c, value 0x00000000

read register 0x00000120, value 0x00000000

read register 0x00000124, value 0x00000000

read register 0x00000128, value 0x00000000

read register 0x0000012c, value 0x00000000

read register 0x00000130, value 0x00000000

read register 0x00000134, value 0x00000000

read register 0x00000138, value 0x00000000

read register 0x0000013c, value 0x00000000

read register 0x00000140, value 0x00000000

read register 0x00000144, value 0x00000000

read register 0x00000148, value 0x00000000

read register 0x0000014c, value 0x00000000

read register 0x00000150, value 0x00000000

read register 0x00000154, value 0x00000000

read register 0x00000158, value 0x00000000

read register 0x0000015c, value 0x00000000

read register 0x00000160, value 0x00000000

read register 0x00000164, value 0x00000000

read register 0x00000168, value 0x00000000

read register 0x0000016c, value 0x00000000

read register 0x00000170, value 0x00000000

read register 0x00000174, value 0x00000000

read register 0x00000178, value 0x00000000

read register 0x0000017c, value 0x00000000

read register 0x00000180, value 0x00000000

read register 0x00000184, value 0x00000000

read register 0x00000188, value 0x00000001

read register 0x0000018c, value 0x00000001

read register 0x00000190, value 0x00000000

read register 0x00000194, value 0x00000000

read register 0x00000198, value 0x00000001

read register 0x0000019c, value 0x00000001

read register 0x000001a0, value 0x00000000

read register 0x000001a4, value 0x00000000

read register 0x000001a8, value 0x00000001

read register 0x000001ac, value 0x00000001

read register 0x000001b0, value 0x00000000

read register 0x000001b4, value 0x00000000

read register 0x000001b8, value 0x00000001

read register 0x000001bc, value 0x00000001

read register 0x000001c0, value 0x00000000

read register 0x000001c4, value 0x00000000

read register 0x000001c8, value 0x00000000

read register 0x000001cc, value 0x00000000

read register 0x000001d0, value 0x00000000

read register 0x000001d4, value 0x00000000

read register 0x000001d8, value 0x00000000

read register 0x000001dc, value 0x00000000

read register 0x00000200, value 0x00000000

read register 0x00000204, value 0x00000000

read register 0x00000208, value 0x00000000

read register 0x0000020c, value 0x00000000

read register 0x00000210, value 0x00000000

read register 0x00000214, value 0x00000000

read register 0x00000218, value 0x00000000

read register 0x0000021c, value 0x00000000

read register 0x00000220, value 0x00000000

read register 0x00000224, value 0x00000000

read register 0x00000228, value 0x00000000

read register 0x0000022c, value 0x00000000

read register 0x00000230, value 0x00000000

read register 0x00000234, value 0x00000000

read register 0x00000238, value 0x00000000

read register 0x0000023c, value 0x00000000

read register 0x00000240, value 0x00000000

read register 0x00000244, value 0x00000000

read register 0x00000248, value 0x00000000

read register 0x0000024c, value 0x00000000

read register 0x00000250, value 0x00000000

read register 0x00000254, value 0x00000000

read register 0x00000258, value 0x00000000

read register 0x0000025c, value 0x00000000

read register 0x00000260, value 0x00000000

read register 0x00000264, value 0x00000000

read register 0x00000268, value 0x00000000

read register 0x0000026c, value 0x00000000

read register 0x00000270, value 0x00000000

read register 0x00000274, value 0x00000000

read register 0x00000278, value 0x00000000

read register 0x0000027c, value 0x00000000

read register 0x00000280, value 0x00000000

read register 0x00000284, value 0x00000000

read register 0x00000288, value 0x00000000

read register 0x0000028c, value 0x00000000

read register 0x00000290, value 0x00000000

read register 0x00000294, value 0x00000000

read register 0x00000298, value 0x00000000

read register 0x0000029c, value 0x00000000

read register 0x000002a0, value 0x00000000

read register 0x000002a4, value 0x00000000

read register 0x000002a8, value 0x00000000

read register 0x000002ac, value 0x00000000

read register 0x000002b0, value 0x00000000

read register 0x000002b4, value 0x00000000

read register 0x000002b8, value 0x00000000

read register 0x000002bc, value 0x00000000

read register 0x000002c0, value 0xa6000001: 1st FPGA BAR (4MB)

read register 0x000002c4, value 0x00000000

read register 0x000002c8, value 0xa6400001: 2nd FPGA BAR (4MB)

read register 0x000002cc, value 0x00000000

read register 0x000002d0, value 0x00000000

read register 0x000002d4, value 0x00000000

read register 0x000002d8, value 0x00000000

read register 0x000002dc, value 0x00000000

read register 0x000002e0, value 0x00000000

read register 0x000002e4, value 0x00000000

read register 0x000002e8, value 0x00000000

read register 0x000002ec, value 0x00000000

read register 0x000002f0, value 0x00000000

read register 0x000002f4, value 0x00000000

read register 0x000002f8, value 0x00000000

read register 0x000002fc, value 0x00000000

read register 0x00000300, value 0x00000001 : IB_BAR0

read register 0x00000304, value 0xac400000

read register 0x00000308, value 0x00000000

read register 0x0000030c, value 0x9f000000

read register 0x00000310, value 0x00000002 : IB_BAR1

read register 0x00000314, value 0xac800000

read register 0x00000318, value 0x00000000

read register 0x0000031c, value 0x9f800000

read register 0x00000320, value 0x00000003 : IB_BAR2

read register 0x00000324, value 0xac880000

read register 0x00000328, value 0x00000000

read register 0x0000032c, value 0x10800000

read register 0x00000330, value 0x00000004 : IB_BAR3

read register 0x00000334, value 0x80000000

read register 0x00000338, value 0x00000000

read register 0x0000033c, value 0x00000000

read register 0x00000380, value 0x00002110

read register 0x00000384, value 0x00000000

read register 0x00000388, value 0x00001333

read register 0x00000390, value 0x000622a0

read register 0x00000394, value 0x000222a0

After setup, we write to 0x66000008, which lands on the 3th 32-bit word in BAR0 of the FPGA: an test inverter register. This write succeeds, as we can check by reading out the value in the FPGA from the host.

However, when reading 0x66000008, this results in a bogus value. (i.e. not the expected value which van be read from the host), for example something like 0x00820CF0.

#define pcie_write_reg(address, data) (*((volatile uint32_t *)address) = data)

#define pcie_read_reg(address) (*((volatile uint32_t *)address)

// SIMPLIFIED CODE

int32_t pcie_fpga_testinv(pcie_cfg_t* pcie_cfg_ptr) {

uint32_t readback;

pcie_write_reg(0x66000008,0x12348765);

readback = pcie_read_reg(0x66000008);

if (readback != 0xEDCB789A) {

return -1;

} else {

return 0;

}

}

Is there something more, we can do to debug this? We find it very strange this works on c6678 v1 silicon but not on c6678 v2 (c6608).