From 04229da7466d0cbc8edd756cbfaf985d1d385456 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sat, 11 Oct 2025 20:08:54 -0500 Subject: [PATCH] add pci_user --- drm/main.c | 13 +++++++++++++ pci_user/main.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 pci_user/main.c diff --git a/drm/main.c b/drm/main.c index 31ed24a..4c455f0 100644 --- a/drm/main.c +++ b/drm/main.c @@ -361,6 +361,19 @@ int main() assert(write_length == mmap_args.size); close(out_fd); + int mm_fd = open("/sys/kernel/debug/radeon_vram_mm", O_RDONLY); + assert(mm_fd >= 0); + char buf[4096]; + while (true) { + ssize_t read_length = read(mm_fd, buf, 4096); + assert(read_length >= 0); + write(STDOUT_FILENO, buf, read_length); + if (read_length < 4096) { + break; + } + } + close(mm_fd); + munmap(ptr, mmap_args.size); close(fd); diff --git a/pci_user/main.c b/pci_user/main.c new file mode 100644 index 0000000..4e00d25 --- /dev/null +++ b/pci_user/main.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static inline uint32_t rreg(void * rmmio, uint32_t offset) +{ + uint32_t value = *((volatile uint32_t *)(((uintptr_t)rmmio) + offset)); + asm volatile ("" ::: "memory"); +} + +static inline uint32_t wreg(void * rmmio, uint32_t offset, uint32_t value) +{ + *((volatile uint32_t *)(((uintptr_t)rmmio) + offset)) = value; + asm volatile ("" ::: "memory"); +} + +int main() +{ + //////////////////////////////////////////////////////////////////////// + // PCI resource0 + //////////////////////////////////////////////////////////////////////// + const char * resource2_path = "/sys/bus/pci/devices/0000:01:00.0/resource2"; + int resource2_fd = open(resource2_path, O_RDWR | O_SYNC); + assert(resource2_fd >= 0); + + uint32_t resource2_size = 0x10000; + void * resource2_base = mmap(0, resource2_size, PROT_READ | PROT_WRITE, MAP_SHARED, resource2_fd, 0); + assert(resource2_base != MAP_FAILED); + + void * rmmio = resource2_base; + + uint32_t value1 = rreg(rmmio, 0x6110); + printf("[r500] D1GRPH_PRIMARY_SURFACE_ADDRESS %08x\n", value1); + uint32_t value2 = rreg(rmmio, 0x6110 + 0x800); + printf("[r500] D2GRPH_PRIMARY_SURFACE_ADDRESS %08x\n", value2); + + uint32_t value3 = rreg(rmmio, 0x6118); + printf("[r500] D1GRPH_SECONDARY_SURFACE_ADDRESS %08x\n", value3); + uint32_t value4 = rreg(rmmio, 0x6118 + 0x800); + printf("[r500] D2GRPH_SECONDARY_SURFACE_ADDRESS %08x\n", value4); + + wreg(rmmio, 0x6110, 0x813000); + wreg(rmmio, 0x6118, 0x813000); +}