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

嵌入式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
  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. #ifndef _CPQPHP_H
  29. #define _CPQPHP_H
  30. #include "pci_hotplug.h"
  31. #include <asm/io.h> /* for read? and write? functions */
  32. #if !defined(CONFIG_HOTPLUG_PCI_COMPAQ_MODULE)
  33. #define MY_NAME "cpqphp.o"
  34. #else
  35. #define MY_NAME THIS_MODULE->name
  36. #endif
  37. #define dbg(fmt, arg...) do { if (cpqhp_debug) printk(KERN_DEBUG "%s: " fmt , MY_NAME , ## arg); } while (0)
  38. #define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg)
  39. #define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg)
  40. #define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg)
  41. struct smbios_system_slot {
  42. u8 type;
  43. u8 length;
  44. u16 handle;
  45. u8 name_string_num;
  46. u8 slot_type;
  47. u8 slot_width;
  48. u8 slot_current_usage;
  49. u8 slot_length;
  50. u16 slot_number;
  51. u8 properties1;
  52. u8 properties2;
  53. } __attribute__ ((packed));
  54. /* offsets to the smbios generic type based on the above structure layout */
  55. enum smbios_system_slot_offsets {
  56. SMBIOS_SLOT_GENERIC_TYPE = offsetof(struct smbios_system_slot, type),
  57. SMBIOS_SLOT_GENERIC_LENGTH = offsetof(struct smbios_system_slot, length),
  58. SMBIOS_SLOT_GENERIC_HANDLE = offsetof(struct smbios_system_slot, handle),
  59. SMBIOS_SLOT_NAME_STRING_NUM = offsetof(struct smbios_system_slot, name_string_num),
  60. SMBIOS_SLOT_TYPE = offsetof(struct smbios_system_slot, slot_type),
  61. SMBIOS_SLOT_WIDTH = offsetof(struct smbios_system_slot, slot_width),
  62. SMBIOS_SLOT_CURRENT_USAGE = offsetof(struct smbios_system_slot, slot_current_usage),
  63. SMBIOS_SLOT_LENGTH = offsetof(struct smbios_system_slot, slot_length),
  64. SMBIOS_SLOT_NUMBER = offsetof(struct smbios_system_slot, slot_number),
  65. SMBIOS_SLOT_PROPERTIES1 = offsetof(struct smbios_system_slot, properties1),
  66. SMBIOS_SLOT_PROPERTIES2 = offsetof(struct smbios_system_slot, properties2),
  67. };
  68. struct smbios_generic {
  69. u8 type;
  70. u8 length;
  71. u16 handle;
  72. } __attribute__ ((packed));
  73. /* offsets to the smbios generic type based on the above structure layout */
  74. enum smbios_generic_offsets {
  75. SMBIOS_GENERIC_TYPE = offsetof(struct smbios_generic, type),
  76. SMBIOS_GENERIC_LENGTH = offsetof(struct smbios_generic, length),
  77. SMBIOS_GENERIC_HANDLE = offsetof(struct smbios_generic, handle),
  78. };
  79. struct smbios_entry_point {
  80. char anchor[4];
  81. u8 ep_checksum;
  82. u8 ep_length;
  83. u8 major_version;
  84. u8 minor_version;
  85. u16 max_size_entry;
  86. u8 ep_rev;
  87. u8 reserved[5];
  88. char int_anchor[5];
  89. u8 int_checksum;
  90. u16 st_length;
  91. u32 st_address;
  92. u16 number_of_entrys;
  93. u8 bcd_rev;
  94. } __attribute__ ((packed));
  95. /* offsets to the smbios entry point based on the above structure layout */
  96. enum smbios_entry_point_offsets {
  97. ANCHOR = offsetof(struct smbios_entry_point, anchor[0]),
  98. EP_CHECKSUM = offsetof(struct smbios_entry_point, ep_checksum),
  99. EP_LENGTH = offsetof(struct smbios_entry_point, ep_length),
  100. MAJOR_VERSION = offsetof(struct smbios_entry_point, major_version),
  101. MINOR_VERSION = offsetof(struct smbios_entry_point, minor_version),
  102. MAX_SIZE_ENTRY = offsetof(struct smbios_entry_point, max_size_entry),
  103. EP_REV = offsetof(struct smbios_entry_point, ep_rev),
  104. INT_ANCHOR = offsetof(struct smbios_entry_point, int_anchor[0]),
  105. INT_CHECKSUM = offsetof(struct smbios_entry_point, int_checksum),
  106. ST_LENGTH = offsetof(struct smbios_entry_point, st_length),
  107. ST_ADDRESS = offsetof(struct smbios_entry_point, st_address),
  108. NUMBER_OF_ENTRYS = offsetof(struct smbios_entry_point, number_of_entrys),
  109. BCD_REV = offsetof(struct smbios_entry_point, bcd_rev),
  110. };
  111. struct ctrl_reg { /* offset */
  112. u8 slot_RST; /* 0x00 */
  113. u8 slot_enable; /* 0x01 */
  114. u16 misc; /* 0x02 */
  115. u32 led_control; /* 0x04 */
  116. u32 int_input_clear; /* 0x08 */
  117. u32 int_mask; /* 0x0a */
  118. u8 reserved0; /* 0x10 */
  119. u8 reserved1; /* 0x11 */
  120. u8 reserved2; /* 0x12 */
  121. u8 gen_output_AB; /* 0x13 */
  122. u32 non_int_input; /* 0x14 */
  123. u32 reserved3; /* 0x18 */
  124. u32 reserved4; /* 0x1a */
  125. u32 reserved5; /* 0x20 */
  126. u8 reserved6; /* 0x24 */
  127. u8 reserved7; /* 0x25 */
  128. u16 reserved8; /* 0x26 */
  129. u8 slot_mask; /* 0x28 */
  130. u8 reserved9; /* 0x29 */
  131. u8 reserved10; /* 0x2a */
  132. u8 reserved11; /* 0x2b */
  133. u8 slot_SERR; /* 0x2c */
  134. u8 slot_power; /* 0x2d */
  135. } __attribute__ ((packed));
  136. /* offsets to the controller registers based on the above structure layout */
  137. enum ctrl_offsets {
  138. SLOT_RST =  offsetof(struct ctrl_reg, slot_RST),
  139. SLOT_ENABLE = offsetof(struct ctrl_reg, slot_enable),
  140. MISC = offsetof(struct ctrl_reg, misc),
  141. LED_CONTROL = offsetof(struct ctrl_reg, led_control),
  142. INT_INPUT_CLEAR = offsetof(struct ctrl_reg, int_input_clear),
  143. INT_MASK =  offsetof(struct ctrl_reg, int_mask),
  144. CTRL_RESERVED0 =  offsetof(struct ctrl_reg, reserved0),
  145. CTRL_RESERVED1 = offsetof(struct ctrl_reg, reserved1),
  146. CTRL_RESERVED2 = offsetof(struct ctrl_reg, reserved1),
  147. GEN_OUTPUT_AB =  offsetof(struct ctrl_reg, gen_output_AB),
  148. NON_INT_INPUT =  offsetof(struct ctrl_reg, non_int_input),
  149. CTRL_RESERVED3 = offsetof(struct ctrl_reg, reserved3),
  150. CTRL_RESERVED4 = offsetof(struct ctrl_reg, reserved4),
  151. CTRL_RESERVED5 = offsetof(struct ctrl_reg, reserved5),
  152. CTRL_RESERVED6 = offsetof(struct ctrl_reg, reserved6),
  153. CTRL_RESERVED7 = offsetof(struct ctrl_reg, reserved7),
  154. CTRL_RESERVED8 = offsetof(struct ctrl_reg, reserved8),
  155. SLOT_MASK =  offsetof(struct ctrl_reg, slot_mask),
  156. CTRL_RESERVED9 =  offsetof(struct ctrl_reg, reserved9),
  157. CTRL_RESERVED10 = offsetof(struct ctrl_reg, reserved10),
  158. CTRL_RESERVED11 = offsetof(struct ctrl_reg, reserved11),
  159. SLOT_SERR = offsetof(struct ctrl_reg, slot_SERR),
  160. SLOT_POWER = offsetof(struct ctrl_reg, slot_power),
  161. };
  162. struct hrt {
  163. char sig0;
  164. char sig1;
  165. char sig2;
  166. char sig3;
  167. u16 unused_IRQ;
  168. u16 PCIIRQ;
  169. u8 number_of_entries;
  170. u8 revision;
  171. u16 reserved1;
  172. u32 reserved2;
  173. } __attribute__ ((packed));
  174. /* offsets to the hotplug resource table registers based on the above structure layout */
  175. enum hrt_offsets {
  176. SIG0 = offsetof(struct hrt, sig0),
  177. SIG1 = offsetof(struct hrt, sig1),
  178. SIG2 = offsetof(struct hrt, sig2),
  179. SIG3 = offsetof(struct hrt, sig3),
  180. UNUSED_IRQ = offsetof(struct hrt, unused_IRQ),
  181. PCIIRQ = offsetof(struct hrt, PCIIRQ),
  182. NUMBER_OF_ENTRIES = offsetof(struct hrt, number_of_entries),
  183. REVISION = offsetof(struct hrt, revision),
  184. HRT_RESERVED1 = offsetof(struct hrt, reserved1),
  185. HRT_RESERVED2 = offsetof(struct hrt, reserved2),
  186. };
  187. struct slot_rt {
  188. u8 dev_func;
  189. u8 primary_bus;
  190. u8 secondary_bus;
  191. u8 max_bus;
  192. u16 io_base;
  193. u16 io_length;
  194. u16 mem_base;
  195. u16 mem_length;
  196. u16 pre_mem_base;
  197. u16 pre_mem_length;
  198. } __attribute__ ((packed));
  199. /* offsets to the hotplug slot resource table registers based on the above structure layout */
  200. enum slot_rt_offsets {
  201. DEV_FUNC = offsetof(struct slot_rt, dev_func),
  202. PRIMARY_BUS =  offsetof(struct slot_rt, primary_bus),
  203. SECONDARY_BUS =  offsetof(struct slot_rt, secondary_bus),
  204. MAX_BUS =  offsetof(struct slot_rt, max_bus),
  205. IO_BASE =  offsetof(struct slot_rt, io_base),
  206. IO_LENGTH =  offsetof(struct slot_rt, io_length),
  207. MEM_BASE =  offsetof(struct slot_rt, mem_base),
  208. MEM_LENGTH =  offsetof(struct slot_rt, mem_length),
  209. PRE_MEM_BASE =  offsetof(struct slot_rt, pre_mem_base),
  210. PRE_MEM_LENGTH =  offsetof(struct slot_rt, pre_mem_length),
  211. };
  212. struct pci_func {
  213. struct pci_func *next;
  214. u8 bus;
  215. u8 device;
  216. u8 function;
  217. u8 is_a_board;
  218. u16 status;
  219. u8 configured;
  220. u8 switch_save;
  221. u8 presence_save;
  222. u32 base_length[0x06];
  223. u8 base_type[0x06];
  224. u16 reserved2;
  225. u32 config_space[0x20];
  226. struct pci_resource *mem_head;
  227. struct pci_resource *p_mem_head;
  228. struct pci_resource *io_head;
  229. struct pci_resource *bus_head;
  230. struct timer_list *p_task_event;
  231. struct pci_dev* pci_dev;
  232. };
  233. #define SLOT_MAGIC 0x67267321
  234. struct slot {
  235. u32 magic;
  236. struct slot *next;
  237. u8 bus;
  238. u8 device;
  239. u8 number;
  240. u8 is_a_board;
  241. u8 configured;
  242. u8 state;
  243. u8 switch_save;
  244. u8 presence_save;
  245. u32 capabilities;
  246. u16 reserved2;
  247. struct timer_list task_event;
  248. u8 hp_slot;
  249. struct controller *ctrl;
  250. void *p_sm_slot;
  251. struct hotplug_slot *hotplug_slot;
  252. };
  253. struct pci_resource {
  254. struct pci_resource * next;
  255. u32 base;
  256. u32 length;
  257. };
  258. struct event_info {
  259. u32 event_type;
  260. u8 hp_slot;
  261. };
  262. struct controller {
  263. struct controller *next;
  264. u32 ctrl_int_comp;
  265. struct semaphore crit_sect; /* critical section semaphore */
  266. void *hpc_reg; /* cookie for our pci controller location */
  267. struct pci_resource *mem_head;
  268. struct pci_resource *p_mem_head;
  269. struct pci_resource *io_head;
  270. struct pci_resource *bus_head;
  271. struct pci_dev *pci_dev;
  272. struct pci_ops *pci_ops;
  273. struct proc_dir_entry* proc_entry;
  274. struct proc_dir_entry* proc_entry2;
  275. struct event_info event_queue[10];
  276. struct slot *slot;
  277. u8 next_event;
  278. u8 interrupt;
  279. u8 bus;
  280. u8 device;
  281. u8 function;
  282. u8 rev;
  283. u8 slot_device_offset;
  284. u8 first_slot;
  285. u8 add_support;
  286. u8 push_flag;
  287. u8 speed; /* 0 = 33MHz, 1 = 66MHz */
  288. u8 speed_capability; /* 0 = 33MHz, 1 = 66MHz */
  289. u8 push_button; /* 0 = no pushbutton, 1 = pushbutton present */
  290. u8 slot_switch_type; /* 0 = no switch, 1 = switch present */
  291. u8 defeature_PHP; /* 0 = PHP not supported, 1 = PHP supported */
  292. u8 alternate_base_address; /* 0 = not supported, 1 = supported */
  293. u8 pci_config_space; /* Index/data access to working registers 0 = not supported, 1 = supported */
  294. u8 pcix_speed_capability; /* PCI-X */
  295. u8 pcix_support; /* PCI-X */
  296. u16 vendor_id;
  297. char proc_name[20];
  298. char proc_name2[20];
  299. struct tq_struct int_task_event;
  300. wait_queue_head_t queue; /* sleep & wake process */
  301. };
  302. #define CTRL_SPEED_33MHz 0
  303. #define CTRL_SPEED_66MHz 1
  304. struct irq_mapping {
  305. u8 barber_pole;
  306. u8 valid_INT;
  307. u8 interrupt[4];
  308. };
  309. struct resource_lists {
  310. struct pci_resource *mem_head;
  311. struct pci_resource *p_mem_head;
  312. struct pci_resource *io_head;
  313. struct pci_resource *bus_head;
  314. struct irq_mapping *irqs;
  315. };
  316. #define ROM_PHY_ADDR 0x0F0000
  317. #define ROM_PHY_LEN 0x00ffff
  318. #define PCI_HPC_ID 0xA0F7
  319. #define PCI_SUB_HPC_ID 0xA2F7
  320. #define PCI_SUB_HPC_ID2 0xA2F8
  321. #define PCI_SUB_HPC_ID3 0xA2F9
  322. #define PCI_SUB_HPC_ID_INTC 0xA2FA
  323. #define INT_BUTTON_IGNORE 0
  324. #define INT_PRESENCE_ON 1
  325. #define INT_PRESENCE_OFF 2
  326. #define INT_SWITCH_CLOSE 3
  327. #define INT_SWITCH_OPEN 4
  328. #define INT_POWER_FAULT 5
  329. #define INT_POWER_FAULT_CLEAR 6
  330. #define INT_BUTTON_PRESS 7
  331. #define INT_BUTTON_RELEASE 8
  332. #define INT_BUTTON_CANCEL 9
  333. #define STATIC_STATE 0
  334. #define BLINKINGON_STATE 1
  335. #define BLINKINGOFF_STATE 2
  336. #define POWERON_STATE 3
  337. #define POWEROFF_STATE 4
  338. #define PCISLOT_INTERLOCK_CLOSED 0x00000001
  339. #define PCISLOT_ADAPTER_PRESENT 0x00000002
  340. #define PCISLOT_POWERED 0x00000004
  341. #define PCISLOT_66_MHZ_OPERATION 0x00000008
  342. #define PCISLOT_64_BIT_OPERATION 0x00000010
  343. #define PCISLOT_REPLACE_SUPPORTED 0x00000020
  344. #define PCISLOT_ADD_SUPPORTED 0x00000040
  345. #define PCISLOT_INTERLOCK_SUPPORTED 0x00000080
  346. #define PCISLOT_66_MHZ_SUPPORTED 0x00000100
  347. #define PCISLOT_64_BIT_SUPPORTED 0x00000200
  348. #define PCI_TO_PCI_BRIDGE_CLASS 0x00060400
  349. #define INTERLOCK_OPEN 0x00000002
  350. #define ADD_NOT_SUPPORTED 0x00000003
  351. #define CARD_FUNCTIONING 0x00000005
  352. #define ADAPTER_NOT_SAME 0x00000006
  353. #define NO_ADAPTER_PRESENT 0x00000009
  354. #define NOT_ENOUGH_RESOURCES 0x0000000B
  355. #define DEVICE_TYPE_NOT_SUPPORTED 0x0000000C
  356. #define POWER_FAILURE 0x0000000E
  357. #define REMOVE_NOT_SUPPORTED 0x00000003
  358. /*
  359.  * error Messages
  360.  */
  361. #define msg_initialization_err "Initialization failure, error=%dn"
  362. #define msg_HPC_rev_error "Unsupported revision of the PCI hot plug controller found.n"
  363. #define msg_HPC_non_compaq_or_intel "The PCI hot plug controller is not supported by this driver.n"
  364. #define msg_HPC_not_supported "this system is not supported by this version of cpqphpd. Upgrade to a newer version of cpqphpdn"
  365. #define msg_unable_to_save "unable to store PCI hot plug add resource information. This system must be rebooted before adding any PCI devices.n"
  366. #define msg_button_on "PCI slot #%d - powering on due to button press.n"
  367. #define msg_button_off "PCI slot #%d - powering off due to button press.n"
  368. #define msg_button_cancel "PCI slot #%d - action canceled due to button press.n"
  369. #define msg_button_ignore "PCI slot #%d - button press ignored.  (action in progress...)n"
  370. /* Proc functions for the hotplug controller info */
  371. #ifdef CONFIG_PROC_FS
  372. extern int cpqhp_proc_init_ctrl (void);
  373. extern int cpqhp_proc_destroy_ctrl (void);
  374. extern int cpqhp_proc_create_ctrl (struct controller *ctrl);
  375. extern int cpqhp_proc_remove_ctrl (struct controller *ctrl);
  376. #else
  377. static inline int cpqhp_proc_init_ctrl (void)
  378. {
  379. return 0;
  380. }
  381. static inline int cpqhp_proc_destroy_ctrl (void)
  382. {
  383. return 0;
  384. }
  385. static inline int cpqhp_proc_create_ctrl (struct controller *ctrl)
  386. {
  387. return 0;
  388. }
  389. static inline int cpqhp_proc_remove_ctrl (struct controller *ctrl)
  390. {
  391. return 0;
  392. }
  393. #endif
  394. /* controller functions */
  395. extern void cpqhp_pushbutton_thread (unsigned long event_pointer);
  396. extern void cpqhp_ctrl_intr (int IRQ, struct controller *ctrl_input, struct pt_regs *regs);
  397. extern int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start);
  398. extern int cpqhp_event_start_thread (void);
  399. extern void cpqhp_event_stop_thread (void);
  400. extern struct pci_func *cpqhp_slot_create (unsigned char busnumber);
  401. extern struct pci_func *cpqhp_slot_find (unsigned char bus, unsigned char device, unsigned char index);
  402. extern int cpqhp_process_SI (struct controller *ctrl, struct pci_func *func);
  403. extern int cpqhp_process_SS (struct controller *ctrl, struct pci_func *func);
  404. extern int cpqhp_hardware_test (struct controller *ctrl, int test_num);
  405. /* resource functions */
  406. extern int cpqhp_resource_sort_and_combine (struct pci_resource **head);
  407. /* pci functions */
  408. extern int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num);
  409. extern int cpqhp_get_bus_dev (struct controller *ctrl, u8 *bus_num, u8 *dev_num, u8 slot);
  410. extern int cpqhp_save_config (struct controller *ctrl, int busnumber, int is_hot_plug);
  411. extern int cpqhp_save_base_addr_length (struct controller *ctrl, struct pci_func * func);
  412. extern int cpqhp_save_used_resources (struct controller *ctrl, struct pci_func * func);
  413. extern int cpqhp_configure_board (struct controller *ctrl, struct pci_func * func);
  414. extern int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot);
  415. extern int cpqhp_valid_replace (struct controller *ctrl, struct pci_func * func);
  416. extern void cpqhp_destroy_board_resources (struct pci_func * func);
  417. extern int cpqhp_return_board_resources (struct pci_func * func, struct resource_lists * resources);
  418. extern void cpqhp_destroy_resource_list (struct resource_lists * resources);
  419. extern int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func);
  420. extern int cpqhp_unconfigure_device (struct pci_func* func);
  421. /* Global variables */
  422. extern int cpqhp_debug;
  423. extern struct controller *cpqhp_ctrl_list;
  424. extern struct pci_func *cpqhp_slot_list[256];
  425. /* these can be gotten rid of, but for debugging they are purty */
  426. extern u8 cpqhp_nic_irq;
  427. extern u8 cpqhp_disk_irq;
  428. /* inline functions */
  429. /* Inline functions to check the sanity of a pointer that is passed to us */
  430. static inline int slot_paranoia_check (struct slot *slot, const char *function)
  431. {
  432. if (!slot) {
  433. dbg("%s - slot == NULL", function);
  434. return -1;
  435. }
  436. if (slot->magic != SLOT_MAGIC) {
  437. dbg("%s - bad magic number for slot", function);
  438. return -1;
  439. }
  440. if (!slot->hotplug_slot) {
  441. dbg("%s - slot->hotplug_slot == NULL!", function);
  442. return -1;
  443. }
  444. return 0;
  445. }
  446. static inline struct slot *get_slot (struct hotplug_slot *hotplug_slot, const char *function)
  447. struct slot *slot;
  448. if (!hotplug_slot) {
  449. dbg("%s - hotplug_slot == NULLn", function);
  450. return NULL;
  451. }
  452. slot = (struct slot *)hotplug_slot->private;
  453. if (slot_paranoia_check (slot, function))
  454.                 return NULL;
  455. return slot;
  456. }               
  457. /*
  458.  * return_resource
  459.  *
  460.  * Puts node back in the resource list pointed to by head
  461.  *
  462.  */
  463. static inline void return_resource (struct pci_resource **head, struct pci_resource *node)
  464. {
  465. if (!node || !head)
  466. return;
  467. node->next = *head;
  468. *head = node;
  469. }
  470. static inline void set_SOGO (struct controller *ctrl)
  471. {
  472. u16 misc;
  473. misc = readw(ctrl->hpc_reg + MISC);
  474. misc = (misc | 0x0001) & 0xFFFB;
  475. writew(misc, ctrl->hpc_reg + MISC);
  476. }
  477. static inline void amber_LED_on (struct controller *ctrl, u8 slot)
  478. {
  479. u32 led_control;
  480. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  481. led_control |= (0x01010000L << slot);
  482. writel(led_control, ctrl->hpc_reg + LED_CONTROL);
  483. }
  484. static inline void amber_LED_off (struct controller *ctrl, u8 slot)
  485. {
  486. u32 led_control;
  487. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  488. led_control &= ~(0x01010000L << slot);
  489. writel(led_control, ctrl->hpc_reg + LED_CONTROL);
  490. }
  491. static inline int read_amber_LED (struct controller *ctrl, u8 slot)
  492. {
  493. u32 led_control;
  494. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  495. led_control &= (0x01010000L << slot);
  496. return led_control ? 1 : 0;
  497. }
  498. static inline void green_LED_on (struct controller *ctrl, u8 slot)
  499. {
  500. u32 led_control;
  501. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  502. led_control |= 0x0101L << slot;
  503. writel(led_control, ctrl->hpc_reg + LED_CONTROL);
  504. }
  505. static inline void green_LED_off (struct controller *ctrl, u8 slot)
  506. {
  507. u32 led_control;
  508. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  509. led_control &= ~(0x0101L << slot);
  510. writel(led_control, ctrl->hpc_reg + LED_CONTROL);
  511. }
  512. static inline void green_LED_blink (struct controller *ctrl, u8 slot)
  513. {
  514. u32 led_control;
  515. led_control = readl(ctrl->hpc_reg + LED_CONTROL);
  516. led_control |= (0x0001L << slot);
  517. writel(led_control, ctrl->hpc_reg + LED_CONTROL);
  518. }
  519. static inline void slot_disable (struct controller *ctrl, u8 slot)
  520. {
  521. u8 slot_enable;
  522. slot_enable = readb(ctrl->hpc_reg + SLOT_ENABLE);
  523. slot_enable &= ~(0x01 << slot);
  524. writeb(slot_enable, ctrl->hpc_reg + SLOT_ENABLE);
  525. }
  526. static inline void slot_enable (struct controller *ctrl, u8 slot)
  527. {
  528. u8 slot_enable;
  529. slot_enable = readb(ctrl->hpc_reg + SLOT_ENABLE);
  530. slot_enable |= (0x01 << slot);
  531. writeb(slot_enable, ctrl->hpc_reg + SLOT_ENABLE);
  532. }
  533. static inline u8 is_slot_enabled (struct controller *ctrl, u8 slot)
  534. {
  535. u8 slot_enable;
  536. slot_enable = readb(ctrl->hpc_reg + SLOT_ENABLE);
  537. slot_enable &= (0x01 << slot);
  538. return slot_enable ? 1 : 0;
  539. }
  540. static inline u8 read_slot_enable (struct controller *ctrl)
  541. {
  542. return readb(ctrl->hpc_reg + SLOT_ENABLE);
  543. }
  544. static inline u8 get_controller_speed (struct controller *ctrl)
  545. {
  546. u16 misc;
  547. misc = readw(ctrl->hpc_reg + MISC);
  548. return (misc & 0x0800) ? 1 : 0;
  549. }
  550. static inline void enable_slot_power (struct controller *ctrl, u8 slot)
  551. {
  552. u8 slot_power;
  553. slot_power = readb(ctrl->hpc_reg + SLOT_POWER);
  554. slot_power |= (0x01 << slot);
  555. writeb(slot_power, ctrl->hpc_reg + SLOT_POWER);
  556. }
  557. static inline void disable_slot_power (struct controller *ctrl, u8 slot)
  558. {
  559. u8 slot_power;
  560. slot_power = readb(ctrl->hpc_reg + SLOT_POWER);
  561. slot_power &= ~(0x01 << slot);
  562. writeb(slot_power, ctrl->hpc_reg + SLOT_POWER);
  563. }
  564. static inline int cpq_get_attention_status (struct controller *ctrl, struct slot *slot)
  565. {
  566. u8 hp_slot;
  567. if (slot == NULL)
  568. return 1;
  569. hp_slot = slot->device - ctrl->slot_device_offset;
  570. return read_amber_LED (ctrl, hp_slot);
  571. }
  572. static inline int get_slot_enabled (struct controller *ctrl, struct slot *slot)
  573. {
  574. u8 hp_slot;
  575. if (slot == NULL)
  576. return 1;
  577. hp_slot = slot->device - ctrl->slot_device_offset;
  578. return is_slot_enabled (ctrl, hp_slot);
  579. }
  580. static inline int cpq_get_latch_status (struct controller *ctrl, struct slot *slot)
  581. {
  582. u32 status;
  583. u8 hp_slot;
  584. if (slot == NULL)
  585. return 1;
  586. hp_slot = slot->device - ctrl->slot_device_offset;
  587. dbg(__FUNCTION__": slot->device = %d, ctrl->slot_device_offset = %d n", slot->device, ctrl->slot_device_offset);
  588. status = (readl(ctrl->hpc_reg + INT_INPUT_CLEAR) & (0x01L << hp_slot));
  589. return(status == 0) ? 1 : 0;
  590. }
  591. static inline int get_presence_status (struct controller *ctrl, struct slot *slot)
  592. {
  593. int presence_save = 0;
  594. u8 hp_slot;
  595. u32 tempdword;
  596. if (slot == NULL)
  597. return 0;
  598. hp_slot = slot->device - ctrl->slot_device_offset;
  599. tempdword = readl(ctrl->hpc_reg + INT_INPUT_CLEAR);
  600. presence_save = (int) ((((~tempdword) >> 23) | ((~tempdword) >> 15)) >> hp_slot) & 0x02;
  601. return presence_save;
  602. }
  603. #define SLOT_NAME_SIZE 10
  604. static inline void make_slot_name (char *buffer, int buffer_size, struct slot *slot)
  605. {
  606. snprintf (buffer, buffer_size, "%d", slot->number);
  607. }
  608. static inline int wait_for_ctrl_irq (struct controller *ctrl)
  609. {
  610.         DECLARE_WAITQUEUE(wait, current);
  611. int retval = 0;
  612. dbg(__FUNCTION__" - startn");
  613. add_wait_queue(&ctrl->queue, &wait);
  614. set_current_state(TASK_INTERRUPTIBLE);
  615. /* Sleep for up to 1 second to wait for the LED to change. */
  616. schedule_timeout(1*HZ);
  617. set_current_state(TASK_RUNNING);
  618. remove_wait_queue(&ctrl->queue, &wait);
  619. if (signal_pending(current))
  620. retval =  -EINTR;
  621. dbg(__FUNCTION__" - endn");
  622. return retval;
  623. }
  624. #endif