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 <rpa...@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>
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to