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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Compaq Hot Plug Controller Driver
  3.  *
  4.  * Copyright (c) 1995,2001 Compaq Computer Corporation
  5.  * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com)
  6.  * Copyright (c) 2001 IBM Corp.
  7.  *
  8.  * All rights reserved.
  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 (at
  13.  * your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful, but
  16.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  18.  * NON INFRINGEMENT.  See the GNU General Public License for more
  19.  * details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24.  *
  25.  * Send feedback to <greg@kroah.com>
  26.  *
  27.  */
  28. #include <linux/config.h>
  29. #include <linux/module.h>
  30. #include <linux/kernel.h>
  31. #include <linux/types.h>
  32. #include <linux/proc_fs.h>
  33. #include <linux/pci.h>
  34. #include "cpqphp.h"
  35. static struct proc_dir_entry *ctrl_proc_root;
  36. /* A few routines that create proc entries for the hot plug controller */
  37. static int read_ctrl (char *buf, char **start, off_t offset, int len, int *eof, void *data)
  38. {
  39. struct controller *ctrl = (struct controller *)data;
  40. char * out = buf;
  41. int index;
  42. struct pci_resource *res;
  43. if (offset > 0) return 0; /* no partial requests */
  44. len  = 0;
  45. *eof = 1;
  46. out += sprintf(out, "hot plug ctrl Info Pagen");
  47. out += sprintf(out, "bus = %d, device = %d, function = %dn",ctrl->bus,
  48.        ctrl->device, ctrl->function);
  49. out += sprintf(out, "Free resources: memoryn");
  50. index = 11;
  51. res = ctrl->mem_head;
  52. while (res && index--) {
  53. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  54. res = res->next;
  55. }
  56. out += sprintf(out, "Free resources: prefetchable memoryn");
  57. index = 11;
  58. res = ctrl->p_mem_head;
  59. while (res && index--) {
  60. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  61. res = res->next;
  62. }
  63. out += sprintf(out, "Free resources: IOn");
  64. index = 11;
  65. res = ctrl->io_head;
  66. while (res && index--) {
  67. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  68. res = res->next;
  69. }
  70. out += sprintf(out, "Free resources: bus numbersn");
  71. index = 11;
  72. res = ctrl->bus_head;
  73. while (res && index--) {
  74. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  75. res = res->next;
  76. }
  77. *start = buf;
  78. len = out-buf;
  79. return len;
  80. }
  81. static int read_dev (char *buf, char **start, off_t offset, int len, int *eof, void *data)
  82. {
  83. struct controller *ctrl = (struct controller *)data;
  84. char * out = buf;
  85. int index;
  86. struct pci_resource *res;
  87. struct pci_func *new_slot;
  88. struct slot *slot;
  89. if (offset > 0) return 0; /* no partial requests */
  90. len  = 0;
  91. *eof = 1;
  92. out += sprintf(out, "hot plug ctrl Info Pagen");
  93. out += sprintf(out, "bus = %d, device = %d, function = %dn",ctrl->bus,
  94.        ctrl->device, ctrl->function);
  95. slot=ctrl->slot;
  96. while (slot) {
  97. new_slot = cpqhp_slot_find(slot->bus, slot->device, 0);
  98. out += sprintf(out, "assigned resources: memoryn");
  99. index = 11;
  100. res = new_slot->mem_head;
  101. while (res && index--) {
  102. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  103. res = res->next;
  104. }
  105. out += sprintf(out, "assigned resources: prefetchable memoryn");
  106. index = 11;
  107. res = new_slot->p_mem_head;
  108. while (res && index--) {
  109. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  110. res = res->next;
  111. }
  112. out += sprintf(out, "assigned resources: IOn");
  113. index = 11;
  114. res = new_slot->io_head;
  115. while (res && index--) {
  116. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  117. res = res->next;
  118. }
  119. out += sprintf(out, "assigned resources: bus numbersn");
  120. index = 11;
  121. res = new_slot->bus_head;
  122. while (res && index--) {
  123. out += sprintf(out, "start = %8.8x, length = %8.8xn", res->base, res->length);
  124. res = res->next;
  125. }
  126. slot=slot->next;
  127. }
  128. *start = buf;
  129. len = out-buf;
  130. return len;
  131. }
  132. int cpqhp_proc_create_ctrl (struct controller *ctrl)
  133. {
  134. strcpy(ctrl->proc_name, "hpca");
  135. ctrl->proc_name[3] = 'a' + ctrl->bus;
  136. ctrl->proc_entry = create_proc_entry(ctrl->proc_name, S_IFREG | S_IRUGO, ctrl_proc_root);
  137. ctrl->proc_entry->data = ctrl;
  138. ctrl->proc_entry->read_proc = &read_ctrl;
  139. strcpy(ctrl->proc_name2, "slot_a");
  140. ctrl->proc_name2[5] = 'a' + ctrl->bus;
  141. ctrl->proc_entry2 = create_proc_entry(ctrl->proc_name2, S_IFREG | S_IRUGO, ctrl_proc_root);
  142. ctrl->proc_entry2->data = ctrl;
  143. ctrl->proc_entry2->read_proc = &read_dev;
  144. return 0;
  145. }
  146. int cpqhp_proc_remove_ctrl (struct controller *ctrl)
  147. {
  148. if (ctrl->proc_entry)
  149. remove_proc_entry(ctrl->proc_name, ctrl_proc_root);
  150. if (ctrl->proc_entry2)
  151. remove_proc_entry(ctrl->proc_name2, ctrl_proc_root);
  152. return 0;
  153. }
  154. int cpqhp_proc_init_ctrl (void)
  155. {
  156. ctrl_proc_root = proc_mkdir("driver/hpc", NULL);
  157. if (!ctrl_proc_root)
  158. return -ENOMEM;
  159. ctrl_proc_root->owner = THIS_MODULE;
  160. return 0;
  161. }
  162. int cpqhp_proc_destroy_ctrl (void)
  163. {
  164. remove_proc_entry("hpc", proc_root_driver);
  165. return 0;
  166. }