mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
Support rdmsr/wrmsr operations on FreeBSD
So far, AMD Geode LX is the only user of this infrastructure. It needs /dev/cpu0 from ports/sysutils on FreeBSD during runtime on Geode LX. Corresponding to flashrom svn r690. Signed-off-by: Stefan Reinauer <stepan@coresystems.de> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Idwer Vollering <vidwer@gmail.com> Acked-by: <putlinuxonit@gmail.com>
This commit is contained in:
parent
dfade10e39
commit
173e3eaabe
12
flash.h
12
flash.h
@ -309,11 +309,21 @@ void *physmap(const char *descr, unsigned long phys_addr, size_t len);
|
|||||||
void physunmap(void *virt_addr, size_t len);
|
void physunmap(void *virt_addr, size_t len);
|
||||||
int setup_cpu_msr(int cpu);
|
int setup_cpu_msr(int cpu);
|
||||||
void cleanup_cpu_msr(void);
|
void cleanup_cpu_msr(void);
|
||||||
#ifndef __DARWIN__
|
#if !defined(__DARWIN__) && !defined(__FreeBSD__) && !defined(__DragonFly__)
|
||||||
typedef struct { uint32_t hi, lo; } msr_t;
|
typedef struct { uint32_t hi, lo; } msr_t;
|
||||||
msr_t rdmsr(int addr);
|
msr_t rdmsr(int addr);
|
||||||
int wrmsr(int addr, msr_t msr);
|
int wrmsr(int addr, msr_t msr);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
|
/* FreeBSD already has conflicting definitions for wrmsr/rdmsr. */
|
||||||
|
#undef rdmsr
|
||||||
|
#undef wrmsr
|
||||||
|
#define rdmsr freebsd_rdmsr
|
||||||
|
#define wrmsr freebsd_wrmsr
|
||||||
|
typedef struct { uint32_t hi, lo; } msr_t;
|
||||||
|
msr_t freebsd_rdmsr(int addr);
|
||||||
|
int freebsd_wrmsr(int addr, msr_t msr);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* internal.c */
|
/* internal.c */
|
||||||
struct pci_dev *pci_dev_find_filter(struct pci_filter filter);
|
struct pci_dev *pci_dev_find_filter(struct pci_filter filter);
|
||||||
|
86
physmap.c
86
physmap.c
@ -215,6 +215,91 @@ void cleanup_cpu_msr(void)
|
|||||||
fd_msr = -1;
|
fd_msr = -1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int msr;
|
||||||
|
uint64_t data;
|
||||||
|
} cpu_msr_args_t;
|
||||||
|
#define CPU_RDMSR _IOWR('c', 1, cpu_msr_args_t)
|
||||||
|
#define CPU_WRMSR _IOWR('c', 2, cpu_msr_args_t)
|
||||||
|
|
||||||
|
static int fd_msr = -1;
|
||||||
|
|
||||||
|
msr_t rdmsr(int addr)
|
||||||
|
{
|
||||||
|
cpu_msr_args_t args;
|
||||||
|
|
||||||
|
msr_t msr = { 0xffffffff, 0xffffffff };
|
||||||
|
|
||||||
|
args.msr = addr;
|
||||||
|
|
||||||
|
if (ioctl(fd_msr, CPU_RDMSR, &args) < 0) {
|
||||||
|
perror("CPU_RDMSR");
|
||||||
|
close(fd_msr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
msr.lo = args.data & 0xffffffff;
|
||||||
|
msr.hi = args.data >> 32;
|
||||||
|
|
||||||
|
return msr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int wrmsr(int addr, msr_t msr)
|
||||||
|
{
|
||||||
|
cpu_msr_args_t args;
|
||||||
|
|
||||||
|
args.msr = addr;
|
||||||
|
args.data = (((uint64_t)msr.hi) << 32) | msr.lo;
|
||||||
|
|
||||||
|
if (ioctl(fd_msr, CPU_WRMSR, &args) < 0) {
|
||||||
|
perror("CPU_WRMSR");
|
||||||
|
close(fd_msr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int setup_cpu_msr(int cpu)
|
||||||
|
{
|
||||||
|
char msrfilename[64];
|
||||||
|
memset(msrfilename, 0, 64);
|
||||||
|
sprintf(msrfilename, "/dev/cpu%d", cpu);
|
||||||
|
|
||||||
|
if (fd_msr != -1) {
|
||||||
|
printf("MSR was already initialized\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd_msr = open(msrfilename, O_RDWR);
|
||||||
|
|
||||||
|
if (fd_msr < 0) {
|
||||||
|
perror("Error while opening /dev/cpu0");
|
||||||
|
printf("Did you install ports/sysutils/devcpu?\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup_cpu_msr(void)
|
||||||
|
{
|
||||||
|
if (fd_msr == -1) {
|
||||||
|
printf("No MSR initialized.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd_msr);
|
||||||
|
|
||||||
|
/* Clear MSR file descriptor */
|
||||||
|
fd_msr = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#ifdef __DARWIN__
|
#ifdef __DARWIN__
|
||||||
int setup_cpu_msr(int cpu)
|
int setup_cpu_msr(int cpu)
|
||||||
{
|
{
|
||||||
@ -251,4 +336,5 @@ void cleanup_cpu_msr(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user