linux/drivers/macintosh/windfarm_pm121.c
<<
>>
Prefs
   1/*
   2 * Windfarm PowerMac thermal control. iMac G5 iSight
   3 *
   4 * (c) Copyright 2007 Étienne Bersac <bersace@gmail.com>
   5 *
   6 * Bits & pieces from windfarm_pm81.c by (c) Copyright 2005 Benjamin
   7 * Herrenschmidt, IBM Corp. <benh@kernel.crashing.org>
   8 *
   9 * Released under the term of the GNU GPL v2.
  10 *
  11 *
  12 *
  13 * PowerMac12,1
  14 * ============
  15 *
  16 *
  17 * The algorithm used is the PID control algorithm, used the same way
  18 * the published Darwin code does, using the same values that are
  19 * present in the Darwin 8.10 snapshot property lists (note however
  20 * that none of the code has been re-used, it's a complete
  21 * re-implementation
  22 *
  23 * There is two models using PowerMac12,1. Model 2 is iMac G5 iSight
  24 * 17" while Model 3 is iMac G5 20". They do have both the same
  25 * controls with a tiny difference. The control-ids of hard-drive-fan
  26 * and cpu-fan is swapped.
  27 *
  28 *
  29 * Target Correction :
  30 *
  31 * controls have a target correction calculated as :
  32 *
  33 * new_min = ((((average_power * slope) >> 16) + offset) >> 16) + min_value
  34 * new_value = max(new_value, max(new_min, 0))
  35 *
  36 * OD Fan control correction.
  37 *
  38 * # model_id: 2
  39 *   offset             : -19563152
  40 *   slope              :  1956315
  41 *
  42 * # model_id: 3
  43 *   offset             : -15650652
  44 *   slope              :  1565065
  45 *
  46 * HD Fan control correction.
  47 *
  48 * # model_id: 2
  49 *   offset             : -15650652
  50 *   slope              :  1565065
  51 *
  52 * # model_id: 3
  53 *   offset             : -19563152
  54 *   slope              :  1956315
  55 *
  56 * CPU Fan control correction.
  57 *
  58 * # model_id: 2
  59 *   offset             : -25431900
  60 *   slope              :  2543190
  61 *
  62 * # model_id: 3
  63 *   offset             : -15650652
  64 *   slope              :  1565065
  65 *
  66 *
  67 * Target rubber-banding :
  68 *
  69 * Some controls have a target correction which depends on another
  70 * control value. The correction is computed in the following way :
  71 *
  72 * new_min = ref_value * slope + offset
  73 *
  74 * ref_value is the value of the reference control. If new_min is
  75 * greater than 0, then we correct the target value using :
  76 *
  77 * new_target = max (new_target, new_min >> 16)
  78 *
  79 *
  80 * # model_id : 2
  81 *   control    : cpu-fan
  82 *   ref        : optical-drive-fan
  83 *   offset     : -15650652
  84 *   slope      : 1565065
  85 *
  86 * # model_id : 3
  87 *   control    : optical-drive-fan
  88 *   ref        : hard-drive-fan
  89 *   offset     : -32768000
  90 *   slope      : 65536
  91 *
  92 *
  93 * In order to have the moste efficient correction with those
  94 * dependencies, we must trigger HD loop before OD loop before CPU
  95 * loop.
  96 *
  97 *
  98 * The various control loops found in Darwin config file are:
  99 *
 100 * HD Fan control loop.
 101 *
 102 * # model_id: 2
 103 *   control        : hard-drive-fan
 104 *   sensor         : hard-drive-temp
 105 *   PID params     : G_d = 0x00000000
 106 *                    G_p = 0x002D70A3
 107 *                    G_r = 0x00019999
 108 *                    History = 2 entries
 109 *                    Input target = 0x370000
 110 *                    Interval = 5s
 111 *
 112 * # model_id: 3
 113 *   control        : hard-drive-fan
 114 *   sensor         : hard-drive-temp
 115 *   PID params     : G_d = 0x00000000
 116 *                    G_p = 0x002170A3
 117 *                    G_r = 0x00019999
 118 *                    History = 2 entries
 119 *                    Input target = 0x370000
 120 *                    Interval = 5s
 121 *
 122 * OD Fan control loop.
 123 *
 124 * # model_id: 2
 125 *   control        : optical-drive-fan
 126 *   sensor         : optical-drive-temp
 127 *   PID params     : G_d = 0x00000000
 128 *                    G_p = 0x001FAE14
 129 *                    G_r = 0x00019999
 130 *                    History = 2 entries
 131 *                    Input target = 0x320000
 132 *                    Interval = 5s
 133 *
 134 * # model_id: 3
 135 *   control        : optical-drive-fan
 136 *   sensor         : optical-drive-temp
 137 *   PID params     : G_d = 0x00000000
 138 *                    G_p = 0x001FAE14
 139 *                    G_r = 0x00019999
 140 *                    History = 2 entries
 141 *                    Input target = 0x320000
 142 *                    Interval = 5s
 143 *
 144 * GPU Fan control loop.
 145 *
 146 * # model_id: 2
 147 *   control        : hard-drive-fan
 148 *   sensor         : gpu-temp
 149 *   PID params     : G_d = 0x00000000
 150 *                    G_p = 0x002A6666
 151 *                    G_r = 0x00019999
 152 *                    History = 2 entries
 153 *                    Input target = 0x5A0000
 154 *                    Interval = 5s
 155 *
 156 * # model_id: 3
 157 *   control        : cpu-fan
 158 *   sensor         : gpu-temp
 159 *   PID params     : G_d = 0x00000000
 160 *                    G_p = 0x0010CCCC
 161 *                    G_r = 0x00019999
 162 *                    History = 2 entries
 163 *                    Input target = 0x500000
 164 *                    Interval = 5s
 165 *
 166 * KODIAK (aka northbridge) Fan control loop.
 167 *
 168 * # model_id: 2
 169 *   control        : optical-drive-fan
 170 *   sensor         : north-bridge-temp
 171 *   PID params     : G_d = 0x00000000
 172 *                    G_p = 0x003BD70A
 173 *                    G_r = 0x00019999
 174 *                    History = 2 entries
 175 *                    Input target = 0x550000
 176 *                    Interval = 5s
 177 *
 178 * # model_id: 3
 179 *   control        : hard-drive-fan
 180 *   sensor         : north-bridge-temp
 181 *   PID params     : G_d = 0x00000000
 182 *                    G_p = 0x0030F5C2
 183 *                    G_r = 0x00019999
 184 *                    History = 2 entries
 185 *                    Input target = 0x550000
 186 *                    Interval = 5s
 187 *
 188 * CPU Fan control loop.
 189 *
 190 *   control        : cpu-fan
 191 *   sensors        : cpu-temp, cpu-power
 192 *   PID params     : from SDB partition
 193 *
 194 *
 195 * CPU Slew control loop.
 196 *
 197 *   control        : cpufreq-clamp
 198 *   sensor         : cpu-temp
 199 *
 200 */
 201
 202#undef  DEBUG
 203
 204#include <linux/types.h>
 205#include <linux/errno.h>
 206#include <linux/kernel.h>
 207#include <linux/delay.h>
 208#include <linux/slab.h>
 209#include <linux/init.h>
 210#include <linux/spinlock.h>
 211#include <linux/wait.h>
 212#include <linux/kmod.h>
 213#include <linux/device.h>
 214#include <linux/platform_device.h>
 215#include <asm/prom.h>
 216#include <asm/machdep.h>
 217#include <asm/io.h>
 218#include <asm/sections.h>
 219#include <asm/smu.h>
 220
 221#include "windfarm.h"
 222#include "windfarm_pid.h"
 223
 224#define VERSION "0.3"
 225
 226static int pm121_mach_model;    /* machine model id */
 227
 228/* Controls & sensors */
 229static struct wf_sensor *sensor_cpu_power;
 230static struct wf_sensor *sensor_cpu_temp;
 231static struct wf_sensor *sensor_cpu_voltage;
 232static struct wf_sensor *sensor_cpu_current;
 233static struct wf_sensor *sensor_gpu_temp;
 234static struct wf_sensor *sensor_north_bridge_temp;
 235static struct wf_sensor *sensor_hard_drive_temp;
 236static struct wf_sensor *sensor_optical_drive_temp;
 237static struct wf_sensor *sensor_incoming_air_temp; /* unused ! */
 238
 239enum {
 240        FAN_CPU,
 241        FAN_HD,
 242        FAN_OD,
 243        CPUFREQ,
 244        N_CONTROLS
 245};
 246static struct wf_control *controls[N_CONTROLS] = {};
 247
 248/* Set to kick the control loop into life */
 249static int pm121_all_controls_ok, pm121_all_sensors_ok, pm121_started;
 250
 251enum {
 252        FAILURE_FAN             = 1 << 0,
 253        FAILURE_SENSOR          = 1 << 1,
 254        FAILURE_OVERTEMP        = 1 << 2
 255};
 256
 257/* All sys loops. Note the HD before the OD loop in order to have it
 258   run before. */
        he contr= hd in  : , but luckily, */
 161        he contr= hd e. */
        he contr= hd in od e. */
        he contr= od e. */
 165        
 166};

 168stathe st char/a> *[] /a>
 169&quGN_0.3"&quHD0.3"&qu * KOD0.3"&quOD0.3" 173};
 174<>};
 175#define N_FIGROLS" class="srePM>pm1NUM">N_FIGR169
