Patchwork quick shot at BSD RDMSR support

login
register
about
Submitter Carl-Daniel Hailfinger
Date 2009-08-12 22:43:01
Message ID <4A834575.7000500@gmx.net>
Download mbox | patch
Permalink /patch/120/
State Superseded
Headers show

Comments

Carl-Daniel Hailfinger - 2009-08-12 22:43:01
On 13.08.2009 00:19, Carl-Daniel Hailfinger wrote:
> On 12.08.2009 20:44, Stefan Reinauer wrote:
>   
>> This needs /dev/cpu0 from ports/sysutils
>>
>> It's untested and probably won't even compile..
>>   
>>     
>
> Here's an updated version which could even compile. It does compile on
> Linux. Stefan, since the original patch is from you, you may want to add
> your Signoff here as well.
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
>   

Next try.

Patch

Index: flashrom-rdmsr_freebsd/flash.h
===================================================================
--- flashrom-rdmsr_freebsd/flash.h	(Revision 683)
+++ flashrom-rdmsr_freebsd/flash.h	(Arbeitskopie)
@@ -311,8 +311,11 @@ 
 void cleanup_cpu_msr(void);
 #ifndef __DARWIN__
 typedef struct { uint32_t hi, lo; } msr_t;
-msr_t rdmsr(int addr);
-int wrmsr(int addr, msr_t msr);
+msr_t RDMSR(int addr);
+int WRMSR(int addr, msr_t msr);
+#else
+#define RDMSR rdmsr
+#define WRMSR wrmsr
 #endif
 
 /* internal.c */
Index: flashrom-rdmsr_freebsd/physmap.c
===================================================================
--- flashrom-rdmsr_freebsd/physmap.c	(Revision 683)
+++ flashrom-rdmsr_freebsd/physmap.c	(Arbeitskopie)
@@ -131,7 +131,7 @@ 
 
 static int fd_msr = -1;
 
-msr_t rdmsr(int addr)
+msr_t RDMSR(int addr)
 {
 	uint8_t buf[8];
 	msr_t msr = { 0xffffffff, 0xffffffff };
@@ -159,7 +159,7 @@ 
 	return msr;
 }
 
-int wrmsr(int addr, msr_t msr)
+int WRMSR(int addr, msr_t msr)
 {
 	if (lseek(fd_msr, (off_t) addr, SEEK_SET) == -1) {
 		perror("Could not lseek() to MSR");
@@ -215,6 +215,91 @@ 
 	fd_msr = -1;
 }
 #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 = data & 0xffffffff;
+	msr.hi = 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__
 int setup_cpu_msr(int cpu)
 {
@@ -227,14 +312,14 @@ 
 	// Nothing, yet.
 }
 #else
-msr_t rdmsr(int addr)
+msr_t RDMSR(int addr)
 {
 	msr_t ret = { 0xffffffff, 0xffffffff };
 
 	return ret;
 }
 
-int wrmsr(int addr, msr_t msr)
+int WRMSR(int addr, msr_t msr)
 {
 	return -1;
 }
@@ -251,4 +336,5 @@ 
 }
 #endif
 #endif
+#endif
 
Index: flashrom-rdmsr_freebsd/chipset_enable.c
===================================================================
--- flashrom-rdmsr_freebsd/chipset_enable.c	(Revision 683)
+++ flashrom-rdmsr_freebsd/chipset_enable.c	(Arbeitskopie)
@@ -544,16 +544,16 @@ 
 	if (setup_cpu_msr(0))
 		return -1;
 
-	msr = rdmsr(MSR_RCONF_DEFAULT);
+	msr = RDMSR(MSR_RCONF_DEFAULT);
 	if ((msr.hi >> 24) != 0x22) {
 		msr.hi &= 0xfbffffff;
-		wrmsr(MSR_RCONF_DEFAULT, msr);
+		WRMSR(MSR_RCONF_DEFAULT, msr);
 	}
 
-	msr = rdmsr(MSR_NORF_CTL);
+	msr = RDMSR(MSR_NORF_CTL);
 	/* Raise WE_CS3 bit. */
 	msr.lo |= 0x08;
-	wrmsr(MSR_NORF_CTL, msr);
+	WRMSR(MSR_NORF_CTL, msr);
 
 	cleanup_cpu_msr();
 
Index: flashrom-rdmsr_freebsd/board_enable.c
===================================================================
--- flashrom-rdmsr_freebsd/board_enable.c	(Revision 683)
+++ flashrom-rdmsr_freebsd/board_enable.c	(Arbeitskopie)
@@ -502,7 +502,7 @@ 
 	if (setup_cpu_msr(0))
 		return -1;
 
-	msr = rdmsr(DBE6x_MSR_DIVIL_BALL_OPTS);
+	msr = RDMSR(DBE6x_MSR_DIVIL_BALL_OPTS);
 
 	if ((msr.lo & (DBE6x_BOOT_OP_LATCHED)) ==
 	    (DBE6x_BOOT_LOC_FWHUB << DBE6x_BOOT_OP_LATCHED_SHIFT))
@@ -514,7 +514,7 @@ 
 	msr.lo |= ((boot_loc << DBE6x_PRI_BOOT_LOC_SHIFT) |
 		   (boot_loc << DBE6x_SEC_BOOT_LOC_SHIFT));
 
-	wrmsr(DBE6x_MSR_DIVIL_BALL_OPTS, msr);
+	WRMSR(DBE6x_MSR_DIVIL_BALL_OPTS, msr);
 
 	cleanup_cpu_msr();