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
[-- Attachment #1 --]
If you have a pentium 3 that works for speedstep, please try this patch.
It fixes the PAE case. Compile-tested.
--
Nate
[-- Attachment #2 --]
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);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?46735262.50601>
