pmud monitoring temperature (Re: powerbook doubles)

Michael Schmitz schmitz at opal.biophys.uni-duesseldorf.de
Tue Jan 30 01:49:02 EST 2001


> i reworked this patch to work with the current bk tree (argh. i just complained to iain that diffs
> against a moving target were gross)
>
> http://redcloud.uccs.edu/~bcmidgle/linux/
>
> btw, it looks like troy wants the _{gs}et_THRM{123} macros changed to use some different macros,
> but i'm not familiar with that stuff so i just reenabled the old macros.

I don't think what changes you propose there but from the comment on your
patch page ('cpu speed not included in calculations') it seems you picked
up the old version of the patch. I attach the version including
conversion time calculation from processor speed (for 2.4.0pre). The CPU
speed is  preset to 500 MHz in case it can't be determined from OF, this
gives too long conversion times for slower processors - does this hurt?
What is the maximum CPU speed for machines without clock_frequency
present in the device tree?

	Michael
-------------- next part --------------
--- 2.4.0-test9/arch/ppc/kernel/setup.c.cputemp	Tue Sep 12 07:51:56 2000
+++ 2.4.0-test9/arch/ppc/kernel/setup.c	Sun Oct  8 14:50:09 2000
@@ -181,31 +181,84 @@
 	ppc_md.halt();
 }
   
+
+extern int _get_THRM1();
+extern int _get_THRM2();
+extern int _get_THRM3();
+extern int _set_THRM1(int);
+extern int _set_THRM2(int);
+extern int _set_THRM3(int);
+
 unsigned long cpu_temp(void)
 {
 	unsigned char thres = 0;
+	unsigned int othrm1;
+	unsigned int othrm2;
+	unsigned int othrm3;
+	unsigned int thrm1;
+	unsigned int thrm3;
+	unsigned int cnt;
+	unsigned int thresd;
+	unsigned int threst;
+	unsigned int i;
+	unsigned int cpu_freq;
 	
-#if 0
+	othrm1 = _get_THRM1();
+	othrm2 = _get_THRM2();
+	othrm3 = _get_THRM3();
 	/* disable thrm2 */
 	_set_THRM2( 0 );
-	/* threshold 0 C, tid: exceeding threshold, tie: don't generate interrupt */
-	_set_THRM1( THRM1_V );
+	_set_THRM1( 0 );
 
 	/* we need 20us to do the compare - assume 300MHz processor clock */
+	/* max value for sitv is 0x3fff - or 16383 */
+	/* this set for 500 MHz Pismo - how do we get access to clock?? */
+
+	cpu_freq = 500;
+	if ( have_of )
+	{
+		struct device_node *cpu_node;
+		int *fp;
+
+		cpu_node = find_type_devices("cpu");
+		if ( cpu_node ) {
+			fp = (int *) get_property(cpu_node, "clock-frequency", NULL);
+			if ( fp ) cpu_freq = *fp / 1000000;
+		}
+	}
+
+	/* 25 usec conversion time - max for 500 Mhz is approx. 32 usec */
 	_set_THRM3(0);
-	_set_THRM3(THRM3_E | (300*30)<<18 );
+	_set_THRM3(THRM3_E | THRM3_SITV(cpu_freq*25) );
 
-	udelay(100);
-	/* wait for the compare to complete */
-	/*while ( !(_get_THRM1() & THRM1_TIV) ) ;*/
-	if ( !(_get_THRM1() & THRM1_TIV) )
-		printk("no tiv\n");
-	if ( _get_THRM1() & THRM1_TIN )
-		printk("crossed\n");
+	thresd = 1 << 6;
+	threst = thresd;
+	i =  7;
+	while (i > 1 && thresd > 2)
+		{
+		thrm1 = (THRM1_THRES(threst)) | THRM1_V;
+		_set_THRM1(thrm1);
+		cnt = 10000;
+		while ( !((thrm1=_get_THRM1()) & THRM1_TIV) && cnt ) cnt--;
+		/* printk("THRM1 %8x %d %c %d %d %d\n",thrm1,10000-cnt,(thrm1&THRM1_TIN?'x':' '),threst,thresd,i); */
+		if (cnt == 0)
+			{ printk("THRM1: no interrupt %8x\n",thrm1); threst = 0; break; }
+		else
+			{
+			if ( thrm1 & THRM1_TIN )
+				{ thresd = thresd >> 1; threst += thresd; }
+			else
+				{ thresd = thresd >> 1; threst -= thresd; }
+			i--;
+			}
+		}
+	thres = threst;
+	/* printk("THRM1 %d\n",threst); */
 	/* turn everything off */
-	_set_THRM3(0);
-	_set_THRM1(0);
-#endif
+	_set_THRM3(othrm3);
+	/*_set_THRM1(0);*/
+	_set_THRM1(othrm1);
+	_set_THRM2(othrm2);
 		
 	return thres;
 }
--- 2.4.0-test9/include/asm-ppc/processor.h.cputemp	Mon Sep 11 00:45:07 2000
+++ 2.4.0-test9/include/asm-ppc/processor.h	Sun Oct  8 14:27:00 2000
@@ -261,15 +261,16 @@
 #define	  TCR_FIE		0x00800000	/* FIT Interrupt Enable */
 #define	  TCR_ARE		0x00400000	/* Auto Reload Enable */
 #define	SPRN_THRM1	0x3FC	/* Thermal Management Register 1 */
-#define	  THRM1_TIN		(1<<0)
-#define	  THRM1_TIV		(1<<1)
-#define	  THRM1_THRES		(0x7f<<2)
-#define	  THRM1_TID		(1<<29)
-#define	  THRM1_TIE		(1<<30)
-#define	  THRM1_V		(1<<31)
+#define	  THRM1_TIN		(1<<31)		/* these bits were defined in inverted endian sense originally */
+#define	  THRM1_TIV		(1<<30)
+#define	  THRM1_THRES(x)	((x&0x7f)<<23)
+#define	  THRM1_TID		(1<<2)
+#define	  THRM1_TIE		(1<<1)
+#define	  THRM1_V		(1<<0)
 #define	SPRN_THRM2	0x3FD	/* Thermal Management Register 2 */
 #define	SPRN_THRM3	0x3FE	/* Thermal Management Register 3 */
-#define	  THRM3_E		(1<<31)
+#define	  THRM3_E		(1<<0)
+#define   THRM3_SITV(x)		((x&0x3fff)<<1)
 #define	SPRN_TSR	0x3D8	/* Timer Status Register */
 #define	  TSR_ENW		0x80000000	/* Enable Next Watchdog */
 #define	  TSR_WIS		0x40000000	/* WDT Interrupt Status */


More information about the Linuxppc-dev mailing list