statunsignedtic int static int pm12kippstrted;
stat> *
pm1corrm/sectied" class="sref">pm1corrm/sect232
 184};

static struct pm1corrm/sectied" class="sref">pm1corrm/sect232 *[N_CONTROLS[N_FIGROLS" class="srePM>pm1NUM">N_FIGR169] /a>
 187f">FAN e. */
 188
MODEL 2 e. */
MODEL 3 e. */
 196f">FHN e. */

MODEL 2 e. */
MODEL 3 e. */
f">F * Ce. */

MODEL 2 e. */
MODEL 3 e. */
/">CPUF has no f"rrm/sect (and is not implecommed at all) e. */
 221};
 222<>};
pm1connm/sectied" class="sref">pm1connm/sect232
pm1corrm/sectied" class="sref">pm1corrm/sect232 *;
 227};

 229static struct pm1connm/sectied" class="sref">pm1connm/sect232pm1connm/sectrols" class="sref">pm1connm/sectrols] /a>
MODEL 2 e. */
FAN_CPU,
FAN_OD,
MODEL 3 e. */
FAN_OD,
FAN_HD,
 243     }; 1,
};

poi  Inder ck thu_currine modconnm/sect e. */
static struct pm1connm/sectied" class="sref">pm1connm/sect232 *pm1connm/sectied" class="sref">pm1connm/sect232};

 *
