Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jun 2007 20:00:50 -0700
From:      Nate Lawson <nate@root.org>
To:        current <current@freebsd.org>
Cc:        acpi@freebsd.org
Subject:   smi speedstep patch
Message-ID:  <46735262.50601@root.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------050800030600070904060503
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

If you have a pentium 3 that works for speedstep, please try this patch.
 It fixes the PAE case.  Compile-tested.

-- 
Nate

--------------050800030600070904060503
Content-Type: text/x-patch;
 name="smist.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="smist.diff"

Index: sys/i386/cpufreq/smist.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/cpufreq/smist.c,v
retrieving revision 1.1
diff -d -u -r1.1 smist.c
--- sys/i386/cpufreq/smist.c	19 Apr 2005 16:38:24 -0000	1.1
+++ sys/i386/cpufreq/smist.c	16 Jun 2007 02:42:03 -0000
@@ -45,6 +45,7 @@
 #include <sys/module.h>
 #include <sys/systm.h>
 
+#include <machine/bus.h>
 #include <machine/md_var.h>
 #include <machine/vm86.h>
 
@@ -71,6 +72,8 @@
 	struct cf_setting	 sets[2];	/* Only two settings. */
 };
 
+static char smist_magic[] = "Copyright (c) 1999 Intel Corporation";
+
 static void	smist_identify(driver_t *driver, device_t parent);
 static int	smist_probe(device_t dev);
 static int	smist_attach(device_t dev);
@@ -150,16 +153,39 @@
 static int
 set_ownership(device_t dev)
 {
-	int result;
 	struct smist_softc *sc;
-	vm_paddr_t pmagic;
-	static char magic[] = "Copyright (c) 1999 Intel Corporation";
+	bus_dma_tag_t tag;
+	bus_dmamap_t map;
+	void *magic_buf;
+	int result;
 
+	/*
+	 * Specify the region to store the magic string.  Since its address is
+	 * passed to the BIOS in a 32-bit register, we have to make sure it is
+	 * located in a buffer below 4 GB (i.e., for PAE.)
+	 */
 	sc = device_get_softc(dev);
-	if (!sc)
+	if (bus_dma_tag_create(/*parent*/ NULL,
+	    /*alignment*/ PAGE_SIZE, /*no boundary*/ 0,
+	    /*lowaddr*/ 0, /*highaddr*/ (1<<31), NULL, NULL,
+	    /*maxsize*/ PAGE_SIZE, /*segments*/ 1, /*maxsegsize*/ PAGE_SIZE,
+	    0, busdma_lock_mutex, &Giant, &tag) != 0) {
+		device_printf(dev, "can't create mem tag\n");
 		return (ENXIO);
-
-	pmagic = vtophys(magic);
+	}
+	if (bus_dmamem_alloc(tag, &magic_buf, BUS_DMA_NOWAIT, &map) != 0) {
+		bus_dma_tag_destroy(tag);
+		device_printf(dev, "can't alloc mapped mem\n");
+		return (ENXIO);
+	}
+	if (bus_dmamap_load(tag, map, magic_buf, PAGE_SIZE, NULL, NULL,
+	    BUS_DMA_NOWAIT) != 0) {
+		bus_dmamem_free(tag, magic_buf, map);
+		bus_dma_tag_destroy(tag);
+		device_printf(dev, "can't load mem\n");
+		return (ENXIO);
+	};
+	strlcpy(magic_buf, smist_magic, PAGE_SIZE);
 
 	__asm __volatile(
 	    "movl $-1, %%edi\n\t"
@@ -169,11 +195,14 @@
 	      "b" (0),
 	      "c" (0),
 	      "d" (sc->smi_cmd),
-	      "S" (pmagic)
+	      "S" ((u_int)(uintptr_t)magic_buf)
 	);
 
 	DPRINT(dev, "taking ownership over BIOS return %d\n", result);
 
+	bus_dmamap_unload(tag, map);
+	bus_dmamem_free(tag, magic_buf, map);
+	bus_dma_tag_destroy(tag);
 	return (result ? ENXIO : 0);
 }
 

--------------050800030600070904060503--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46735262.50601>