svn commit: r189768 - in head/sys: conf dev/amdtemp dev/k8temp
modules modules/amdtemp modules/k8temp
Rui Paulo
rpaulo at FreeBSD.org
Fri Mar 13 09:08:09 PDT 2009
Author: rpaulo
Date: Fri Mar 13 16:08:08 2009
New Revision: 189768
URL: http://svn.freebsd.org/changeset/base/189768
Log:
Rename the k8temp driver to amdtemp.
MFC after: 2 weeks
Added:
head/sys/dev/amdtemp/
- copied from r189489, head/sys/dev/k8temp/
head/sys/dev/amdtemp/amdtemp.c
- copied unchanged from r189489, head/sys/dev/k8temp/k8temp.c
head/sys/modules/amdtemp/
- copied from r189489, head/sys/modules/k8temp/
Deleted:
head/sys/dev/amdtemp/k8temp.c
head/sys/dev/k8temp/
head/sys/modules/k8temp/
Modified:
head/sys/conf/files.amd64
head/sys/conf/files.i386
head/sys/modules/Makefile
head/sys/modules/amdtemp/Makefile
Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64 Fri Mar 13 14:35:58 2009 (r189767)
+++ head/sys/conf/files.amd64 Fri Mar 13 16:08:08 2009 (r189768)
@@ -136,6 +136,7 @@ dev/agp/agp_amd64.c optional agp
dev/agp/agp_i810.c optional agp
dev/agp/agp_intel.c optional agp
dev/agp/agp_via.c optional agp
+dev/amdtemp/amdtemp.c optional amdtemp
dev/arcmsr/arcmsr.c optional arcmsr pci
dev/asmc/asmc.c optional asmc isa
dev/atkbdc/atkbd.c optional atkbd atkbdc
@@ -187,7 +188,6 @@ dev/hwpmc/hwpmc_core.c optional hwpmc
dev/hwpmc/hwpmc_piv.c optional hwpmc
dev/hwpmc/hwpmc_tsc.c optional hwpmc
dev/hwpmc/hwpmc_x86.c optional hwpmc
-dev/k8temp/k8temp.c optional k8temp
dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd
dev/mem/memutil.c optional mem
dev/nfe/if_nfe.c optional nfe pci
Modified: head/sys/conf/files.i386
==============================================================================
--- head/sys/conf/files.i386 Fri Mar 13 14:35:58 2009 (r189767)
+++ head/sys/conf/files.i386 Fri Mar 13 16:08:08 2009 (r189768)
@@ -128,6 +128,7 @@ dev/agp/agp_nvidia.c optional agp
dev/agp/agp_sis.c optional agp
dev/agp/agp_via.c optional agp
dev/aic/aic_isa.c optional aic isa
+dev/amdtemp/amdtemp.c optional amdtemp
dev/arcmsr/arcmsr.c optional arcmsr pci
dev/ar/if_ar.c optional ar
dev/ar/if_ar_isa.c optional ar isa
@@ -198,7 +199,6 @@ dev/ipmi/ipmi_smbus.c optional ipmi smb
dev/ipmi/ipmi_smbios.c optional ipmi
dev/ipmi/ipmi_ssif.c optional ipmi smbus
dev/ipmi/ipmi_pci.c optional ipmi pci
-dev/k8temp/k8temp.c optional k8temp
dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd
dev/le/if_le_isa.c optional le isa
dev/mem/memutil.c optional mem
Copied: head/sys/dev/amdtemp/amdtemp.c (from r189489, head/sys/dev/k8temp/k8temp.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/sys/dev/amdtemp/amdtemp.c Fri Mar 13 16:08:08 2009 (r189768, copy of r189489, head/sys/dev/k8temp/k8temp.c)
@@ -0,0 +1,342 @@
+/*-
+ * Copyright (c) 2008 Rui Paulo <rpaulo at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Driver for the AMD K8 thermal sensors. Based on a Linux driver by the
+ * same name.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+
+#include <machine/specialreg.h>
+#include <machine/cpufunc.h>
+#include <machine/md_var.h>
+
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+
+struct k8temp_softc {
+ device_t sc_dev;
+ int sc_temps[4];
+ int sc_ntemps;
+ struct sysctl_oid *sc_oid;
+ struct sysctl_oid *sc_sysctl_cpu[2];
+ struct intr_config_hook sc_ich;
+};
+
+#define VENDORID_AMD 0x1022
+#define DEVICEID_AMD_MISC 0x1103
+
+static struct k8temp_product {
+ uint16_t k8temp_vendorid;
+ uint16_t k8temp_deviceid;
+} k8temp_products[] = {
+ { VENDORID_AMD, DEVICEID_AMD_MISC },
+ { 0, 0 }
+};
+
+/*
+ * Register control
+ */
+#define K8TEMP_REG 0xe4
+#define K8TEMP_REG_SELSENSOR 0x40
+#define K8TEMP_REG_SELCORE 0x04
+
+#define K8TEMP_MINTEMP 49 /* -49 C is the mininum temperature */
+
+typedef enum {
+ SENSOR0_CORE0,
+ SENSOR0_CORE1,
+ SENSOR1_CORE0,
+ SENSOR1_CORE1,
+ CORE0,
+ CORE1
+} k8sensor_t;
+
+/*
+ * Device methods.
+ */
+static void k8temp_identify(driver_t *driver, device_t parent);
+static int k8temp_probe(device_t dev);
+static int k8temp_attach(device_t dev);
+static void k8temp_intrhook(void *arg);
+static int k8temp_detach(device_t dev);
+static int k8temp_match(device_t dev);
+static int32_t k8temp_gettemp(device_t dev, k8sensor_t sensor);
+static int k8temp_sysctl(SYSCTL_HANDLER_ARGS);
+
+static device_method_t k8temp_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_identify, k8temp_identify),
+ DEVMETHOD(device_probe, k8temp_probe),
+ DEVMETHOD(device_attach, k8temp_attach),
+ DEVMETHOD(device_detach, k8temp_detach),
+
+ {0, 0}
+};
+
+static driver_t k8temp_driver = {
+ "k8temp",
+ k8temp_methods,
+ sizeof(struct k8temp_softc),
+};
+
+static devclass_t k8temp_devclass;
+DRIVER_MODULE(k8temp, hostb, k8temp_driver, k8temp_devclass, NULL, NULL);
+
+static int
+k8temp_match(device_t dev)
+{
+ int i;
+ uint16_t vendor, devid;
+
+ vendor = pci_get_vendor(dev);
+ devid = pci_get_device(dev);
+
+ for (i = 0; k8temp_products[i].k8temp_vendorid != 0; i++) {
+ if (vendor == k8temp_products[i].k8temp_vendorid &&
+ devid == k8temp_products[i].k8temp_deviceid)
+ return (1);
+ }
+
+ return (0);
+}
+
+static void
+k8temp_identify(driver_t *driver, device_t parent)
+{
+ device_t child;
+
+ /* Make sure we're not being doubly invoked. */
+ if (device_find_child(parent, "k8temp", -1) != NULL)
+ return;
+
+ if (k8temp_match(parent)) {
+ child = device_add_child(parent, "k8temp", -1);
+ if (child == NULL)
+ device_printf(parent, "add k8temp child failed\n");
+ }
+
+}
+
+static int
+k8temp_probe(device_t dev)
+{
+ uint32_t regs[4];
+
+ if (resource_disabled("k8temp", 0))
+ return (ENXIO);
+
+ do_cpuid(1, regs);
+ switch (regs[0]) {
+ case 0xf40:
+ case 0xf50:
+ case 0xf51:
+ return (ENXIO);
+ }
+ device_set_desc(dev, "AMD K8 Thermal Sensors");
+
+ return (BUS_PROBE_GENERIC);
+}
+
+static int
+k8temp_attach(device_t dev)
+{
+ struct k8temp_softc *sc = device_get_softc(dev);
+ struct sysctl_ctx_list *sysctlctx;
+ struct sysctl_oid *sysctlnode;
+
+
+ /*
+ * Setup intrhook function to create dev.cpu sysctl entries. This is
+ * needed because the cpu driver may be loaded late on boot, after
+ * us.
+ */
+ sc->sc_ich.ich_func = k8temp_intrhook;
+ sc->sc_ich.ich_arg = dev;
+ if (config_intrhook_establish(&sc->sc_ich) != 0) {
+ device_printf(dev, "config_intrhook_establish "
+ "failed!\n");
+ return (ENXIO);
+ }
+
+ /*
+ * dev.k8temp.N tree.
+ */
+ sysctlctx = device_get_sysctl_ctx(dev);
+ sysctlnode = SYSCTL_ADD_NODE(sysctlctx,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "sensor0",
+ CTLFLAG_RD, 0, "Sensor 0");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sysctlnode),
+ OID_AUTO, "core0", CTLTYPE_INT | CTLFLAG_RD,
+ dev, SENSOR0_CORE0, k8temp_sysctl, "I",
+ "Sensor 0 / Core 0 temperature");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sysctlnode),
+ OID_AUTO, "core1", CTLTYPE_INT | CTLFLAG_RD,
+ dev, SENSOR0_CORE1, k8temp_sysctl, "I",
+ "Sensor 0 / Core 1 temperature");
+
+ sysctlnode = SYSCTL_ADD_NODE(sysctlctx,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "sensor1",
+ CTLFLAG_RD, 0, "Sensor 1");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sysctlnode),
+ OID_AUTO, "core0", CTLTYPE_INT | CTLFLAG_RD,
+ dev, SENSOR1_CORE0, k8temp_sysctl, "I",
+ "Sensor 1 / Core 0 temperature");
+
+ SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(sysctlnode),
+ OID_AUTO, "core1", CTLTYPE_INT | CTLFLAG_RD,
+ dev, SENSOR1_CORE1, k8temp_sysctl, "I",
+ "Sensor 1 / Core 1 temperature");
+
+ return (0);
+}
+
+void
+k8temp_intrhook(void *arg)
+{
+ int i;
+ device_t nexus, acpi, cpu;
+ device_t dev = (device_t) arg;
+ struct k8temp_softc *sc;
+ struct sysctl_ctx_list *sysctlctx;
+
+ sc = device_get_softc(dev);
+
+ /*
+ * dev.cpu.N.temperature.
+ */
+ nexus = device_find_child(root_bus, "nexus", 0);
+ acpi = device_find_child(nexus, "acpi", 0);
+
+ for (i = 0; i < 2; i++) {
+ cpu = device_find_child(acpi, "cpu",
+ device_get_unit(dev) * 2 + i);
+ if (cpu) {
+ sysctlctx = device_get_sysctl_ctx(cpu);
+
+ sc->sc_sysctl_cpu[i] = SYSCTL_ADD_PROC(sysctlctx,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(cpu)),
+ OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RD,
+ dev, CORE0, k8temp_sysctl, "I",
+ "Max of sensor 0 / 1");
+ }
+ }
+ config_intrhook_disestablish(&sc->sc_ich);
+}
+
+int
+k8temp_detach(device_t dev)
+{
+ int i;
+ struct k8temp_softc *sc = device_get_softc(dev);
+
+ for (i = 0; i < 2; i++) {
+ if (sc->sc_sysctl_cpu[i])
+ sysctl_remove_oid(sc->sc_sysctl_cpu[i], 1, 0);
+ }
+
+ /* NewBus removes the dev.k8temp.N tree by itself. */
+
+ return (0);
+}
+
+static int
+k8temp_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ device_t dev = (device_t) arg1;
+ int error;
+ int32_t temp, auxtemp[2];
+
+ switch (arg2) {
+ case CORE0:
+ auxtemp[0] = k8temp_gettemp(dev, SENSOR0_CORE0);
+ auxtemp[1] = k8temp_gettemp(dev, SENSOR1_CORE0);
+ temp = imax(auxtemp[0], auxtemp[1]);
+ break;
+ case CORE1:
+ auxtemp[0] = k8temp_gettemp(dev, SENSOR0_CORE1);
+ auxtemp[1] = k8temp_gettemp(dev, SENSOR1_CORE1);
+ temp = imax(auxtemp[0], auxtemp[1]);
+ break;
+ default:
+ temp = k8temp_gettemp(dev, arg2);
+ break;
+ }
+ error = sysctl_handle_int(oidp, &temp, 0, req);
+
+ return (error);
+}
+
+static int32_t
+k8temp_gettemp(device_t dev, k8sensor_t sensor)
+{
+ uint8_t cfg;
+ uint32_t temp;
+
+ cfg = pci_read_config(dev, K8TEMP_REG, 1);
+ switch (sensor) {
+ case SENSOR0_CORE0:
+ cfg &= ~(K8TEMP_REG_SELSENSOR | K8TEMP_REG_SELCORE);
+ break;
+ case SENSOR0_CORE1:
+ cfg &= ~K8TEMP_REG_SELSENSOR;
+ cfg |= K8TEMP_REG_SELCORE;
+ break;
+ case SENSOR1_CORE0:
+ cfg &= ~K8TEMP_REG_SELCORE;
+ cfg |= K8TEMP_REG_SELSENSOR;
+ break;
+ case SENSOR1_CORE1:
+ cfg |= (K8TEMP_REG_SELSENSOR | K8TEMP_REG_SELCORE);
+ break;
+ default:
+ cfg = 0;
+ break;
+ }
+ pci_write_config(dev, K8TEMP_REG, cfg, 1);
+ temp = pci_read_config(dev, K8TEMP_REG, 4);
+ temp = ((temp >> 16) & 0xff) - K8TEMP_MINTEMP;
+
+ return (temp);
+}
Modified: head/sys/modules/Makefile
==============================================================================
--- head/sys/modules/Makefile Fri Mar 13 14:35:58 2009 (r189767)
+++ head/sys/modules/Makefile Fri Mar 13 16:08:08 2009 (r189768)
@@ -18,6 +18,7 @@ SUBDIR= ${_3dfx} \
aic7xxx \
aio \
${_amd} \
+ ${_amdtemp} \
ale \
amr \
${_an} \
@@ -137,7 +138,6 @@ SUBDIR= ${_3dfx} \
${_ixgb} \
jme \
joy \
- ${_k8temp} \
kbdmux \
krpc \
le \
@@ -409,6 +409,7 @@ _zfs= zfs
_aac= aac
_acpi= acpi
_ahb= ahb
+_amdtemp= amdtemp
_arcmsr= arcmsr
_asmc= asmc
_asr= asr
@@ -435,7 +436,6 @@ _iwifw= iwifw
_iwn= iwn
_iwnfw= iwnfw
_ixgb= ixgb
-_k8temp= k8temp
_mly= mly
_nfe= nfe
_nve= nve
@@ -464,6 +464,7 @@ _aac= aac
_acpi= acpi
_agp= agp
_an= an
+_amdtemp= amdtemp
_arcmsr= arcmsr
_asmc= asmc
_cardbus= cardbus
@@ -502,7 +503,6 @@ _ipwfw= ipwfw
_iwn= iwn
_iwnfw= iwnfw
_ixgb= ixgb
-_k8temp= k8temp
_linprocfs= linprocfs
_linsysfs= linsysfs
_linux= linux
Modified: head/sys/modules/amdtemp/Makefile
==============================================================================
--- head/sys/modules/k8temp/Makefile Sat Mar 7 10:21:37 2009 (r189489)
+++ head/sys/modules/amdtemp/Makefile Fri Mar 13 16:08:08 2009 (r189768)
@@ -1,8 +1,8 @@
# $FreeBSD$
-.PATH: ${.CURDIR}/../../dev/k8temp
+.PATH: ${.CURDIR}/../../dev/amdtemp
-KMOD= k8temp
-SRCS= k8temp.c bus_if.h device_if.h pci_if.h
+KMOD= amdtemp
+SRCS= amdtemp.c bus_if.h device_if.h pci_if.h
.include <bsd.kmod.mk>
More information about the svn-src-all
mailing list