58 lines
1009 B
C
58 lines
1009 B
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
|
|
#include "card.h"
|
|
|
|
/* Read a 16-bit unsigned int from a pci id file */
|
|
unsigned short read_pci_id(char *device_path, char *field)
|
|
{
|
|
char buf[16];
|
|
char file_path[PATH_MAX];
|
|
|
|
strcpy(file_path, device_path);
|
|
strcat(file_path, field);
|
|
|
|
FILE *fp = fopen(file_path, "r");
|
|
|
|
if (fp == NULL)
|
|
return 0;
|
|
|
|
if (fgets(buf, sizeof(buf), fp) == NULL) {
|
|
fclose(fp);
|
|
return 0;
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
return (unsigned short)strtoul(buf, NULL, 16);
|
|
}
|
|
|
|
char *read_nvidia_pci_address(char *device_path)
|
|
{
|
|
char file_path[PATH_MAX];
|
|
|
|
char *ret = calloc(16 + 1, sizeof(char)); /* assuming pci ids could look as large as 00000000:0C:00.0 */
|
|
|
|
strcpy(file_path, device_path);
|
|
strcat(file_path, "/name");
|
|
|
|
FILE *fp = fopen(file_path, "r");
|
|
|
|
if (fp == NULL) {
|
|
free(ret);
|
|
return NULL;
|
|
}
|
|
|
|
fscanf(fp, "NVIDIA i2c adapter %*u at %16s", ret);
|
|
fclose(fp);
|
|
|
|
if (strlen(ret) == 0) {
|
|
free(ret);
|
|
return NULL;
|
|
}
|
|
|
|
return ret;
|
|
}
|