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 #include +#include #include #include @@ -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); }