****** SystemCPU s>/* Cont LD lo******> *
 *


/ince each OD lohandles only on the contrand we wan Set avoirte/
writing virtualthe cont, we  Hiseick the contrf"rrm/sect withick te/
OD loID par. Some data aseinot ser,ick seiaseis="cct et altrol lte/
 257and thus,  : h="+cdoop.
 258
pm1sys_ID paied" class="sref">pm12ys_ID pa232
purely inlatf>stve  ince we use>/* mach_mo-2 as indext". */
     ic struct wf_sensor */se>f">sensodticstead ?t". */
        };

static struct pm1sys_ID paied" class="sref">pm12ys_ID pa232
 168pm1sys_21_aID paried" class="sref">pm12ys_21_aID parols[[N_FIGROLS" class="srePM>pm1NUM">N_FIGR169] /a>
 169G* CPU Fan control lt". */

sensor_gpu_temp<; 1,
FAN_HD,
sensor_gpu_temp<; 1,
FAN_CPU,
     }; 1,
HDCPU Fan control lt". */

sensor_hard_drive_temp<; 1,

<3"L189" class="line" name3"L18938 169FAN_HD,
sensor_hard_drive_temp<; 1,
 196FAN_HD,
 * KODCPU Fan control lt". */

sensor_north_bridge_temp<; 1,
FAN_OD,
sensor_north_bridge_temp<; 1,
FAN_HD,
     }; 1,
ODCPU Fan control lt". */

sensor_optical_drive_temp<; 1,
FAN_OD,
sensor_optical_drive_temp<; 1,
FAN_OD,
 229};

ck t : h="+cd valuest". */
 232#define #define #define #define 
S1_tt data  unusby>ck tsystemCfU s>an control l */

pm1sys_21_ttage" class="srede=pm1sys_21_tt169
 241        };
     ic struct };
};
pm1sys_21_ttage" class="srede=pm1sys_21_tt169 *pm1sys_21_ttage" class="srede=pm1sys_21_tt169[] /a>};


 248****** C* CPU s>/* Cont LD lo******> *
 *


#define 
/1_tt data  unusby>ck tcpuCfU s>an control l */

pm1cpu_21_ttage" class="srede=pm1cpu_21_tt169
        };
};

static struct pm1cpu_21_ttage" class="srede=pm1cpu_21_tt169 *pm1cpu_21_ttage" class="srede=pm1cpu_21_tt169};

};


***** Implecommasect e****> *
 *


f"rrm/sect ck tvalue  uing ck toutput-low-bound>f"rrm/sect algot". */
stat   pm1c"rrm/sage" class="srede=pm1c"rrm/s232<(           
pm1corrm/sectied" class="sref">pm1corrm/sect232 *;
        [pm1/* mach_moied" class="sref">pm1/* mach_moted< - 2]/a>;
;
 *            *

pm1corrm/sec=ols " name3"L188388169ivers/macintosh/windfarm_pm121.c#L188" iw.3#L242" id3"L242" iw.3#L242" id3356="+4 href="+c21.33aa  .    * ref=""""""> * rntosh/windfarm_pm121.4aaaaa  =olsh/windfa4"L182482169 *
<3"L189" 4lass=49/macintosh/windfarm_pm121.4#L249" id4"L169" class="lline" nam43"L190390169ef="drivers/macintosh/windfarm_pm121.3drivers/macintosh/wi .   
FAN_HD4/a>,
4a href="drivers/macintoptage" class="sr   ;
;
;
,
 * *ef="drivers/macintosh/windfarm_pm121.3drivers/macintosh/wi .efloptted<) >a>a 16/a>;
;
        
 196pm1corrm/sec=ols " name3"L18838,a href="+cooffserent" class="sreoffserted;
FAN_HD4/a>,
49sensorpm1corrm/sec=ols " name3"L188388>

"ef="d: %s dependm121on %s, "17047 250

"/a>;
,
 * KODCPU Fan control 5t". *5
,
,
pm1corrm/sec=ols " name3"L18838,a(dri)atols" class="srent"m/sectols" class="sref"68};
FAN_OD5/a>,
5a href="driver+conew_setpoi  emp" class="srenew_setpoi  _ODFAN_HD5207" 5lass="line" na */

};
;
FAN_HD5/a>,
5a href+conew_setpoi  emp" class="srenew_setpoi  _OD};

ODCPU Fan control 5t". *516185485188<}" naloptage" class="18648 2reateacint.4#L"drivers/macintosh/winreateacint.4#L

 258ine" name4"L16146L258" class="line" n> 258FAN_OD5/a>,
5a href"line" name4"L184484169
 16;atols" class="sridfarm_pm121.4#Lidri8++8>
