Add pcie test

Does not work because of IOMMU. Perhaps need a kernel driver, or disable IOMMU
This commit is contained in:
Byron Lathi
2025-11-10 01:56:16 +00:00
parent 1a33af4ddf
commit 32d18845e5

View File

@@ -5,6 +5,7 @@
#include <stdlib.h> /* size_t */
#include <unistd.h> /* pread, sysconf */
#include <sys/mman.h>
#include <string.h>
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);
}
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]);
}