|
@@ -3,6 +3,8 @@
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include "common.h"
|
|
|
+#include "kernels.h"
|
|
|
+#include "gdrapi.h"
|
|
|
#include <pcilib.h>
|
|
|
#include <pcilib/kmem.h>
|
|
|
#include <pcilib/bar.h>
|
|
@@ -18,6 +20,10 @@
|
|
|
|
|
|
int main()
|
|
|
{
|
|
|
+ /* Initialisation of the APIs */
|
|
|
+ assert_cu( cuInit(0) );
|
|
|
+ gdr_t g = gdr_open();
|
|
|
+
|
|
|
/* Try some stuff... */
|
|
|
printf("Using binary data to feed FPGA...\n");
|
|
|
char* data=(char*)calloc(4096,sizeof(*data));
|
|
@@ -25,6 +31,46 @@ int main()
|
|
|
init_to_send(data);
|
|
|
system("/home/mathiasb/sources/gpuFirstComm/launch.sh");
|
|
|
|
|
|
+ /* Manage NVIDIA GPU */
|
|
|
+ printf("\nInitialisation of the GPU\n");
|
|
|
+ CUdevice GPU;
|
|
|
+ CUdevprop GPUProp;
|
|
|
+ assert_cuda( cudaSetDevice(0) );
|
|
|
+ assert_cu( cuDeviceGet(&GPU,0) );
|
|
|
+ assert_cu( cuDeviceGetProperties(&GPUProp,GPU) );
|
|
|
+
|
|
|
+ /* Check context */
|
|
|
+ assert_cu( cuCtxGetDevice(&GPU) );
|
|
|
+ CUcontext cuCtx;
|
|
|
+ assert_cu( cuCtxCreate(&cuCtx,CU_CTX_MAP_HOST,GPU) );
|
|
|
+ assert_cu( cuCtxGetDevice(&GPU) );
|
|
|
+
|
|
|
+ /* Allocate memory on the device, pin and map */
|
|
|
+ uint8_t flagValueToSet = 1;
|
|
|
+ printf("\nMemory mapping with the GPU for pages\n");
|
|
|
+ CUdeviceptr gpuPagePtr;
|
|
|
+ assert_cu( cuMemAlloc(&gpuPagePtr,3*PAGE_SIZE) );
|
|
|
+ assert_cu( cuPointerSetAttribute(&flagValueToSet,CU_POINTER_ATTRIBUTE_SYNC_MEMOPS,gpuPagePtr) );
|
|
|
+ gdr_mh_t GPUMemHandlePage;
|
|
|
+ assert_gdr( gdr_pin_buffer(g,gpuPagePtr,3*PAGE_SIZE,0,0,&GPUMemHandlePage) );
|
|
|
+ void* gpuPageVa;
|
|
|
+ assert_gdr( gdr_map(g,GPUMemHandlePage,&gpuPageVa,3*PAGE_SIZE) );
|
|
|
+ gdr_info_t pageInfo;
|
|
|
+ assert_gdr( gdr_get_info(g,GPUMemHandlePage,&pageInfo) );
|
|
|
+ printf("Bus ptr = %lx\nVA = 0x%lx\nSize = %lu\n",pageInfo.bus_addr,pageInfo.va,pageInfo.mapped_size);
|
|
|
+ printf("Memory mapping with the GPU for descriptors\n");
|
|
|
+ CUdeviceptr gpuDescPtr;
|
|
|
+ assert_cu( cuMemAlloc(&gpuDescPtr,PAGE_SIZE) );
|
|
|
+ assert_cu( cuPointerSetAttribute(&flagValueToSet,CU_POINTER_ATTRIBUTE_SYNC_MEMOPS,gpuDescPtr) );
|
|
|
+ gdr_mh_t GPUMemHandleDesc;
|
|
|
+ assert_gdr( gdr_pin_buffer(g,gpuDescPtr,PAGE_SIZE,0,0,&GPUMemHandleDesc) );
|
|
|
+ void* gpuDescVa;
|
|
|
+ assert_gdr( gdr_map(g,GPUMemHandleDesc,&gpuDescVa,PAGE_SIZE) );
|
|
|
+
|
|
|
+ printf("All set\n");
|
|
|
+ gdr_info_t descInfo;
|
|
|
+ assert_gdr( gdr_get_info(g,GPUMemHandleDesc,&descInfo) );
|
|
|
+ printf("Bus ptr = %lx\nVA = 0x%lx\nSize = %lu\n",descInfo.bus_addr,descInfo.va,descInfo.mapped_size);
|
|
|
|
|
|
/* PCI */
|
|
|
printf("\nSetting up the PCI\n");
|
|
@@ -43,10 +89,9 @@ int main()
|
|
|
exit( EXIT_FAILURE );
|
|
|
}
|
|
|
|
|
|
- const pcilib_bar_info_t *bar_info;
|
|
|
- bar_info = pcilib_get_bar_info(pciCtx, 0);
|
|
|
- printf("Bar: %p (Phys: 0x%lx, Size: 0x%x)\n", bar_info[0].virt_addr, bar_info[0].phys_addr, bar_info[0].size);
|
|
|
-
|
|
|
+ CUdeviceptr dBAR;
|
|
|
+ assert_cu( cuMemHostRegister((void*)pciVa,128,CU_MEMHOSTREGISTER_IOMEMORY) );
|
|
|
+ assert_cu( cuMemHostGetDevicePointer(&dBAR,(void*)pciVa, 0) );
|
|
|
|
|
|
/* Config PCI for Pages*/
|
|
|
pcilib_kmem_handle_t* pciHandlePage;
|
|
@@ -71,8 +116,6 @@ int main()
|
|
|
exit( EXIT_FAILURE );
|
|
|
}
|
|
|
|
|
|
- printf("pciMemPtrPage = %p\npciBusPage = %p\n",pciMemPtrPage,pciBusPage);
|
|
|
-
|
|
|
/* Config PCI for Desc */
|
|
|
pcilib_kmem_handle_t* pciHandleDesc;
|
|
|
pciHandleDesc = pcilib_alloc_kernel_memory(pciCtx,PCILIB_KMEM_TYPE_CONSISTENT, 1, 128, 4096, KMEM_USE_RING, KMEM_DEFAULT_FLAGS);
|
|
@@ -95,10 +138,6 @@ int main()
|
|
|
printf("Cannot get PCI Bus address on kernel memory\n");
|
|
|
exit( EXIT_FAILURE );
|
|
|
}
|
|
|
-
|
|
|
- printf("pciMemPtrDesc = %p\npciBusDesc = %p\n",pciMemPtrDesc,pciBusDesc);
|
|
|
-
|
|
|
- printf("pciMemPtrPage = %x\npciMemPtrDesc = %x\n",*(uint32_t*)pciMemPtrPage,*(uint32_t*)pciMemPtrDesc);
|
|
|
|
|
|
/* FPGA */
|
|
|
printf("\nWorking on the FPGA\n");
|
|
@@ -108,30 +147,51 @@ int main()
|
|
|
usleep(100000);
|
|
|
WR32_sleep(REG_NUM_PACKETS_PER_DESCRIPTOR,16);
|
|
|
WR32_sleep(REG_PACKET_LENGTH,64);
|
|
|
- WR32_sleep (REG_UPDATE_THRESHOLD, 0x1);
|
|
|
+ WR32_sleep(REG_UPDATE_THRESHOLD, 0x1);
|
|
|
+ /* WR64_sleep(REG_UPDATE_COUNTER,descInfo.bus_addr); */
|
|
|
WR64_sleep(REG_UPDATE_ADDRESS,pciBusPage+DESCRIPTOR_OFFSET);
|
|
|
WR32_sleep(REG_CONTROL,CONTROL_ENABLE_READ|CONTROL_SOURCE_RX_FIFO);
|
|
|
- WR64_sleep(REG_DESCRIPTOR_ADDRESS,pciBusDesc);
|
|
|
+ WR64_sleep(REG_DESCRIPTOR_ADDRESS,descInfo.bus_addr);
|
|
|
WR32_sleep(REG_DMA,1);
|
|
|
WR32_sleep(REG_INTERCONNECT, 0x262);
|
|
|
+ /* WR32_sleep(REG_COUNTER,1); */
|
|
|
usleep(100000);
|
|
|
|
|
|
- WR64_sleep(REG_DESCRIPTOR_ADDRESS,pciBusDesc);
|
|
|
+ WR64_sleep(REG_DESCRIPTOR_ADDRESS,descInfo.bus_addr);
|
|
|
printf("pciVa = %x\npciMemPtrPage = %lx\npciMemPtrDesc = %lx\n",pciVa,*(uint64_t*)pciMemPtrPage,*(uint64_t*)pciMemPtrDesc);
|
|
|
+
|
|
|
+
|
|
|
char* getBack=(char*)calloc(4096,sizeof(*getBack));
|
|
|
- memcpy(getBack,(const void*)pciMemPtrDesc,4096);
|
|
|
+ memcpy(getBack,(const void*)gpuDescVa,4096);
|
|
|
int i;
|
|
|
for(i=0;i<4096;i++)
|
|
|
{
|
|
|
- printf("%hhx",getBack[i]);
|
|
|
+ printf("%hhx",getBack[i]);
|
|
|
}
|
|
|
printf("\n");
|
|
|
|
|
|
+
|
|
|
/* Close everything */
|
|
|
printf("\nClosing the connections\n");
|
|
|
+ WR32(REG_COUNTER, 0);
|
|
|
+ WR32(REG_DMA, 0);
|
|
|
+ WR32(REG_RESET_DMA, 1);
|
|
|
+ usleep (100000);
|
|
|
+ WR32(REG_RESET_DMA, 0);
|
|
|
+ usleep (100000);
|
|
|
+
|
|
|
pcilib_free_kernel_memory(pciCtx,pciHandleDesc,(pcilib_kmem_flags_t)(PCILIB_KMEM_FLAG_PERSISTENT|PCILIB_KMEM_FLAG_HARDWARE));
|
|
|
pcilib_free_kernel_memory(pciCtx,pciHandlePage,(pcilib_kmem_flags_t)(PCILIB_KMEM_FLAG_PERSISTENT|PCILIB_KMEM_FLAG_HARDWARE));
|
|
|
- pcilib_close(pciCtx);
|
|
|
+ assert_cu( cuMemHostUnregister((void*) pciVa) );
|
|
|
+ pcilib_close(pciCtx);
|
|
|
+ assert_gdr( gdr_unmap(g,GPUMemHandlePage,gpuPageVa,3*PAGE_SIZE) );
|
|
|
+ assert_gdr( gdr_unpin_buffer(g,GPUMemHandlePage) );
|
|
|
+ assert_gdr( gdr_unmap(g,GPUMemHandleDesc,gpuDescVa,3*PAGE_SIZE) );
|
|
|
+ assert_gdr( gdr_unpin_buffer(g,GPUMemHandleDesc) );
|
|
|
+ assert_gdr( gdr_close(g) );
|
|
|
+ assert_cu( cuMemFree(gpuPagePtr) );
|
|
|
+ assert_cu( cuMemFree(gpuDescPtr) );
|
|
|
+
|
|
|
printf("All Cleared\n");
|
|
|
|
|
|
exit(EXIT_SUCCESS);
|