pm1sys_ID paied" class="sref">pm12yL253s="srehe cont_irteL253s="8838e4"L178478241idfarm_pm121.4#Lidri8]h/windfarm_pm121.4#L221" id4"L221" class="line" name=sloptage" class="        
 258pm1sys_ID paied" class="sref">pm12yL253s="srehe cont_irteL253s="8838e4"L178478241idfarm_pm121.4#Lidri8]s="line" name4"L184484169FAN_OD5/a>,
52sensor
 258<

"ef="d: %s fpm121.figt, wefound "17047 250

" forc.4ispmss=/spasref"\n"17047 2oi  _OD,
pm12yL253s="srehe cont_irteL253s="8838es="line" name4"L184484169pm12yfai="+coderrm/sectofai=dri8="line" name4"L184484169
 * 258
 241   5    <54   pm1sy74<>};
,
  5  ic 54ass="line" name3"L192399999999999999999999999999>};
5 ct pm1sy74<>};


"ef="d: Memory allocclass=error\n"17047 2s="line" name4"L184484169 *pm12yfai="+coderrm/sectofai=dri8="line" name4"L184484169[
pm1corrm/sectied" class="sr1of">pm1sy74<>};
pm1cpu_21_ttage" class=a="line" 5cintosh/windfarm_pm121.45L238"54_irted" class="srehe cont_irted[ *

 *
 258grne" name4"L22542pm1SYS_GN_OD" class="srePM>="line" name4"L1844841695SOR" class="srePM>pm1C* 5INTER554  pm1SYS_HISTORY_SIZESOR" class="srePM>pm1="line" name4"L184484169pm1SYS_GNSOR" class="srePM>pm1SYS_GN169
,
 258;
;
   5    <55_irted" class="srehe cont_irted[pm1sy74<>};
;

"ef="d: %s _pm121.4#L213" idaaitialized.\n"17047 2ted;

"       emp" cd=%d.%03d, m_p=%drRPM, ma1=%drRPM\n"17047 2oi  _OD,
pm5cpu_21_ttage" class="sre5e=pm156="line" name4"L2034031tols" class="srL253s" cltruct pm12yL253s="srehe cont_irteL253s="8838e href="+conew_ itFIX32TOPRs="srehe cont_irteFIX32TOPRs="
,
>;

pm12yfai="+coderrm/sectofai=dri8:"line" name4"L184484169 *
;
 *


"ef="d: fai=edrrm/set up %s 3" id"17047 2ted;

"settm121\"%s\"2to ma12speed.\n"17047 2oi  _OD,
pm1c5rrm/sage" class="srede=p51c"rr5/s232<(   pm12yL253s="srehe cont_irteL253s="8838e href="+conew_ it9<   };
};
;
[pm15* mac5_moted
   5a hre5="+coderrm/secntosh/windfarm_pm121.3#L258" id3"L258" class="line" name3"L2583> 258ine" name4"L16146L258" class="line" n> 258pm1sy74<>};
};
ine" name4"L1614saaaa{ .    ref=""""""> * *.4#L176"55" id4"L185" class="line5 name58s/mac"line" name4"L184484169 258pm1sys_ID paied" class="sref">pm12yL253s="srehe cont_irteL253s="8838e4"L178478241         *};
pm1sy74<>};

<3"L189" 5lass=59moted< - 2]/a>;
 258 258FAN_HD5/a>,
59 href"line" name4"L184484169};
pm1cpu_21_ttage" class=a!=ass>
preadjue_opkr169};
preadjue_88388169ivers/macintosh/windfarm_pm121.c#L188" iw.35af="+co a5rm_pm121.3#L174" id3"L195" cla5s="line" name3"L19439444444444goto ss="sref">pm12yreadjue_opkr169};
;
 196FAN_HD5/a>,
59lass="line" name4"L257457169<_opkr169};
pm1cpu_21_ttage" class=apm1SYS_HISTORY_SIZESOR" class="srePM>pm1="line" name4"L184484169;
;
 * KODCPU Fan control 6t". *60   

"an>
,
;
pfai=urey74<>};
;
FAN_OD6/a>,
60s/mac"line" name4"L184484169FAN_HD6207" 60lass="line" name4"L257457169cr_debug"drivers/macintor_debug

"ef="d: %s _pm1e" c ! %s: %d.%03d\n"17047 2oi  _OD,
pm12yL253s="srehe cont_irteL253s="8838e href="+conew_ itssaaa{ .   ,
;
FAN_HD6/a>,
61(   

stat   ODCPU Fan control 6t". *61ine" name4"L225425169 258 258

 *
 258pm1corrm/sec=ols " name3"L188388169ivers/macintosh/windfarm_pm121.c#L188" iw.36line" nam6_OD" class="sref">FAN_OD6/a>,
62ass="line" name4"L201>;
pm1corrm/sec=ols " name3"L18838 
"ef="d: %s /a>;
pm12yreadjue_opkr169};
pfai=urey74<>};

FAN_OD6/a>,
62sensor;
;
pm1corrm/sec=ols " name3"L188388="line" name4"L184484169

"an>
,

;

pfai=urey74<>};



pm12ycoi 6L258" class="line" poi 6L258arm_="line" name4"L184484169 241   6    <64     6  ic 643ref="+cod"L232" class="sref> 232 * ref=""""""> *
pm1corrm/sectied" class="sr.4#_ puorrm/sec=ols " f4#_ pu   *

 *
