#include #include #include #include #include #include #define PG_SZ sysconf(_SC_PAGE_SIZE) #include "gddr6.h" void init_gddr6(struct card_info *card) { /* Parse the address of the card to get the PCI info */ char pci_address[] = "00000000:00:00.0"; int len = strlen(card->pci_id); strcpy(&pci_address[sizeof(pci_address) - len - 1], card->pci_id); int domain = 0; int bus = 0; int dev = 0; int func = 0; sscanf(pci_address, "%x:%x:%x.%x", &domain, &bus, &dev, &func); struct pci_access *pacc = NULL; struct pci_dev *pci_dev = NULL; pacc = pci_alloc(); pci_init(pacc); pci_dev = pci_get_dev(pacc, domain, bus, dev, func); pci_fill_info(pci_dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_CLASS); card->bar0 = (pci_dev->base_addr[0] & 0xFFFFFFFF); pci_cleanup(pacc); /* Open our memory mappings */ card->vram_addr = NULL; card->hotspot_addr = NULL; int fd; if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) { printf("Can't read memory for VRAM and Hotspot temperatures. If you are root, enable kernel parameter iomem=relaxed\n"); return; } unsigned int phys_addr, base_offset; void *map_base; for (int i = 0; i < sizeof(device_offset_info) / sizeof(struct device_offset); i++) { if (card->pci_device_id == device_offset_info[i].device_id){ /* Map for VRAM */ phys_addr = (card->bar0 + device_offset_info[i].vram_offset); base_offset = phys_addr & ~(PG_SZ-1); map_base = mmap(0, PG_SZ, PROT_READ, MAP_SHARED, fd, base_offset); if(map_base == (void *) -1) printf("Can't map memory for VRAM temperature. If you are root, enable kernel parameter iomem=relaxed\n"); else card->vram_addr = (void *) map_base + (phys_addr - base_offset); /* Map for hotspot */ phys_addr = (card->bar0 + device_offset_info[i].hotspot_offset); base_offset = phys_addr & ~(PG_SZ-1); map_base = mmap(0, PG_SZ, PROT_READ, MAP_SHARED, fd, base_offset); if(map_base == (void *) -1) printf("Can't map memory for Hotspot temperature. If you are root, enable kernel parameter iomem=relaxed\n"); else card->hotspot_addr = (void *) map_base + (phys_addr - base_offset); } } close(fd); } float get_vram_temp(struct card_info *card) { float temp = 0.0; if(card->vram_addr == NULL) return 0.0; int read_result = *((unsigned int *) card->vram_addr); temp = ((read_result & 0x00000fff) / 0x20); return temp; } float get_hotspot_temp(struct card_info *card) { float temp = 0.0; if(card->hotspot_addr == NULL) return 0.0; int read_result = *((unsigned int *) card->hotspot_addr); temp = (read_result >> 8) & 0xff; return temp; }