Add pcie test
Does not work because of IOMMU. Perhaps need a kernel driver, or disable IOMMU
This commit is contained in:
@@ -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]);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user