ef=


"ef="d: CPU PIDLfpm121.figt, wefound.\n"17047 28="line" name4"L184484169pm12yfai="+coderrm/sectofai=dri8="line" name4"L184484169

   6    <65_irteintosh/windfarm_pm121.444444444* forcnow) in orde{2to getc.m21

ef=

};
pm6cpu_21_ttage" class="sre6e=pm166="line" name4"L203403 hreUme4"L-a hrrm21osh/windfarm_pmtm21
 ref=""""""> *<)tols" class="srfvcorrm/sec=ols " fvc  <<a16="line" name4"L184484169;



 *
 *};
};
 *
;
}arm_ <pm12yfai="+coderrm/sectofai=dri8="line" name4"L184484169pm1c6rrm/sage" class="srede=p61c"rr673  }arm_drivers/macintosh/wi+cof">pm1cpu_21_ttage" class=a};

,
pm1SYS_HISTORY_SIZESOR" CPUecoPM>pm1dri8="line" name4"L184484169
[
"ef="d: History size oommflow ond"17047 2ted;
pm16* mac68ine" name4"L21941 169
"CPU 21.4#L213" id(%d)\n"17047 2oatols" class="sreoidata .      6a hre68/span>
grne" ngrne" n/e,
.4#L176"65" id4"L185" class="line6 name686" class="lin,
 ref=""""""> *<)tols" class="sreoidata .   <<a16="line" name4"L184484169 ref=""""""> *<)tols" class="sreoidata .   <<a16="line" name4"L1844841696* * ref=""""""> *<)tols" class="sreoidata .   <<a16="line" name4"L184484169
<3"L189" 6lass=69aaaaaaaa}; 1,
FAN_HD6/a>,
69   

pm1corrm/secties" class="sr9<   ;

pm1corrm/sectieh/wihistory_le="drivers/macinthistory_le=  ,

pm1corrm/secties" class="sr9<   ;

pm1corrm/sectieh/wihistory_le="drivers/macinthistory_le=  ;

};
"ef="d: %slass="srcoi 6L258" class="line" poi 6L258arm_s="7ine" name7"L184484169

"       emp" cd=&#,ring">"an>

FAN_HD6/a>,
69   pm12yL253s="srehe cont_irteL253s="8838e href="+conew_ itFIX32TOPRs="srehe cont_irteFIX32TOPRs="
};
FAN_OD6/a>,
62ass="line" name4"L201>;
pm12yreadjue_opkr169};

&qt;ef="d: %slass="srcoi 6L258" class="line" poi 6L258arm_s="7i9e" name7"L184484169,7  "5class57ine" name4"L225425169>;
pm1corrm/sectiehss="srcoi 6L258" class="line" poi 6L258arm_s="7d_OD,7"L184484169;

pm1corrm/sectieh/wihistory_le="drivers/macinthistory_le=  

pm1sy74<>};

 *
FAN_HD6/a>,
69   FAN_HD6/a>,
69   .4#L176"55" id47ass="sref7>FAN_OD6/a>,
62ass="line7 name72"L184484169pm1cpu_21_ttage" class=a!=ass>
preadjue_opkr169};
preadjue_88388169ivers/macintosh/windfarm_pm121.c#L188" iw.35af="+co a5rm_pm17 name4"L2744241696 clas6s="line" n7me4"L724424href="+conew_ it9<<<<<<<<12yreadjue_opkr169};
;
};
pm1cpu_21_ttage" class=apm1SYS_HISTORY_SIZESOR" CPUecoPM>pm1dri8="line" name4"L184484169
 * K72" id4"L272" clas6="lin63f_sensor<7aaaa 73rrm/sectolss_a hri 6L258" class=rcdri8 

&qt;ef="d: %slass="srcoi name7;d\n"17047 2oi  _OD,
 * K72L225" id7L235" c6ass="63it169<, 07/a>;
735169>;
preadjue_88388169ie|
7a href=6drive63/macint187<}" n73 * K7pm121.4#L740" id46L240"64"+coderrm7secnt74href="+cooffserrcsrehe cont_irtercdri8s>

&qt;ef="d: %slass="srcoi X32TO7;d\n"17047 2oi  _OD,
  6  ic 643ref="+co7"L23274ef="+coderrm/sectolsco<<<<< * K7href="+co7irted" 6lass=644        7   32743403 hreUme4"L-a hrrm21osh/windfarm_c}"line|preadjue_88388169ie| *7pm1corrm7secti7d" class="sr.4#_ puorrm/sec=omacintor"L21"ef="d: %slass="srcoi 6L258" class="s#37;d.&#coi name\n"17047 2oi°C, X32TO\n"17047 2oi  _OD,
 * K7 *7
7a href=6drive65"+coderrm7secto75href="+cooffserrcsrehe cont_irtewiid4"L223ss="line" name4"L="srWF CPUePID_MAXSYS lass=drivers/macintosh/wi69};
 258}arm_)oi7 _OD,7 247pan cla6s="co65         7   if75940 href="+conew_ itF21osh/windfarm_c}"line|preadjue_88388169ie|};
};

7a href=6drive65sre it2327)a>,
7a href="drivcoi="drivers/macintosys_ID pa232

stat   7pm121.4#L747" id46L257"65ass="line7 na *75s &a>;
7pwindfarm7   6    <65_irteinto7h/win7584181tols" class="srL2errm/sectolsco<<<<<};
 258     i6 stru66s/macinto7h/win76href="drivers/macintosh/windfarm_p6line" nam63"L1907href="+co7irted" 6lass=66"+coderrm7secto7s" class="srhd{="drivers/macintosys_ID pacooffD pa232<

pm1corrm/sec=ols " name3"L18838  ref="""lass=drivers/macintosh/wief">pm1corrm/sec=ols " name3"L18838 "ef="d: %slass="srcoi 6L258" clas":/%drRPM\n"17047 2oi  _OD,
7*};

