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

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: pr_osl.c
  4.  *   $Revision: 21 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 Andrew Grover
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include <linux/kernel.h>
  25. #include <linux/module.h>
  26. #include <linux/init.h>
  27. #include <linux/types.h>
  28. #include <linux/proc_fs.h>
  29. #include <linux/pci.h>
  30. #include <acpi.h>
  31. #include <bm.h>
  32. #include "pr.h"
  33. MODULE_AUTHOR("Andrew Grover");
  34. MODULE_DESCRIPTION("ACPI Component Architecture (CA) - IA32 Processor Driver");
  35. MODULE_LICENSE("GPL");
  36. #define PR_PROC_ROOT "processor"
  37. #define PR_PROC_STATUS "status"
  38. #define PR_PROC_INFO "info"
  39. extern struct proc_dir_entry *bm_proc_root;
  40. static struct proc_dir_entry *pr_proc_root = NULL;
  41. extern unsigned short acpi_piix4_bmisx;
  42. /****************************************************************************
  43.  *
  44.  * FUNCTION: pr_osl_proc_read_status
  45.  *
  46.  ****************************************************************************/
  47. static int
  48. pr_osl_proc_read_status (
  49. char *page,
  50. char **start,
  51. off_t off,
  52. int  count,
  53. int  *eof,
  54. void *context)
  55. {
  56. PR_CONTEXT *processor = NULL;
  57. char *p = page;
  58. int  len = 0;
  59. if (!context || (off != 0)) {
  60. goto end;
  61. }
  62. processor = (PR_CONTEXT*)context;
  63. p += sprintf(p, "Bus Mastering Activity:  %08xn",
  64. processor->power.bm_activity);
  65. p += sprintf(p, "C-State Utilization:     C1[%d] C2[%d] C3[%d]n",
  66. processor->power.state[PR_C1].utilization,
  67. processor->power.state[PR_C2].utilization,
  68. processor->power.state[PR_C3].utilization);
  69. end:
  70. len = (p - page);
  71. if (len <= off+count) *eof = 1;
  72. *start = page + off;
  73. len -= off;
  74. if (len>count) len = count;
  75. if (len<0) len = 0;
  76. return(len);
  77. }
  78. /****************************************************************************
  79.  *
  80.  * FUNCTION: pr_osl_proc_read_info
  81.  *
  82.  ****************************************************************************/
  83. static int
  84. pr_osl_proc_read_info (
  85. char *page,
  86. char **start,
  87. off_t off,
  88. int  count,
  89. int  *eof,
  90. void *context)
  91. {
  92. PR_CONTEXT *processor = NULL;
  93. char *p = page;
  94. int  len = 0;
  95. if (!context || (off != 0)) {
  96. goto end;
  97. }
  98. processor = (PR_CONTEXT*)context;
  99. p += sprintf(p, "<TBD>n");
  100. end:
  101. len = (p - page);
  102. if (len <= off+count) *eof = 1;
  103. *start = page + off;
  104. len -= off;
  105. if (len>count) len = count;
  106. if (len<0) len = 0;
  107. return(len);
  108. }
  109. /****************************************************************************
  110.  *
  111.  * FUNCTION: pr_osl_add_device
  112.  *
  113.  ****************************************************************************/
  114. acpi_status
  115. pr_osl_add_device(
  116. PR_CONTEXT *processor)
  117. {
  118. u32 i = 0;
  119. struct proc_dir_entry *proc_entry = NULL, *proc;
  120. char processor_uid[16];
  121. if (!processor) {
  122. return(AE_BAD_PARAMETER);
  123. }
  124. printk("Processor[%x]:", processor->uid);
  125. for (i=0; i<processor->power.state_count; i++) {
  126. if (processor->power.state[i].is_valid) {
  127. printk(" C%d", i);
  128. }
  129. }
  130. if (processor->performance.state_count > 1)
  131. printk(", %d throttling states", processor->performance.state_count);
  132. if (acpi_piix4_bmisx && processor->power.state[3].is_valid)
  133. printk(" (PIIX errata enabled)");
  134. printk("n");
  135. sprintf(processor_uid, "%d", processor->uid);
  136. proc_entry = proc_mkdir(processor_uid, pr_proc_root);
  137. if (!proc_entry)
  138. return(AE_ERROR);
  139. proc = create_proc_read_entry(PR_PROC_STATUS, S_IFREG | S_IRUGO, 
  140.       proc_entry, pr_osl_proc_read_status, (void*)processor);
  141. if (!proc_entry)
  142. return(AE_ERROR);
  143. proc = create_proc_read_entry(PR_PROC_INFO, S_IFREG | S_IRUGO, 
  144.       proc_entry, pr_osl_proc_read_info, (void*)processor);
  145. if (!proc_entry)
  146. return(AE_ERROR);
  147. return(AE_OK);
  148. }
  149. /****************************************************************************
  150.  *
  151.  * FUNCTION: pr_osl_remove_device
  152.  *
  153.  ****************************************************************************/
  154. acpi_status
  155. pr_osl_remove_device (
  156. PR_CONTEXT *processor)
  157. {
  158. char proc_entry[64];
  159. if (!processor) {
  160. return(AE_BAD_PARAMETER);
  161. }
  162. sprintf(proc_entry, "%d/%s", processor->uid, PR_PROC_INFO);
  163. remove_proc_entry(proc_entry, pr_proc_root);
  164. sprintf(proc_entry, "%d/%s", processor->uid, PR_PROC_STATUS);
  165. remove_proc_entry(proc_entry, pr_proc_root);
  166. sprintf(proc_entry, "%d", processor->uid);
  167. remove_proc_entry(proc_entry, pr_proc_root);
  168. return(AE_OK);
  169. }
  170. /****************************************************************************
  171.  *
  172.  * FUNCTION: pr_osl_generate_event
  173.  *
  174.  ****************************************************************************/
  175. acpi_status
  176. pr_osl_generate_event (
  177. u32 event,
  178. PR_CONTEXT *processor)
  179. {
  180. acpi_status status = AE_OK;
  181. char processor_uid[16];
  182. if (!processor) {
  183. return(AE_BAD_PARAMETER);
  184. }
  185. switch (event) {
  186. case PR_NOTIFY_PERF_STATES:
  187. case PR_NOTIFY_POWER_STATES:
  188. sprintf(processor_uid, "%d", processor->uid);
  189. status = bm_osl_generate_event(processor->device_handle,
  190. PR_PROC_ROOT, processor_uid, event, 0);
  191. break;
  192. default:
  193. return(AE_BAD_PARAMETER);
  194. break;
  195. }
  196. return(status);
  197. }
  198. /****************************************************************************
  199.  *                              Errata Handling
  200.  ****************************************************************************/
  201. void acpi_pr_errata (void)
  202. {
  203. struct pci_dev *dev = NULL;
  204. while ((dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, 
  205. PCI_ANY_ID, PCI_ANY_ID, dev))) {
  206. switch (dev->device) {
  207. case PCI_DEVICE_ID_INTEL_82801BA_8: /* PIIX4U4 */
  208. case PCI_DEVICE_ID_INTEL_82801BA_9: /* PIIX4U3 */
  209. case PCI_DEVICE_ID_INTEL_82451NX: /* PIIX4NX */
  210. case PCI_DEVICE_ID_INTEL_82372FB_1: /* PIIX4U2 */
  211. case PCI_DEVICE_ID_INTEL_82801AA_1: /* PIIX4U */
  212. case PCI_DEVICE_ID_INTEL_82443MX_1: /* PIIX4E2 */
  213. case PCI_DEVICE_ID_INTEL_82801AB_1: /* PIIX4E */
  214. case PCI_DEVICE_ID_INTEL_82371AB: /* PIIX4 */
  215. acpi_piix4_bmisx = pci_resource_start(dev, 4);
  216. return;
  217. }
  218. }
  219. return;
  220. }
  221. /****************************************************************************
  222.  *
  223.  * FUNCTION: pr_osl_init
  224.  *
  225.  * PARAMETERS: <none>
  226.  *
  227.  * RETURN: 0: Success
  228.  *
  229.  * DESCRIPTION: Module initialization.
  230.  *
  231.  ****************************************************************************/
  232. static int __init
  233. pr_osl_init (void)
  234. {
  235. acpi_status status = AE_OK;
  236. /* abort if no busmgr */
  237. if (!bm_proc_root)
  238. return -ENODEV;
  239. acpi_pr_errata();
  240. pr_proc_root = proc_mkdir(PR_PROC_ROOT, bm_proc_root);
  241. if (!pr_proc_root) {
  242. status = AE_ERROR;
  243. }
  244. else {
  245. status = pr_initialize();
  246. if (ACPI_FAILURE(status)) {
  247. remove_proc_entry(PR_PROC_ROOT, bm_proc_root);
  248. }
  249. }
  250. return (ACPI_SUCCESS(status)) ? 0 : -ENODEV;
  251. }
  252. /****************************************************************************
  253.  *
  254.  * FUNCTION:    pr_osl_cleanup
  255.  *
  256.  * PARAMETERS: <none>
  257.  *
  258.  * RETURN: <none>
  259.  *
  260.  * DESCRIPTION: Module cleanup.
  261.  *
  262.  ****************************************************************************/
  263. static void __exit
  264. pr_osl_cleanup (void)
  265. {
  266. pr_terminate();
  267. if (pr_proc_root) {
  268. remove_proc_entry(PR_PROC_ROOT, bm_proc_root);
  269. }
  270. return;
  271. }
  272. module_init(pr_osl_init);
  273. module_exit(pr_osl_cleanup);