envctrl.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:31k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: envctrl.c,v 1.24.2.1 2002/01/15 09:01:39 davem Exp $
  2.  * envctrl.c: Temperature and Fan monitoring on Machines providing it.
  3.  *
  4.  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
  5.  * Copyright (C) 2000  Vinh Truong    (vinh.truong@eng.sun.com)
  6.  * VT - The implementation is to support Sun Microelectronics (SME) platform
  7.  *      environment monitoring.  SME platforms use pcf8584 as the i2c bus 
  8.  *      controller to access pcf8591 (8-bit A/D and D/A converter) and 
  9.  *      pcf8571 (256 x 8-bit static low-voltage RAM with I2C-bus interface).
  10.  *      At board level, it follows SME Firmware I2C Specification. Reference:
  11.  *  http://www-eu2.semiconductors.com/pip/PCF8584P
  12.  *  http://www-eu2.semiconductors.com/pip/PCF8574AP
  13.  *  http://www-eu2.semiconductors.com/pip/PCF8591P
  14.  *
  15.  * EB - Added support for CP1500 Global Address and PS/Voltage monitoring.
  16.  *  Eric Brower <ebrower@usa.net>
  17.  */
  18. #include <linux/config.h>
  19. #include <linux/module.h>
  20. #include <linux/sched.h>
  21. #include <linux/errno.h>
  22. #include <linux/delay.h>
  23. #include <linux/ioport.h>
  24. #include <linux/init.h>
  25. #include <linux/miscdevice.h>
  26. #include <linux/mm.h>
  27. #include <linux/slab.h>
  28. #include <linux/kernel.h>
  29. #include <asm/ebus.h>
  30. #include <asm/uaccess.h>
  31. #include <asm/envctrl.h>
  32. #define __KERNEL_SYSCALLS__
  33. static int errno;
  34. #include <asm/unistd.h>
  35. #define ENVCTRL_MINOR 162
  36. #define PCF8584_ADDRESS 0x55
  37. #define CONTROL_PIN 0x80
  38. #define CONTROL_ES0 0x40
  39. #define CONTROL_ES1 0x20
  40. #define CONTROL_ES2 0x10
  41. #define CONTROL_ENI 0x08
  42. #define CONTROL_STA 0x04
  43. #define CONTROL_STO 0x02
  44. #define CONTROL_ACK 0x01
  45. #define STATUS_PIN 0x80
  46. #define STATUS_STS 0x20
  47. #define STATUS_BER 0x10
  48. #define STATUS_LRB 0x08
  49. #define STATUS_AD0 0x08
  50. #define STATUS_AAB 0x04
  51. #define STATUS_LAB 0x02
  52. #define STATUS_BB 0x01
  53. /*
  54.  * CLK Mode Register.
  55.  */
  56. #define BUS_CLK_90 0x00
  57. #define BUS_CLK_45 0x01
  58. #define BUS_CLK_11 0x02
  59. #define BUS_CLK_1_5 0x03
  60. #define CLK_3 0x00
  61. #define CLK_4_43 0x10
  62. #define CLK_6 0x14
  63. #define CLK_8 0x18
  64. #define CLK_12 0x1c
  65. #define OBD_SEND_START 0xc5    /* value to generate I2c_bus START condition */
  66. #define OBD_SEND_STOP  0xc3    /* value to generate I2c_bus STOP condition */
  67. /* Monitor type of i2c child device.
  68.  * Firmware definitions.
  69.  */
  70. #define PCF8584_MAX_CHANNELS            8
  71. #define PCF8584_GLOBALADDR_TYPE 6  /* global address monitor */
  72. #define PCF8584_FANSTAT_TYPE            3  /* fan status monitor */
  73. #define PCF8584_VOLTAGE_TYPE            2  /* voltage monitor    */
  74. #define PCF8584_TEMP_TYPE          1  /* temperature monitor*/
  75. /* Monitor type of i2c child device.
  76.  * Driver definitions.
  77.  */
  78. #define ENVCTRL_NOMON 0
  79. #define ENVCTRL_CPUTEMP_MON 1    /* cpu temperature monitor */
  80. #define ENVCTRL_CPUVOLTAGE_MON    2    /* voltage monitor         */
  81. #define ENVCTRL_FANSTAT_MON   3    /* fan status monitor      */
  82. #define ENVCTRL_ETHERTEMP_MON 4    /* ethernet temperarture */
  83.      /* monitor                     */
  84. #define ENVCTRL_VOLTAGESTAT_MON    5    /* voltage status monitor  */
  85. #define ENVCTRL_MTHRBDTEMP_MON 6    /* motherboard temperature */
  86. #define ENVCTRL_SCSITEMP_MON 7    /* scsi temperarture */
  87. #define ENVCTRL_GLOBALADDR_MON 8    /* global address */
  88. /* Child device type.
  89.  * Driver definitions.
  90.  */
  91. #define I2C_ADC 0    /* pcf8591 */
  92. #define I2C_GPIO 1    /* pcf8571 */
  93. /* Data read from child device may need to decode
  94.  * through a data table and a scale.
  95.  * Translation type as defined by firmware.
  96.  */
  97. #define ENVCTRL_TRANSLATE_NO 0
  98. #define ENVCTRL_TRANSLATE_PARTIAL 1
  99. #define ENVCTRL_TRANSLATE_COMBINED 2
  100. #define ENVCTRL_TRANSLATE_FULL 3     /* table[data] */
  101. #define ENVCTRL_TRANSLATE_SCALE 4     /* table[data]/scale */
  102. /* Driver miscellaneous definitions. */
  103. #define ENVCTRL_MAX_CPU 4
  104. #define CHANNEL_DESC_SZ 256
  105. /* Mask values for combined GlobalAddress/PowerStatus node */
  106. #define ENVCTRL_GLOBALADDR_ADDR_MASK  0x1F
  107. #define ENVCTRL_GLOBALADDR_PSTAT_MASK 0x60
  108. /* Node 0x70 ignored on CompactPCI CP1400/1500 platforms 
  109.  * (see envctrl_init_i2c_child)
  110.  */
  111. #define ENVCTRL_CPCI_IGNORED_NODE 0x70
  112. struct pcf8584_reg {
  113.  unsigned char data;
  114.  unsigned char csr;
  115. };
  116. /* Each child device can be monitored by up to PCF8584_MAX_CHANNELS.
  117.  * Property of a port or channel as defined by the firmware.
  118.  */
  119. struct pcf8584_channel {
  120.         unsigned char chnl_no;
  121.         unsigned char io_direction;
  122.         unsigned char type;
  123.         unsigned char last;
  124. };
  125. /* Each child device may have one or more tables of bytes to help decode
  126.  * data. Table property as defined by the firmware.
  127.  */ 
  128. struct pcf8584_tblprop {
  129.         unsigned int type;
  130.         unsigned int scale;  
  131.         unsigned int offset; /* offset from the beginning of the table */
  132.         unsigned int size;
  133. };
  134. /* i2c child */
  135. struct i2c_child_t {
  136. /* Either ADC or GPIO. */
  137. unsigned char i2ctype;
  138.         unsigned long addr;    
  139.         struct pcf8584_channel chnl_array[PCF8584_MAX_CHANNELS];
  140. /* Channel info. */ 
  141. unsigned int total_chnls; /* Number of monitor channels. */
  142. unsigned char fan_mask; /* Byte mask for fan status channels. */
  143. unsigned char voltage_mask; /* Byte mask for voltage status channels. */
  144.         struct pcf8584_tblprop tblprop_array[PCF8584_MAX_CHANNELS];
  145. /* Properties of all monitor channels. */
  146. unsigned int total_tbls; /* Number of monitor tables. */
  147.         char *tables; /* Pointer to table(s). */
  148. char chnls_desc[CHANNEL_DESC_SZ]; /* Channel description. */
  149. char mon_type[PCF8584_MAX_CHANNELS];
  150. };
  151. volatile static struct pcf8584_reg *i2c = NULL;
  152. static struct i2c_child_t i2c_childlist[ENVCTRL_MAX_CPU*2];
  153. static unsigned char chnls_mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
  154. static unsigned int warning_temperature = 0;
  155. static unsigned int shutdown_temperature = 0;
  156. static char read_cpu;
  157. /* Forward declarations. */
  158. static struct i2c_child_t *envctrl_get_i2c_child(unsigned char);
  159. /* Function description: Read a byte from an i2c controller register.
  160.  * Return: A byte from the passed in address.
  161.  */
  162. static inline unsigned char envctrl_readb(volatile unsigned char *p)
  163. {
  164. return readb(p);
  165. }
  166. /* Function description: Write a byte to an i2c controller register.
  167.  * Return: Nothing.
  168.  */
  169. static inline void envctrl_writeb(unsigned char val, volatile unsigned char *p)
  170. {
  171. writeb(val, p);
  172. }
  173. /* Function Description: Test the PIN bit (Pending Interrupt Not) 
  174.  *   to test when serial transmission is completed .
  175.  * Return : None.
  176.  */
  177. static void envtrl_i2c_test_pin(void)
  178. {
  179. int limit = 1000000;
  180. while (--limit > 0) {
  181. if (!(envctrl_readb(&i2c->csr) & STATUS_PIN)) 
  182. break;
  183. udelay(1);
  184. if (limit <= 0)
  185. printk(KERN_INFO "envctrl: Pin status will not clear.n");
  186. }
  187. /* Function Description: Test busy bit.
  188.  * Return : None.
  189.  */
  190. static void envctrl_i2c_test_bb(void)
  191. {
  192. int limit = 1000000;
  193. while (--limit > 0) {
  194. /* Busy bit 0 means busy. */
  195. if (envctrl_readb(&i2c->csr) & STATUS_BB)
  196. break;
  197. udelay(1);
  198. if (limit <= 0)
  199. printk(KERN_INFO "envctrl: Busy bit will not clear.n");
  200. }
  201. /* Function Description: Send the address for a read access.
  202.  * Return : 0 if not acknowledged, otherwise acknowledged.
  203.  */
  204. static int envctrl_i2c_read_addr(unsigned char addr)
  205. {
  206. envctrl_i2c_test_bb();
  207. /* Load address. */
  208. envctrl_writeb(addr + 1, &i2c->data);
  209. envctrl_i2c_test_bb();
  210. envctrl_writeb(OBD_SEND_START, &i2c->csr);
  211. /* Wait for PIN. */
  212. envtrl_i2c_test_pin();
  213. /* CSR 0 means acknowledged. */
  214. if (!(envctrl_readb(&i2c->csr) & STATUS_LRB)) {
  215. return envctrl_readb(&i2c->data);
  216. } else {
  217. envctrl_writeb(OBD_SEND_STOP, &i2c->csr);
  218. return 0;
  219. }
  220. }
  221. /* Function Description: Send the address for write mode.  
  222.  * Return : None.
  223.  */
  224. static void envctrl_i2c_write_addr(unsigned char addr)
  225. {
  226. envctrl_i2c_test_bb();
  227. envctrl_writeb(addr, &i2c->data);
  228. /* Generate Start condition. */
  229. envctrl_writeb(OBD_SEND_START, &i2c->csr);
  230. }
  231. /* Function Description: Read 1 byte of data from addr 
  232.  *  set by envctrl_i2c_read_addr() 
  233.  * Return : Data from address set by envctrl_i2c_read_addr().
  234.  */
  235. static unsigned char envctrl_i2c_read_data(void)
  236. {
  237. envtrl_i2c_test_pin();
  238. envctrl_writeb(CONTROL_ES0, &i2c->csr);  /* Send neg ack. */
  239. return envctrl_readb(&i2c->data);
  240. }
  241. /* Function Description: Instruct the device which port to read data from.  
  242.  * Return : None.
  243.  */
  244. static void envctrl_i2c_write_data(unsigned char port)
  245. {
  246. envtrl_i2c_test_pin();
  247. envctrl_writeb(port, &i2c->data);
  248. }
  249. /* Function Description: Generate Stop condition after last byte is sent.
  250.  * Return : None.
  251.  */
  252. static void envctrl_i2c_stop(void)
  253. {
  254. envtrl_i2c_test_pin();
  255. envctrl_writeb(OBD_SEND_STOP, &i2c->csr);
  256. }
  257. /* Function Description: Read adc device.
  258.  * Return : Data at address and port.
  259.  */
  260. static unsigned char envctrl_i2c_read_8591(unsigned char addr, unsigned char port)
  261. {
  262. /* Send address. */
  263. envctrl_i2c_write_addr(addr);
  264. /* Setup port to read. */
  265. envctrl_i2c_write_data(port);
  266. envctrl_i2c_stop();
  267. /* Read port. */
  268. envctrl_i2c_read_addr(addr);
  269. /* Do a single byte read and send stop. */
  270. envctrl_i2c_read_data();
  271. envctrl_i2c_stop();
  272. return envctrl_readb(&i2c->data);
  273. }
  274. /* Function Description: Read gpio device.
  275.  * Return : Data at address.
  276.  */
  277. static unsigned char envctrl_i2c_read_8574(unsigned char addr)
  278. {
  279. unsigned char rd;
  280. envctrl_i2c_read_addr(addr);
  281. /* Do a single byte read and send stop. */
  282. rd = envctrl_i2c_read_data();
  283. envctrl_i2c_stop();
  284. return rd;
  285. }
  286. /* Function Description: Decode data read from an adc device using firmware
  287.  *                       table.
  288.  * Return: Number of read bytes. Data is stored in bufdata in ascii format.
  289.  */
  290. static int envctrl_i2c_data_translate(unsigned char data, int translate_type,
  291.       int scale, char *tbl, char *bufdata)
  292. {
  293. int len = 0;
  294. switch (translate_type) {
  295. case ENVCTRL_TRANSLATE_NO:
  296. /* No decode necessary. */
  297. len = 1;
  298. bufdata[0] = data;
  299. break;
  300. case ENVCTRL_TRANSLATE_FULL:
  301. /* Decode this way: data = table[data]. */
  302. len = 1;
  303. bufdata[0] = tbl[data];
  304. break;
  305. case ENVCTRL_TRANSLATE_SCALE:
  306. /* Decode this way: data = table[data]/scale */
  307. sprintf(bufdata,"%d ", (tbl[data] * 10) / (scale));
  308. len = strlen(bufdata);
  309. bufdata[len - 1] = bufdata[len - 2];
  310. bufdata[len - 2] = '.';
  311. break;
  312. default:
  313. break;
  314. };
  315. return len;
  316. }
  317. /* Function Description: Read cpu-related data such as cpu temperature, voltage.
  318.  * Return: Number of read bytes. Data is stored in bufdata in ascii format.
  319.  */
  320. static int envctrl_read_cpu_info(int cpu, struct i2c_child_t *pchild,
  321.  char mon_type, unsigned char *bufdata)
  322. {
  323. unsigned char data;
  324. int i;
  325. char *tbl, j = -1;
  326. /* Find the right monitor type and channel. */
  327. for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {
  328. if (pchild->mon_type[i] == mon_type) {
  329. if (++j == cpu) {
  330. break;
  331. }
  332. }
  333. }
  334. if (j != cpu)
  335. return 0;
  336.         /* Read data from address and port. */
  337. data = envctrl_i2c_read_8591((unsigned char)pchild->addr,
  338.      (unsigned char)pchild->chnl_array[i].chnl_no);
  339. /* Find decoding table. */
  340. tbl = pchild->tables + pchild->tblprop_array[i].offset;
  341. return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type,
  342.   pchild->tblprop_array[i].scale,
  343.   tbl, bufdata);
  344. }
  345. /* Function Description: Read noncpu-related data such as motherboard 
  346.  *                       temperature.
  347.  * Return: Number of read bytes. Data is stored in bufdata in ascii format.
  348.  */
  349. static int envctrl_read_noncpu_info(struct i2c_child_t *pchild,
  350.     char mon_type, unsigned char *bufdata)
  351. {
  352. unsigned char data;
  353. int i;
  354. char *tbl = NULL;
  355. for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {
  356. if (pchild->mon_type[i] == mon_type)
  357. break;
  358. }
  359. if (i >= PCF8584_MAX_CHANNELS)
  360. return 0;
  361.         /* Read data from address and port. */
  362. data = envctrl_i2c_read_8591((unsigned char)pchild->addr,
  363.      (unsigned char)pchild->chnl_array[i].chnl_no);
  364. /* Find decoding table. */
  365. tbl = pchild->tables + pchild->tblprop_array[i].offset;
  366. return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type,
  367.   pchild->tblprop_array[i].scale,
  368.   tbl, bufdata);
  369. }
  370. /* Function Description: Read fan status.
  371.  * Return : Always 1 byte. Status stored in bufdata.
  372.  */
  373. static int envctrl_i2c_fan_status(struct i2c_child_t *pchild,
  374.   unsigned char data,
  375.   char *bufdata)
  376. {
  377. unsigned char tmp, ret = 0;
  378. int i, j = 0;
  379. tmp = data & pchild->fan_mask;
  380. if (tmp == pchild->fan_mask) {
  381. /* All bits are on. All fans are functioning. */
  382. ret = ENVCTRL_ALL_FANS_GOOD;
  383. } else if (tmp == 0) {
  384. /* No bits are on. No fans are functioning. */
  385. ret = ENVCTRL_ALL_FANS_BAD;
  386. } else {
  387. /* Go through all channels, mark 'on' the matched bits.
  388.  * Notice that fan_mask may have discontiguous bits but
  389.  * return mask are always contiguous. For example if we
  390.  * monitor 4 fans at channels 0,1,2,4, the return mask
  391.  * should be 00010000 if only fan at channel 4 is working.
  392.  */
  393. for (i = 0; i < PCF8584_MAX_CHANNELS;i++) {
  394. if (pchild->fan_mask & chnls_mask[i]) {
  395. if (!(chnls_mask[i] & tmp))
  396. ret |= chnls_mask[j];
  397. j++;
  398. }
  399. }
  400. }
  401. bufdata[0] = ret;
  402. return 1;
  403. }
  404. /* Function Description: Read global addressing line.
  405.  * Return : Always 1 byte. Status stored in bufdata.
  406.  */
  407. static int envctrl_i2c_globaladdr(struct i2c_child_t *pchild,
  408.   unsigned char data,
  409.   char *bufdata)
  410. {
  411. /* Translatation table is not necessary, as global
  412.  * addr is the integer value of the GA# bits.
  413.  *
  414.  * NOTE: MSB is documented as zero, but I see it as '1' always....
  415.  *
  416.  * -----------------------------------------------
  417.  * | 0 | FAL | DEG | GA4 | GA3 | GA2 | GA1 | GA0 |
  418.  * -----------------------------------------------
  419.  * GA0 - GA4 integer value of Global Address (backplane slot#)
  420.  * DEG 0 = cPCI Power supply output is starting to degrade
  421.  *  1 = cPCI Power supply output is OK
  422.  * FAL 0 = cPCI Power supply has failed
  423.  *  1 = cPCI Power supply output is OK
  424.  */
  425. bufdata[0] = (data & ENVCTRL_GLOBALADDR_ADDR_MASK);
  426. return 1;
  427. }
  428. /* Function Description: Read standard voltage and power supply status.
  429.  * Return : Always 1 byte. Status stored in bufdata.
  430.  */
  431. static unsigned char envctrl_i2c_voltage_status(struct i2c_child_t *pchild,
  432. unsigned char data,
  433. char *bufdata)
  434. {
  435. unsigned char tmp, ret = 0;
  436. int i, j = 0;
  437. tmp = data & pchild->voltage_mask;
  438. /* Two channels are used to monitor voltage and power supply. */
  439. if (tmp == pchild->voltage_mask) {
  440. /* All bits are on. Voltage and power supply are okay. */
  441. ret = ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD;
  442. } else if (tmp == 0) {
  443. /* All bits are off. Voltage and power supply are bad */
  444. ret = ENVCTRL_VOLTAGE_POWERSUPPLY_BAD;
  445. } else {
  446. /* Either voltage or power supply has problem. */
  447. for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {
  448. if (pchild->voltage_mask & chnls_mask[i]) {
  449. j++;
  450. /* Break out when there is a mismatch. */
  451. if (!(chnls_mask[i] & tmp))
  452. break; 
  453. }
  454. }
  455. /* Make a wish that hardware will always use the
  456.  * first channel for voltage and the second for
  457.  * power supply.
  458.  */
  459. if (j == 1)
  460. ret = ENVCTRL_VOLTAGE_BAD;
  461. else
  462. ret = ENVCTRL_POWERSUPPLY_BAD;
  463. }
  464. bufdata[0] = ret;
  465. return 1;
  466. }
  467. /* Function Description: Read a byte from /dev/envctrl. Mapped to user read().
  468.  * Return: Number of read bytes. 0 for error.
  469.  */
  470. static ssize_t
  471. envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos)
  472. {
  473. struct i2c_child_t *pchild;
  474. unsigned char data[10];
  475. int ret = 0;
  476. /* Get the type of read as decided in ioctl() call.
  477.  * Find the appropriate i2c child.
  478.  * Get the data and put back to the user buffer.
  479.  */
  480. switch ((int)(long)file->private_data) {
  481. case ENVCTRL_RD_WARNING_TEMPERATURE:
  482. if (warning_temperature == 0)
  483. return 0;
  484. data[0] = (unsigned char)(warning_temperature);
  485. ret = 1;
  486. copy_to_user((unsigned char *)buf, data, ret);
  487. break;
  488. case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
  489. if (shutdown_temperature == 0)
  490. return 0;
  491. data[0] = (unsigned char)(shutdown_temperature);
  492. ret = 1;
  493. copy_to_user((unsigned char *)buf, data, ret);
  494. break;
  495. case ENVCTRL_RD_MTHRBD_TEMPERATURE:
  496. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON)))
  497. return 0;
  498. ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data);
  499. copy_to_user((unsigned char *)buf, data, ret);
  500. break;
  501. case ENVCTRL_RD_CPU_TEMPERATURE:
  502. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON)))
  503. return 0;
  504. ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUTEMP_MON, data);
  505. /* Reset cpu to the default cpu0. */
  506. copy_to_user((unsigned char *)buf, data, ret);
  507. break;
  508. case ENVCTRL_RD_CPU_VOLTAGE:
  509. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUVOLTAGE_MON)))
  510. return 0;
  511. ret = envctrl_read_cpu_info(read_cpu, pchild, ENVCTRL_CPUVOLTAGE_MON, data);
  512. /* Reset cpu to the default cpu0. */
  513. copy_to_user((unsigned char *)buf, data, ret);
  514. break;
  515. case ENVCTRL_RD_SCSI_TEMPERATURE:
  516. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON)))
  517. return 0;
  518. ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data);
  519. copy_to_user((unsigned char *)buf, data, ret);
  520. break;
  521. case ENVCTRL_RD_ETHERNET_TEMPERATURE:
  522. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON)))
  523. return 0;
  524. ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data);
  525. copy_to_user((unsigned char *)buf, data, ret);
  526. break;
  527. case ENVCTRL_RD_FAN_STATUS:
  528. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_FANSTAT_MON)))
  529. return 0;
  530. data[0] = envctrl_i2c_read_8574(pchild->addr);
  531. ret = envctrl_i2c_fan_status(pchild,data[0], data);
  532. copy_to_user((unsigned char *)buf, data, ret);
  533. break;
  534. case ENVCTRL_RD_GLOBALADDRESS:
  535. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON)))
  536. return 0;
  537. data[0] = envctrl_i2c_read_8574(pchild->addr);
  538. ret = envctrl_i2c_globaladdr(pchild, data[0], data);
  539. copy_to_user((unsigned char *)buf, data, ret);
  540. break;
  541. case ENVCTRL_RD_VOLTAGE_STATUS:
  542. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_VOLTAGESTAT_MON)))
  543. /* If voltage monitor not present, check for CPCI equivalent */
  544. if (!(pchild = envctrl_get_i2c_child(ENVCTRL_GLOBALADDR_MON)))
  545. return 0;
  546. data[0] = envctrl_i2c_read_8574(pchild->addr);
  547. ret = envctrl_i2c_voltage_status(pchild, data[0], data);
  548. copy_to_user((unsigned char *)buf, data, ret);
  549. break;
  550. default:
  551. break;
  552. };
  553. return ret;
  554. }
  555. /* Function Description: Command what to read.  Mapped to user ioctl().
  556.  * Return: Gives 0 for implemented commands, -EINVAL otherwise.
  557.  */
  558. static int
  559. envctrl_ioctl(struct inode *inode, struct file *file,
  560.       unsigned int cmd, unsigned long arg)
  561. {
  562. char *infobuf;
  563. switch (cmd) {
  564. case ENVCTRL_RD_WARNING_TEMPERATURE:
  565. case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
  566. case ENVCTRL_RD_MTHRBD_TEMPERATURE:
  567. case ENVCTRL_RD_FAN_STATUS:
  568. case ENVCTRL_RD_VOLTAGE_STATUS:
  569. case ENVCTRL_RD_ETHERNET_TEMPERATURE:
  570. case ENVCTRL_RD_SCSI_TEMPERATURE:
  571. case ENVCTRL_RD_GLOBALADDRESS:
  572. file->private_data = (void *)(long)cmd;
  573. break;
  574. case ENVCTRL_RD_CPU_TEMPERATURE:
  575. case ENVCTRL_RD_CPU_VOLTAGE:
  576. /* Check to see if application passes in any cpu number,
  577.  * the default is cpu0.
  578.  */
  579. infobuf = (char *) arg;
  580. if (infobuf == NULL) {
  581. read_cpu = 0;
  582. }else {
  583. get_user(read_cpu, infobuf);
  584. }
  585. /* Save the command for use when reading. */
  586. file->private_data = (void *)(long)cmd;
  587. break;
  588. default:
  589. return -EINVAL;
  590. };
  591. return 0;
  592. }
  593. /* Function Description: open device. Mapped to user open().
  594.  * Return: Always 0.
  595.  */
  596. static int
  597. envctrl_open(struct inode *inode, struct file *file)
  598. {
  599. file->private_data = 0;
  600. MOD_INC_USE_COUNT;
  601. return 0;
  602. }
  603. /* Function Description: Open device. Mapped to user close().
  604.  * Return: Always 0.
  605.  */
  606. static int
  607. envctrl_release(struct inode *inode, struct file *file)
  608. {
  609. MOD_DEC_USE_COUNT;
  610. return 0;
  611. }
  612. static struct file_operations envctrl_fops = {
  613. owner: THIS_MODULE,
  614. read: envctrl_read,
  615. ioctl: envctrl_ioctl,
  616. open: envctrl_open,
  617. release: envctrl_release,
  618. };
  619. static struct miscdevice envctrl_dev = {
  620. ENVCTRL_MINOR,
  621. "envctrl",
  622. &envctrl_fops
  623. };
  624. /* Function Description: Set monitor type based on firmware description.
  625.  * Return: None.
  626.  */
  627. static void envctrl_set_mon(struct i2c_child_t *pchild,
  628.     char *chnl_desc,
  629.     int chnl_no)
  630. {
  631. /* Firmware only has temperature type.  It does not distinguish
  632.  * different kinds of temperatures.  We use channel description
  633.  * to disinguish them.
  634.  */
  635. if (!(strcmp(chnl_desc,"temp,cpu")) ||
  636.     !(strcmp(chnl_desc,"temp,cpu0")) ||
  637.     !(strcmp(chnl_desc,"temp,cpu1")) ||
  638.     !(strcmp(chnl_desc,"temp,cpu2")) ||
  639.     !(strcmp(chnl_desc,"temp,cpu3")))
  640. pchild->mon_type[chnl_no] = ENVCTRL_CPUTEMP_MON;
  641. if (!(strcmp(chnl_desc,"vddcore,cpu0")) ||
  642.     !(strcmp(chnl_desc,"vddcore,cpu1")) ||
  643.     !(strcmp(chnl_desc,"vddcore,cpu2")) ||
  644.     !(strcmp(chnl_desc,"vddcore,cpu3")))
  645. pchild->mon_type[chnl_no] = ENVCTRL_CPUVOLTAGE_MON;
  646. if (!(strcmp(chnl_desc,"temp,motherboard")))
  647. pchild->mon_type[chnl_no] = ENVCTRL_MTHRBDTEMP_MON;
  648. if (!(strcmp(chnl_desc,"temp,scsi")))
  649. pchild->mon_type[chnl_no] = ENVCTRL_SCSITEMP_MON;
  650. if (!(strcmp(chnl_desc,"temp,ethernet")))
  651. pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON;
  652. }
  653. /* Function Description: Initialize monitor channel with channel desc,
  654.  *                       decoding tables, monitor type, optional properties.
  655.  * Return: None.
  656.  */
  657. static void envctrl_init_adc(struct i2c_child_t *pchild, int node)
  658. {
  659. char chnls_desc[CHANNEL_DESC_SZ];
  660. int i = 0, len;
  661. char *pos = chnls_desc;
  662. /* Firmware describe channels into a stream separated by a ''. */
  663. len = prom_getproperty(node, "channels-description", chnls_desc,
  664.        CHANNEL_DESC_SZ);
  665. chnls_desc[CHANNEL_DESC_SZ - 1] = '';
  666. while (len > 0) {
  667. int l = strlen(pos) + 1;
  668. envctrl_set_mon(pchild, pos, i++);
  669. len -= l;
  670. pos += l;
  671. }
  672. /* Get optional properties. */
  673.         len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature,
  674.        sizeof(warning_temperature));
  675.         len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature,
  676.        sizeof(shutdown_temperature));
  677. }
  678. /* Function Description: Initialize child device monitoring fan status.
  679.  * Return: None.
  680.  */
  681. static void envctrl_init_fanstat(struct i2c_child_t *pchild)
  682. {
  683. int i;
  684. /* Go through all channels and set up the mask. */
  685. for (i = 0; i < pchild->total_chnls; i++)
  686. pchild->fan_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no];
  687. /* We only need to know if this child has fan status monitored.
  688.  * We dont care which channels since we have the mask already.
  689.  */
  690. pchild->mon_type[0] = ENVCTRL_FANSTAT_MON;
  691. }
  692. /* Function Description: Initialize child device for global addressing line.
  693.  * Return: None.
  694.  */
  695. static void envctrl_init_globaladdr(struct i2c_child_t *pchild)
  696. {
  697. int i;
  698. /* Voltage/PowerSupply monitoring is piggybacked 
  699.  * with Global Address on CompactPCI.  See comments
  700.  * within envctrl_i2c_globaladdr for bit assignments.
  701.  *
  702.  * The mask is created here by assigning mask bits to each
  703.  * bit position that represents PCF8584_VOLTAGE_TYPE data.
  704.  * Channel numbers are not consecutive within the globaladdr
  705.  * node (why?), so we use the actual counter value as chnls_mask
  706.  * index instead of the chnl_array[x].chnl_no value.
  707.  *
  708.  * NOTE: This loop could be replaced with a constant representing
  709.  * a mask of bits 5&6 (ENVCTRL_GLOBALADDR_PSTAT_MASK).
  710.  */
  711. for (i = 0; i < pchild->total_chnls; i++) {
  712. if (PCF8584_VOLTAGE_TYPE == pchild->chnl_array[i].type) {
  713. pchild->voltage_mask |= chnls_mask[i];
  714. }
  715. }
  716. /* We only need to know if this child has global addressing 
  717.  * line monitored.  We dont care which channels since we know 
  718.  * the mask already (ENVCTRL_GLOBALADDR_ADDR_MASK).
  719.  */
  720. pchild->mon_type[0] = ENVCTRL_GLOBALADDR_MON;
  721. }
  722. /* Initialize child device monitoring voltage status. */
  723. static void envctrl_init_voltage_status(struct i2c_child_t *pchild)
  724. {
  725. int i;
  726. /* Go through all channels and set up the mask. */
  727. for (i = 0; i < pchild->total_chnls; i++)
  728. pchild->voltage_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no];
  729. /* We only need to know if this child has voltage status monitored.
  730.  * We dont care which channels since we have the mask already.
  731.  */
  732. pchild->mon_type[0] = ENVCTRL_VOLTAGESTAT_MON;
  733. }
  734. /* Function Description: Initialize i2c child device.
  735.  * Return: None.
  736.  */
  737. static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
  738.    struct i2c_child_t *pchild)
  739. {
  740. int node, len, i, tbls_size = 0;
  741. node = edev_child->prom_node;
  742. /* Get device address. */
  743. len = prom_getproperty(node, "reg",
  744.        (char *) &(pchild->addr),
  745.        sizeof(pchild->addr));
  746. /* Get tables property.  Read firmware temperature tables. */
  747. len = prom_getproperty(node, "translation",
  748.        (char *) pchild->tblprop_array,
  749.        (PCF8584_MAX_CHANNELS *
  750. sizeof(struct pcf8584_tblprop)));
  751. if (len > 0) {
  752.                 pchild->total_tbls = len / sizeof(struct pcf8584_tblprop);
  753. for (i = 0; i < pchild->total_tbls; i++) {
  754. if ((pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset) > tbls_size) {
  755. tbls_size = pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset;
  756. }
  757. }
  758.                 pchild->tables = kmalloc(tbls_size, GFP_KERNEL);
  759.                 len = prom_getproperty(node, "tables",
  760.        (char *) pchild->tables, tbls_size);
  761.                 if (len <= 0) {
  762. printk("envctrl: Failed to get table.n");
  763. return;
  764. }
  765. }
  766. /* SPARCengine ASM Reference Manual (ref. SMI doc 805-7581-04)
  767.  * sections 2.5, 3.5, 4.5 state node 0x70 for CP1400/1500 is
  768.  * "For Factory Use Only."
  769.  *
  770.  * We ignore the node on these platforms by assigning the
  771.  * 'NULL' monitor type.
  772.  */
  773. if (ENVCTRL_CPCI_IGNORED_NODE == pchild->addr) {
  774. int len;
  775. char prop[56];
  776. len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
  777. if (0 < len && (0 == strncmp(prop, "SUNW,UltraSPARC-IIi-cEngine", len)))
  778. {
  779. for (len = 0; len < PCF8584_MAX_CHANNELS; ++len) {
  780. pchild->mon_type[len] = ENVCTRL_NOMON;
  781. }
  782. return;
  783. }
  784. }
  785. /* Get the monitor channels. */
  786. len = prom_getproperty(node, "channels-in-use",
  787.        (char *) pchild->chnl_array,
  788.        (PCF8584_MAX_CHANNELS *
  789. sizeof(struct pcf8584_channel)));
  790. pchild->total_chnls = len / sizeof(struct pcf8584_channel);
  791. for (i = 0; i < pchild->total_chnls; i++) {
  792. switch (pchild->chnl_array[i].type) {
  793. case PCF8584_TEMP_TYPE:
  794. envctrl_init_adc(pchild, node);
  795. break;
  796. case PCF8584_GLOBALADDR_TYPE:
  797. envctrl_init_globaladdr(pchild);
  798. i = pchild->total_chnls;
  799. break;
  800. case PCF8584_FANSTAT_TYPE:
  801. envctrl_init_fanstat(pchild);
  802. i = pchild->total_chnls;
  803. break;
  804. case PCF8584_VOLTAGE_TYPE:
  805. if (pchild->i2ctype == I2C_ADC) {
  806. envctrl_init_adc(pchild,node);
  807. } else {
  808. envctrl_init_voltage_status(pchild);
  809. }
  810. i = pchild->total_chnls;
  811. break;
  812. default:
  813. break;
  814. };
  815. }
  816. }
  817. /* Function Description: Search the child device list for a device.
  818.  * Return : The i2c child if found. NULL otherwise.
  819.  */
  820. static struct i2c_child_t *envctrl_get_i2c_child(unsigned char mon_type)
  821. {
  822. int i, j;
  823. for (i = 0; i < ENVCTRL_MAX_CPU*2; i++) {
  824. for (j = 0; j < PCF8584_MAX_CHANNELS; j++) {
  825. if (i2c_childlist[i].mon_type[j] == mon_type) {
  826. return (struct i2c_child_t *)(&(i2c_childlist[i]));
  827. }
  828. }
  829. }
  830. return NULL;
  831. }
  832. static void envctrl_do_shutdown(void)
  833. {
  834. static int inprog = 0;
  835. static char *envp[] = {
  836. "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
  837. char *argv[] = { 
  838. "/sbin/shutdown", "-h", "now", NULL };
  839. if (inprog != 0)
  840. return;
  841. inprog = 1;
  842. printk(KERN_CRIT "kenvctrld: WARNING: Shutting down the system now.n");
  843. if (0 > execve("/sbin/shutdown", argv, envp)) {
  844. printk(KERN_CRIT "kenvctrld: WARNING: system shutdown failed!n"); 
  845. inprog = 0;  /* unlikely to succeed, but we could try again */
  846. }
  847. }
  848. static struct task_struct *kenvctrld_task;
  849. static int kenvctrld(void *__unused)
  850. {
  851. int poll_interval;
  852. int whichcpu;
  853. char tempbuf[10];
  854. struct i2c_child_t *cputemp;
  855. if (NULL == (cputemp = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON))) {
  856. printk(KERN_ERR 
  857.        "envctrl: kenvctrld unable to monitor CPU temp-- exitingn");
  858. return -ENODEV;
  859. }
  860. poll_interval = 5 * HZ; /* TODO env_mon_interval */
  861. daemonize();
  862. strcpy(current->comm, "kenvctrld");
  863. kenvctrld_task = current;
  864. printk(KERN_INFO "envctrl: %s starting...n", current->comm);
  865. for (;;) {
  866. current->state = TASK_INTERRUPTIBLE;
  867. schedule_timeout(poll_interval);
  868. current->state = TASK_RUNNING;
  869. if(signal_pending(current))
  870. break;
  871. for (whichcpu = 0; whichcpu < ENVCTRL_MAX_CPU; ++whichcpu) {
  872. if (0 < envctrl_read_cpu_info(whichcpu, cputemp,
  873.       ENVCTRL_CPUTEMP_MON,
  874.       tempbuf)) {
  875. if (tempbuf[0] >= shutdown_temperature) {
  876. printk(KERN_CRIT 
  877. "%s: WARNING: CPU%i temperature %i C meets or exceeds "
  878. "shutdown threshold %i Cn", 
  879. current->comm, whichcpu, 
  880. tempbuf[0], shutdown_temperature);
  881. envctrl_do_shutdown();
  882. }
  883. }
  884. }
  885. }
  886. printk(KERN_INFO "envctrl: %s exiting...n", current->comm);
  887. return 0;
  888. }
  889. static int __init envctrl_init(void)
  890. {
  891. #ifdef CONFIG_PCI
  892. struct linux_ebus *ebus = NULL;
  893. struct linux_ebus_device *edev = NULL;
  894. struct linux_ebus_child *edev_child = NULL;
  895. int i = 0;
  896. for_each_ebus(ebus) {
  897. for_each_ebusdev(edev, ebus) {
  898. if (!strcmp(edev->prom_name, "bbc")) {
  899. /* If we find a boot-bus controller node,
  900.  * then this envctrl driver is not for us.
  901.  */
  902. return -ENODEV;
  903. }
  904. }
  905. }
  906. /* Traverse through ebus and ebus device list for i2c device and
  907.  * adc and gpio nodes.
  908.  */
  909. for_each_ebus(ebus) {
  910. for_each_ebusdev(edev, ebus) {
  911. if (!strcmp(edev->prom_name, "i2c")) {
  912. i2c = ioremap( edev->resource[0].start, 
  913. sizeof(struct pcf8584_reg));
  914. for_each_edevchild(edev, edev_child) {
  915. if (!strcmp("gpio", edev_child->prom_name)) {
  916. i2c_childlist[i].i2ctype = I2C_GPIO;
  917. envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
  918. }
  919. if (!strcmp("adc", edev_child->prom_name)) {
  920. i2c_childlist[i].i2ctype = I2C_ADC;
  921. envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
  922. }
  923. }
  924. goto done;
  925. }
  926. }
  927. }
  928. done:
  929. if (!edev) {
  930. printk("envctrl: I2C device not found.n");
  931. return -ENODEV;
  932. }
  933. /* Set device address. */
  934. envctrl_writeb(CONTROL_PIN, &i2c->csr);
  935. envctrl_writeb(PCF8584_ADDRESS, &i2c->data);
  936. /* Set system clock and SCL frequencies. */ 
  937. envctrl_writeb(CONTROL_PIN | CONTROL_ES1, &i2c->csr);
  938. envctrl_writeb(CLK_4_43 | BUS_CLK_90, &i2c->data);
  939. /* Enable serial interface. */
  940. envctrl_writeb(CONTROL_PIN | CONTROL_ES0 | CONTROL_ACK, &i2c->csr);
  941. udelay(200);
  942. /* Register the device as a minor miscellaneous device. */
  943. if (misc_register(&envctrl_dev)) {
  944. printk("envctrl: Unable to get misc minor %dn",
  945.        envctrl_dev.minor);
  946. }
  947. /* Note above traversal routine post-incremented 'i' to accomodate 
  948.  * a next child device, so we decrement before reverse-traversal of
  949.  * child devices.
  950.  */
  951. printk("envctrl: initialized ");
  952. for (--i; i >= 0; --i) {
  953. printk("[%s 0x%lx]%s", 
  954. (I2C_ADC == i2c_childlist[i].i2ctype) ? ("adc") : 
  955. ((I2C_GPIO == i2c_childlist[i].i2ctype) ? ("gpio") : ("unknown")), 
  956. i2c_childlist[i].addr, (0 == i) ? ("n") : (" "));
  957. }
  958. kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES);
  959. return 0;
  960. #else
  961. return -ENODEV;
  962. #endif
  963. }
  964. static void __exit envctrl_cleanup(void)
  965. {
  966. int i;
  967. if (NULL != kenvctrld_task) {
  968. force_sig(SIGKILL, kenvctrld_task);
  969. for (;;) {
  970. struct task_struct *p;
  971. int found = 0;
  972. read_lock(&tasklist_lock);
  973. for_each_task(p) {
  974. if (p == kenvctrld_task) {
  975. found = 1;
  976. break;
  977. }
  978. }
  979. read_unlock(&tasklist_lock);
  980. if (!found)
  981. break;
  982. current->state = TASK_INTERRUPTIBLE;
  983. schedule_timeout(HZ);
  984. current->state = TASK_RUNNING;
  985. }
  986. kenvctrld_task = NULL;
  987. }
  988. iounmap(i2c);
  989. misc_deregister(&envctrl_dev);
  990. for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) {
  991. if (i2c_childlist[i].tables)
  992. kfree(i2c_childlist[i].tables);
  993. }
  994. }
  995. module_init(envctrl_init);
  996. module_exit(envctrl_cleanup);
  997. MODULE_LICENSE("GPL");