7a href=6drive67ine" name7"L21977tols" class="srsr   pfai=urey74<>};

<7pan cla6s="co67   ;

};
pm1corrm/sec=ols " name3"L188388="line" name4"L184484169pmerrcsrehe cont_irtercdri8s>

&qt;ef="d: %slass="sr%d\n"17047 2oi  _OD,
};773403 hreUme4"L-a hrrmectolsco<<<<<;

preadjue_88388169ie|,
775169>;
pm16* mac68ine" name7"L21978arm_pm121.444444444ys_ID pa/*a href="drivers/macintosh/windfarm_p6ref="driv6rs/mac7ecpu_pote7   6a hre68/span>






a href="drivers/macintosh/windfarm_p6ref="driv6rs/mac7e" class=7new_ it669< +68href="+co7"L2+c7new_sem121.444444444ys_ID pa2*a href="drivers/macintosh/windfarm_p6ref="driv6rs/mac7e" class=7enew_ i6169< 683  
preadjue_88388169ie|7* *preadjue_88388169i" c
"ef="d: %slass="srcoi 6L258" c h" only7;d)\n"s !"7i9e" name7"L184484169pfai=urey74pfai=urey74pfai=urey74,
7932" class="sref> 232 77;
preadjue_88388169i" c<8" class6"srew6_sensorpreadjue_88388169i"kipponls="sr+cooffser1oe_opkr169};
preadjue_88388169i"kipponls="ssh/windfarm_pm121.c#L188" iw.36s/macinto6h/wind8m13ied" c8ass="sre ax3232<6   FAN_OD8/a>,
62ass="line" name4"8201>;8 ref=""potalL+ivers/macintWF itFIpotalL+iverss="/spa1"drivers/macintosh/windfarm_p6ref="driv6rs/mac8m7>FAN_OD8/a href6"driv6rs/mac"lne812yre80 connnnnnnnnn2to ERN_WARNING"drivis/macintWF itFIiss="/spa1of">pfai=urey74pfai=urey74<.4#L
 258pfai=urey74;
87};
 258<8  "5class57ine" name8"L22581href="drivers/macintosh/windfarm_p6line" nam64"L2118160" clas8=">
pm1c8rrm/s81"L184484169;
pfai=urey74<>};

814connnnnnnnnn2to ERN_WARNING"drivis/macintWF itFIiss="/spa 1of">pfai=urey74pfai=urey74pfai=urey74
}"lin"ysiriverclasAN_CPUoPM>pm1SYSis/macintWF itFIiss="8sh/windfarm_pm121.c#L188" iw.36s/macinto6h/wind8w_ itied"8class="6renew68it169<7f=8+cod"815169>;

8a href=6d createmacint188<}" n81ew_setpoi  emp" class="srenew_setpoi  _OD
81/span484169,
8a href="rm/secerosh/winpuy74<>};
h/winpuy74<>};
}arm_ <preadjue_88388169ivers/macintos=pa1"drivers/macintosh/windfarm_p6ref="driv6rs/mac8m121.4#L282" id4"6222" 623  pfai=urey74<="lie|preadjue_88388169ie|m121.444444444ys_ID pa222222222*\n&qs to fullarm_s=.a href="drivers/macintosh/windfarm_p6ref="driv6rs/mac8#
8aaaaaaa6aaaa 6.   FAN_OD6/a>,
62sensorpreadjue_88388169ie|
pfai=urey74pfai=urey74pfai=urey74
;

;
pmp" class="srenew_setpoi  _OD;
835169>m121.444444444ys_ID pa222222222*\all\n&qs on next i" cat /ainhref="drivers/macintosh/windfarm_p6ref="driv6rs/mac82
8>pm1SYS6INTER63s/mac"lin8" nam83ew_sem121.444444444ys_ID pa222222222*preadjue_88388169ie|
;
};
1osh/windfarm_pm4"L182"s="line" n1osh/windfarm_pm4""srsr   preadjue_88388169ivers/macintos=p84484169 248   6    <64     6  ic 643ref="+co8"L23284ew_ itied" class="srenew_ it169< &6s="line" 6ame4"L8href="+co8irted" 6lass=644        8   32843403 hreUme4"{="drivers/macintosys_ID Osrename7det#37;d,ss="ify and " c *pfai=urey74<="lie|
pm1corrm8secti84s &a>;
preadjue_88388169i"kipponls="sr= 244841698
8a href=6drive65"+coderrm8secto85href="drivers/macintosh/windfarm_p6line" nam64"L2118*2414> 248pan cla6s="co65         8   if85940 href="+co{="drivers/macintosys_ID We onlyiveear the osrename7eroosrename7isiveear /="href="drivers/macintosh/windfarm_p6ref="driv6rs/mac8L232" id48L252" c6ass="65f_sensor<8aaaa 85rrm/sm121.444444444ys_ID pa222222222*\_and_ss= otherye|(can't meastol name cattol) acinhref="drivers/macintosh/windfarm_p6ref="driv6rs/mac8_pm121.4#8254" id6"L254655       i6 stru66s/macinto8h/win86href=p" class="srenew_setpoi  _OD}gisterline"     =   }gisterline"   s/mac2328ttage" cl8ss="sre6e=pm166="line" n8me4"L863403 hreUme4"L-a hrrmectolsco<<<<<
8tpm121.4#8ss="lin6" nam66="line" n8me4} 864424href="+conew_ it9999999999999999999999999999999999unsign;drefrcsrehe cont_irterivers/,9m/sectol" class"drivers/macintosh/windfarm_p6ref="driv6rs/mac8"L164" cl8ss="lin6" nam66ine" name8"L22586 hrefent". */
pfai=urey74
;


