Tim,
thanks for the reply.
The values that I have received are expected and agreed on the FPGA eng.
Here is the code:
for (unsigned int i = 0; i < ResourcesCount; ++i)
{
desc = WdfCmResourceListGetDescriptor(ResourcesTranslated, i);
if (!desc)
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_INIT, “%!FUNC! WdfResourceCmGetDescriptor failed”);
return STATUS_DEVICE_CONFIGURATION_ERROR;
}
switch (desc->Type)
{
case CmResourceTypeMemory:
if (!foundREGS && (desc->u.Memory.Length == FPGA_BAR0_LENGTH))
{
REGSBasePA = desc->u.Memory.Start;
REGSLength = desc->u.Memory.Length;
foundREGS = TRUE;
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Memory Resource [%I64X-%I64X] BAR0”,
desc->u.Memory.Start.QuadPart,
desc->u.Memory.Start.QuadPart + desc->u.Memory.Length-1);
}
else
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Memory Resource [%I64X-%I64X] ”,
desc->u.Memory.Start.QuadPart,
desc->u.Memory.Start.QuadPart + desc->u.Memory.Length);
break;
case CmResourceTypePort:
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Port Resource [%08I64X-%08I64X] ”,
desc->u.Port.Start.QuadPart,
desc->u.Port.Start.QuadPart + desc->u.Port.Length);
break;
case CmResourceTypeInterrupt:
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Interrupt Level %x Vector %x Affinity %08I64X”,
desc->u.Interrupt.Level,
desc->u.Interrupt.Vector,
desc->u.Interrupt.Affinity);
break;
case CmResourceTypeDevicePrivate:
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Device Private”);
break;
default:
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Unknown Resource Type %d”, desc->Type);
break;
}
}
if (foundREGS)
{
deviceContext->RegsBase = (PUCHAR) MmMapIoSpace(REGSBasePA,
REGSLength,
MmNonCached );
if (!deviceContext->RegsBase)
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_INIT,
“%!FUNC! - Unable to map Registers memory %08I64X, length %d”,
REGSBasePA.QuadPart,
REGSLength);
return STATUS_INSUFFICIENT_RESOURCES;
}
deviceContext->RegsLength = REGSLength;
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_INIT,
“%!FUNC! - Registers %p, length %x”,
deviceContext->RegsBase,
deviceContext->RegsLength
);
//
// Just for testing
//
UINT64 val = READ_REGISTER_ULONG64((volatile UINT64*)deviceContext->RegsBase);
This code is not going to be used on a 32bit machine, because the FPGA supports only 64it wide data, as I understand it a 32bit machine cannot access 64bit wide data.
The current system is running on an HPZ220 station with a Xilinx (Artix7) Evaluation board, with a Xilinx PCIe core. So actually the FPGA is sitting behind a bridge as it is on bus 2. Does it make a difference, once the CPU already provided a mapped memory?
Igal