From 32d18845e53a18ed71deeb2fdadff4a57b366277 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Mon, 10 Nov 2025 01:56:16 +0000 Subject: [PATCH] Add pcie test Does not work because of IOMMU. Perhaps need a kernel driver, or disable IOMMU --- sw/test/pcie_dma_test.c | 59 ++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/sw/test/pcie_dma_test.c b/sw/test/pcie_dma_test.c index c26a24e..6ef359a 100644 --- a/sw/test/pcie_dma_test.c +++ b/sw/test/pcie_dma_test.c @@ -5,6 +5,7 @@ #include /* size_t */ #include /* pread, sysconf */ #include +#include typedef struct { uint64_t pfn : 55; @@ -74,29 +75,67 @@ int virt_to_phys_user(uintptr_t *paddr, uintptr_t vaddr) int main(void) { - printf("Allocating 1024 bytes as source\n"); - uintptr_t src = (uintptr_t)malloc(1024); + + /* Instead of allocating source, just use the constant string */ + + //printf("Allocating 1024 bytes as source\n"); + //uintptr_t src = (uintptr_t)malloc(1024); + char* src = "Hello, world! This is some data that is stored in system memory!"; printf("Virtual address: %lx\n", src); uintptr_t src_phys; - virt_to_phys_user(&src_phys, src); + virt_to_phys_user(&src_phys, (uintptr_t)src); printf("Physical address: %lx\n", src_phys); printf("\n\n"); + printf("Allocating 1024 bytes as destination\n"); - uintptr_t dst = (uintptr_t)malloc(1024); - printf("Virtual address: %lx\n", dst); + uint32_t* dst = (uint32_t*)malloc(1024); + printf("Virtual address: %p\n", dst); uintptr_t dst_phys; - virt_to_phys_user(&dst_phys, dst); + virt_to_phys_user(&dst_phys, (uintptr_t)dst); printf("Physical address: %lx\n", dst_phys); printf("\n\n"); + memset((void*)dst, 0, 1024); + printf("mmaping PCIe space\n"); // this is hardcoded, seems to be deterministic. uint32_t pcie_physical_base_offset = 0xfe800000; int fd = open("/dev/mem", O_RDWR|O_SYNC); uint32_t* pcie_base = (uint32_t*)mmap(0, 64, PROT_READ|PROT_WRITE, MAP_SHARED, fd, pcie_physical_base_offset); - uintptr_t pcie_physical_sanity_check; - virt_to_phys_user(&pcie_physical_sanity_check, (uintptr_t)pcie_base); printf("Virtual PCIe Base: %p\n", pcie_base); - printf("Physical PCIe Base: %lx\n", pcie_physical_sanity_check); -} \ No newline at end of file + + printf("Sending read DMA\n"); + pcie_base[0] = (uint32_t)src_phys; + pcie_base[1] = (uint32_t)(src_phys >> 32); + pcie_base[2] = 0; + pcie_base[3] = strlen(src); + + for (int i = 0; i < 4; i++) { + printf("pcie_base[%d] = %x\n", i, pcie_base[i]); + } + + pcie_base[4] = 1; + printf("%d\n", pcie_base[4]); + printf("\n\n"); + + printf("Sending write DMA\n"); + + + printf("Sending read DMA\n"); + pcie_base[8] = (uint32_t)dst_phys; + pcie_base[9] = (uint32_t)(dst_phys >> 32); + pcie_base[10] = 0; + pcie_base[11] = strlen(src); + + for (int i = 8; i < 12; i++) { + printf("pcie_base[%d] = %x\n", i, pcie_base[i]); + } + + pcie_base[12] = 1; + printf("%d\n", pcie_base[12]); + printf("\n\n"); + + printf("%x\n", dst[0]); + +}