;
pfai=urey74<="sid4"ine"     =   

8*pfai=urey74pfai=urey74

8a href=6drive67ine" name8"L21987040 href="+cop" class="srenew_setpoi  _OD<8pan cla6s="co67   pfai=urey74};873403 e" cld createmacin clas="srkmallo="liine"     =   

,
875169>;

pm16* mac68ine" name8"L21988href="drivers/macintosh/windfarm_p6line" nam63"L1908ecpu_pote8   6a hre68/span>
}gisterline"   s/mac#_ puorrm/sec=o18648 256
&qt;ef="d: %slopcldal-acint-fa _OD,
pN_ODILURE_SENSOc>pm1=N_OD32" )sdfarmdfarm2s/ma-bclass="lial   =   }gisterline"   s/mac#_ puorrm/sec=o18648 256
&qt;ef="d: %slhard-acint-fa _OD,
pN_HDILURE_SENSOc>pm1=N_HD32" )sdfarmdfarm2s/ma-bclass="lial   =   pfai=urey74}gisterline"   s/mac#_ puorrm/sec=o18648 256
&qt;ef="d: %slcpu-fa _OD,
pN_OFAN_CPU8838e="line" name4"L1)sdfarmdfarm2s/ma-bclass="lial   =   }gisterline"   s/mac#_ puorrm/sec=o18648 256
&qt;ef="d: %slcpufreq-vermp_OD,

6*8*
<8"L189" 6lass=69aaaaaaaa}8 1,
<89href="drivers/macintosh/windfarm_p6line" nam63"L1908#cpu_pote8aaaaaaa6aaaa 69"+coderrm8secto89href="drivers/macintosh/windfarm_p6line" nam64"L2118ass="sref8>FAN_HD6/a>,
69   }gisterl;d\n&qs/mac23284"L173" c8ass="li6e" na67u_21_tt9i8ers/m893403 hreUme4"L-a hrrmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmrenst\vhar 4#_ puorrm/sec=omatch648 256
8lass="sre8ax3232<6   
,
89 hrefent". */
;


;
pfai=urey74<="sid4";d\n&qL182"s="line" n1osid4";d\n&q"srsr   
<9" class6"srew6_sensor;
<9"FAN_HD6/a>,
69   
FAN_OD9/a>,
62ass="line" name4"9201>;904424hent". */
;
FAN_OD9/a href6"driv6rs/mac"lne912yre90"L184484169
9084181tols" class="srLe4"L184484169<9  "5class57ine" name9"L22591" class="srhd{rehe cont_irteal   =   }gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slcpu-name_OD,
pm1c9rrm/s91L20+goto ss="sref">pmmmmmmmmmmmmmmmmmmmmm"sr<_opkr169};
;
pfai=urey74}gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slcpu-current_OD,

913403 hreUme4"L-a hrrmmmmmmmmmmmmmmmmmmmmm"sr<_opkr169};
FAN_OD99< +68href="+cod"L2+c7pfai=urey74}gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slcpu-voltage_OD,
FAN_OD9class="6renew68it169<7f=9+cod"915169>;
};
FAN_OD9a href=6d createmacint189<}" n91 href="drivcoi 6L258" class=al   =   }gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slcpu-+iver_OD,
};
,
91Ume4"L-a hrpowadj .   }gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slhard-acint-name_OD,
derrm/sectolsco<<<<<"sr<_opkr169};
}gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slopcldal-acint-name_OD,
FAN_OD6/a>,
62ass="line9 name92L20+goto ss="sref">pmmmmmmmmmmmmmmmmmmmmm"sr<_opkr169};
pfai=urey74}gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slincom"d:-air-name_OD,
};
FAN_OD944241696 clas6s="line" n9me4"L924424href="+cof">pfai=urey74}gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slnorth-bridgt-name_OD,
FAN_OD9"L225" 6lass=6line" nss=9sref"925169>;
};
FAN_OD9aaaaaaa6aaaa 6.   }gisterl;d\n&qs/mac#_ puorrm/sec=o;oL182"s="line" nrra toc  Im_pmg">&qt;ef="d: %slgpu-name_OD,
};


;
92
9>pm1SYS6INTER63s/mac"lin9" nam93 connnnnnnnnname4"L2000000000unsign;drlong   =   



"ef="d: %slass="srcoi 6L258" new 7;d)\n&q%d\det#37;d  _OD,
 249   6    <64   pmmmmmmmmmm(c232;
  6  ic 643ref="+co9"L232945169>;

 *"ef="d: %slass="srcoi 6L258" new ;d\n&qu%d\det#37;d  _OD,

9lass="s6ef"LO64s/mac"lin9" nam94 connnnnnnnnname4"L2000000000m(c232;
pm1corrm9secti94s &a>;

9pm121.46L238"64_irted" c9ass="9484181tols" class="srLbreak44841699

pmmmmmmmmms/ma-bclass="li"e" nant_irtekmalloc
pm1C* 6INTER654  ,
955169>;
   6    <65_irteinto9h/win9584181e" cld 232


9pmSMU_SDB_SENSORTREE_IDa toc  _ puorrm/sec=o#LNULndri88"line" name4"L18m4484169

derrm/sec232};
<9pan cla6s="co67   ;
};97"L257457169coi 6L258" class="_ <};
,
975169>;
,
pm16* mac68ine" name9"L21998href=p" class="srenew_setpoi  _OD   6a hre68/span>


pfai=urey74}gisterlilientL182"s="line" nwfa>}gisterlilients/mac"sr<_opkr169};
6*9*
<9"L189" 6lass=69aaaaaaaa}9 1,
<99href=e" cld efrcsrehe cont_irte"_ <

FAN_HD6/a>,
69   }gisterlilientL182"s="line" nwfaun>}gisterlilients/mac"sr<_opkr169};
,
995169>e" cld 232
;

t". */
10h5169>;
};
,
69   10h940 href="+copref="drivers/macintosh/windfar6121.4#L226" id4"10h3windfao10hnew_ i6169< 683  10h3ref=}1"drivers/macintosh/windfarm_p6ref="driv6rs/mac10h4windfao10hss="li6e" na67u_21_tt9i10hss>10h"L18448416910h5169>e" cld efrcsrehe cont_irte_ainitL182"s="line" n_ainitit16.s/ma-bclass="li"e" nainitL182"s="line" n"e" nainita hrecreamnt". */
10h7ref=ent". */
10h10aaref="+cooffserooi 6L258" class=ofau7hhols_is_comp clbleL182"s="line" nofau7hhols_is_comp clble>"ef="d: %slass="srcoi PiverMac12,1_OD,

  "5class57ine" name1010a5169>;
pm1c10=">>10a"L184484169
10a3403 hreUme4"L-a hrrmpm121.4#L182" irequest_miruleL182"s="line" nrequest_mirule>"ef="d: %slass="srcoi e6intosh/ mu_renew_ s_OD,
10a4424href="+conew_ it9pm121.4#L182" irequest_miruleL182"s="line" nrequest_mirule>"ef="d: %slass="srcoi e6intosh/ mu_rm\n&qs_OD,
"ef="d: %slass="srcoi e6intosh/ mu_rat_OD,
10a connnnnnnnnname4"L2021osh/windfarm_request_miruleL182"s="line" nrequest_mirule>"ef="d: %slass="srcoi e6intosh/lm75_rm\n&q_OD,
10as &a>;
"ef="d: %slass="srcoi e6intosh/max6690_rm\n&q_OD,
 *"ef="d: %slass="srcoi e6intosh/cpufreq_cermp_OD,
10"L169>;
}gisters/mac"sr<_opkr169};
10"5169>;
FAN_OD6/a>,
62ass="line10>FA>10""L18448416910"3connnnnnnnnne4"L18ei 6L258" class=rcL182"s="line" nrca to448416910"3403 p" class="srenew_setpoi  _OD10"32" class="sref> 232 710"5169>e" cld createmacin clas="sr__exitL182"s="line" n_aexitit16.s/ma-bclass="li"e" naexitL182"s="line" n"e" naexita hrecreamnt". */

10"Ume4"L-a hrpowadj .   }gisterL182"s="line" n"lateorm_d 232}gisters/mac"sr<_opkr169};
10me403 p" class="srenew_setpoi  _OD
10mhref="drivers/macintosh/windfarm_p6line" nam64"L21110m2windfao10sh/wind6arm_p63ass="line10sh/>10m"L18448416910m3conntted;
10m4conntted;
10m32" class="sref> 232 7"ef="d: %slass="srcoi tienne B2,
pm1SYS6INTER63s/mac"lin10>pm>10m7conntted;
"ef="d: %slass="srcoi Thermal 7;d)\n&qlogld eor iMac G5 (iSight)_OD,
10m8conntted;
"ef="d: %slass="srcoi GPL_OD,
10m104#connt/pre>
The original LXR software by the = LXR communitys/mar this experimental acinion by = lxr@"L6ux.nos/ma. lxr."L6ux.no k6osly hosted by = Redpill LL6pro ASs/mar provider of LL6uxorensultonlyand operat /as services since 1995.