drivers.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:15k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * drivers.c
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version
  7.  * 2 of the License, or (at your option) any later version.
  8.  *
  9.  * Copyright (c) 1999 The Puffin Group
  10.  * Copyright (c) 2001 Matthew Wilcox for Hewlett Packard
  11.  * Copyright (c) 2001 Helge Deller <deller@gmx.de>
  12.  * 
  13.  * The file handles registering devices and drivers, then matching them.
  14.  * It's the closest we get to a dating agency.
  15.  */
  16. #include <linux/slab.h>
  17. #include <linux/types.h>
  18. #include <linux/kernel.h>
  19. #include <linux/pci.h>
  20. #include <linux/spinlock.h>
  21. #include <linux/string.h>
  22. #include <asm/hardware.h>
  23. #include <asm/io.h>
  24. #include <asm/pdc.h>
  25. #include <asm/gsc.h>
  26. /* See comments in include/asm-parisc/pci.h */
  27. struct pci_dma_ops *hppa_dma_ops;
  28. static struct parisc_driver *pa_drivers;
  29. static struct parisc_device root;
  30. /* This lock protects the pa_drivers list _only_ since all parisc_devices
  31.  * are registered before smp_init() is called.  If you wish to add devices
  32.  * after that, this muct be serialised somehow.  I recommend a semaphore
  33.  * rather than a spinlock since driver ->probe functions are allowed to
  34.  * sleep (for example when allocating memory).
  35.  */
  36. static spinlock_t pa_lock = SPIN_LOCK_UNLOCKED;
  37. #define for_each_padev(dev) 
  38. for (dev = root.child; dev != NULL; dev = next_dev(dev))
  39. #define check_dev(dev) 
  40. (dev->id.hw_type != HPHW_FAULTY) ? dev : next_dev(dev)
  41. /**
  42.  * next_dev - enumerates registered devices
  43.  * @dev: the previous device returned from next_dev
  44.  *
  45.  * next_dev does a depth-first search of the tree, returning parents
  46.  * before children.  Returns NULL when there are no more devices.
  47.  */
  48. struct parisc_device *next_dev(struct parisc_device *dev)
  49. {
  50. if (dev->child) {
  51. return check_dev(dev->child);
  52. } else if (dev->sibling) {
  53. return dev->sibling;
  54. }
  55. /* Exhausted tree at this level, time to go up. */
  56. do {
  57. dev = dev->parent;
  58. if (dev && dev->sibling)
  59. return dev->sibling;
  60. } while (dev != &root);
  61. return NULL;
  62. }
  63. /**
  64.  * match_device - Report whether this driver can handle this device
  65.  * @driver: the PA-RISC driver to try
  66.  * @dev: the PA-RISC device to try
  67.  */
  68. static int match_device(struct parisc_driver *driver, struct parisc_device *dev)
  69. {
  70. const struct parisc_device_id *ids;
  71. for (ids = driver->id_table; ids->sversion; ids++) {
  72. if ((ids->sversion != SVERSION_ANY_ID) &&
  73.     (ids->sversion != dev->id.sversion))
  74. continue;
  75. if ((ids->hw_type != HWTYPE_ANY_ID) &&
  76.     (ids->hw_type != dev->id.hw_type))
  77. continue;
  78. if ((ids->hversion != HVERSION_ANY_ID) &&
  79.     (ids->hversion != dev->id.hversion))
  80. continue;
  81. return 1;
  82. }
  83. return 0;
  84. }
  85. static void claim_device(struct parisc_driver *driver, struct parisc_device *dev)
  86. {
  87. dev->driver = driver;
  88. request_mem_region(dev->hpa, 0x1000, driver->name);
  89. }
  90. /**
  91.  * register_parisc_driver - Register this driver if it can handle a device
  92.  * @driver: the PA-RISC driver to try
  93.  */
  94. int register_parisc_driver(struct parisc_driver *driver)
  95. {
  96. struct parisc_device *device;
  97. if (driver->next) {
  98. printk(KERN_WARNING 
  99.        "BUG: Skipping previously registered driver: %sn",
  100.        driver->name);
  101. return 1;
  102. }
  103. for_each_padev(device) {
  104. if (device->driver)
  105. continue;
  106. if (!match_device(driver, device))
  107. continue;
  108. if (driver->probe(device) < 0)
  109. continue;
  110. claim_device(driver, device);
  111. }
  112. /* Note that the list is in reverse order of registration.  This
  113.  * may be significant if we ever actually support hotplug and have
  114.  * multiple drivers capable of claiming the same chip.
  115.  */
  116. spin_lock(&pa_lock);
  117. driver->next = pa_drivers;
  118. pa_drivers = driver;
  119. spin_unlock(&pa_lock);
  120. return 0;
  121. }
  122. /**
  123.  * count_parisc_driver - count # of devices this driver would match
  124.  * @driver: the PA-RISC driver to try
  125.  *
  126.  * Use by IOMMU support to "guess" the right size IOPdir.
  127.  * Formula is something like memsize/(num_iommu * entry_size).
  128.  */
  129. int count_parisc_driver(struct parisc_driver *driver)
  130. {
  131. struct parisc_device *device;
  132. int cnt = 0;
  133. for_each_padev(device) {
  134. if (match_device(driver, device))
  135. cnt++;
  136. }
  137. return cnt;
  138. }
  139. /**
  140.  * unregister_parisc_driver - Unregister this driver from the list of drivers
  141.  * @driver: the PA-RISC driver to unregister
  142.  */
  143. int unregister_parisc_driver(struct parisc_driver *driver)
  144. {
  145. struct parisc_device *dev;
  146. spin_lock(&pa_lock);
  147. if (pa_drivers == driver) {
  148. /* was head of list - update head */
  149. pa_drivers = driver->next;
  150. } else {
  151. struct parisc_driver *prev = pa_drivers;
  152. while (prev && driver != prev->next) {
  153. prev = prev->next;
  154. }
  155. if (!prev) {
  156. printk(KERN_WARNING "unregister_parisc_driver: %s wasn't registeredn", driver->name);
  157. } else {
  158. /* Drop driver from list */
  159. prev->next = driver->next;
  160. driver->next = NULL;
  161. }
  162. }
  163. spin_unlock(&pa_lock);
  164. for_each_padev(dev) {
  165. if (dev->driver != driver)
  166. continue;
  167. dev->driver = NULL;
  168. release_mem_region(dev->hpa, 0x1000);
  169. }
  170. return 0;
  171. }
  172. static struct parisc_device *find_device_by_addr(unsigned long hpa)
  173. {
  174. struct parisc_device *dev;
  175. for_each_padev(dev) {
  176. if (dev->hpa == hpa)
  177. return dev;
  178. }
  179. return NULL;
  180. }
  181. /**
  182.  * find_pa_parent_type - Find a parent of a specific type
  183.  * @dev: The device to start searching from
  184.  * @type: The device type to search for.
  185.  *
  186.  * Walks up the device tree looking for a device of the specified type.
  187.  * If it finds it, it returns it.  If not, it returns NULL.
  188.  */
  189. const struct parisc_device *find_pa_parent_type(const struct parisc_device *dev, int type)
  190. {
  191. while (dev != &root) {
  192. if (dev->id.hw_type == type)
  193. return dev;
  194. dev = dev->parent;
  195. }
  196. return NULL;
  197. }
  198. static void
  199. get_node_path(struct parisc_device *dev, struct hardware_path *path)
  200. {
  201. int i = 5;
  202. memset(&path->bc, -1, 6);
  203. while (dev != &root) {
  204. path->bc[i--] = dev->hw_path;
  205. dev = dev->parent;
  206. }
  207. }
  208. static char *print_hwpath(struct hardware_path *path, char *output)
  209. {
  210. int i;
  211. for (i = 0; i < 6; i++) {
  212. if (path->bc[i] == -1)
  213. continue;
  214. output += sprintf(output, "%u/", (unsigned char) path->bc[i]);
  215. }
  216. output += sprintf(output, "%u", (unsigned char) path->mod);
  217. return output;
  218. }
  219. /**
  220.  * print_pa_hwpath - Returns hardware path for PA devices
  221.  * dev: The device to return the path for
  222.  * output: Pointer to a previously-allocated array to place the path in.
  223.  *
  224.  * This function fills in the output array with a human-readable path
  225.  * to a PA device.  This string is compatible with that used by PDC, and
  226.  * may be printed on the outside of the box.
  227.  */
  228. char *print_pa_hwpath(struct parisc_device *dev, char *output)
  229. {
  230. struct hardware_path path;
  231. get_node_path(dev->parent, &path);
  232. path.mod = dev->hw_path;
  233. return print_hwpath(&path, output);
  234. }
  235. #if defined(CONFIG_PCI) || defined(CONFIG_ISA)
  236. /**
  237.  * get_pci_node_path - Returns hardware path for PCI devices
  238.  * dev: The device to return the path for
  239.  * output: Pointer to a previously-allocated array to place the path in.
  240.  *
  241.  * This function fills in the hardware_path structure with the route to
  242.  * the specified PCI device.  This structure is suitable for passing to
  243.  * PDC calls.
  244.  */
  245. void get_pci_node_path(struct pci_dev *dev, struct hardware_path *path)
  246. {
  247. struct pci_bus *bus;
  248. const struct parisc_device *padev;
  249. int i = 5;
  250. memset(&path->bc, -1, 6);
  251. path->mod = PCI_FUNC(dev->devfn);
  252. path->bc[i--] = PCI_SLOT(dev->devfn);
  253. for (bus = dev->bus; bus->parent; bus = bus->parent) {
  254. unsigned int devfn = bus->self->devfn;
  255. path->bc[i--] = PCI_SLOT(devfn) | (PCI_FUNC(devfn) << 5);
  256. }
  257. padev = HBA_DATA(bus->sysdata)->dev;
  258. while (padev != &root) {
  259. path->bc[i--] = padev->hw_path;
  260. padev = padev->parent;
  261. }
  262. }
  263. /**
  264.  * print_pci_hwpath - Returns hardware path for PCI devices
  265.  * dev: The device to return the path for
  266.  * output: Pointer to a previously-allocated array to place the path in.
  267.  *
  268.  * This function fills in the output array with a human-readable path
  269.  * to a PCI device.  This string is compatible with that used by PDC, and
  270.  * may be printed on the outside of the box.
  271.  */
  272. char *print_pci_hwpath(struct pci_dev *dev, char *output)
  273. {
  274. struct hardware_path path;
  275. get_pci_node_path(dev, &path);
  276. return print_hwpath(&path, output);
  277. }
  278. #endif /* defined(CONFIG_PCI) || defined(CONFIG_ISA) */
  279. struct parisc_device * create_tree_node(char id, struct parisc_device *parent,
  280. struct parisc_device **insert)
  281. {
  282. struct parisc_device *dev = kmalloc(sizeof(*dev), GFP_KERNEL);
  283. if (!dev)
  284. return NULL;
  285. memset(dev, 0, sizeof(*dev));
  286. dev->hw_path = id;
  287. dev->id.hw_type = HPHW_FAULTY;
  288. dev->parent = parent;
  289. dev->sibling = *insert;
  290. *insert = dev;
  291. return dev;
  292. }
  293. /**
  294.  * alloc_tree_node - returns a device entry in the iotree
  295.  * @parent: the parent node in the tree
  296.  * @id: the element of the module path for this entry
  297.  *
  298.  * Checks all the children of @parent for a matching @id.  If none
  299.  * found, it allocates a new device and returns it.
  300.  */
  301. struct parisc_device *
  302. alloc_tree_node(struct parisc_device *parent, char id)
  303. {
  304. struct parisc_device *prev;
  305. if ((!parent->child) || (parent->child->hw_path > id)) {
  306. return create_tree_node(id, parent, &parent->child);
  307. }
  308. prev = parent->child;
  309. if (prev->hw_path == id)
  310. return prev;
  311. while (prev->sibling && prev->sibling->hw_path < id) {
  312. prev = prev->sibling;
  313. }
  314. if ((prev->sibling) && (prev->sibling->hw_path == id))
  315. return prev->sibling;
  316. return create_tree_node(id, parent, &prev->sibling);
  317. }
  318. static struct parisc_device *find_parisc_device(struct hardware_path *modpath)
  319. {
  320. int i;
  321. struct parisc_device *parent = &root;
  322. for (i = 0; i < 6; i++) {
  323. if (modpath->bc[i] == -1)
  324. continue;
  325. parent = alloc_tree_node(parent, modpath->bc[i]);
  326. }
  327. return alloc_tree_node(parent, modpath->mod);
  328. }
  329. struct parisc_device *
  330. alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
  331. {
  332. int status;
  333. unsigned long bytecnt;
  334. u8 iodc_data[32];
  335. struct parisc_device *dev;
  336. const char *name;
  337. /* Check to make sure this device has not already been added - Ryan */
  338. if (find_device_by_addr(hpa) != NULL)
  339. return NULL;
  340. status = pdc_iodc_read(&bytecnt, hpa, 0, &iodc_data, 32);
  341. if (status != PDC_OK)
  342. return NULL;
  343. dev = find_parisc_device(mod_path);
  344. if (dev->id.hw_type != HPHW_FAULTY) {
  345. char p[64];
  346. print_pa_hwpath(dev, p);
  347. printk("Two devices have hardware path %s.  Please file a bug with HP.n"
  348. "In the meantime, you could try rearranging your cards.n", p);
  349. return NULL;
  350. }
  351. dev->id.hw_type = iodc_data[3] & 0x1f;
  352. dev->id.hversion = (iodc_data[0] << 4) | ((iodc_data[1] & 0xf0) >> 4);
  353. dev->id.hversion_rev = iodc_data[1] & 0x0f;
  354. dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |
  355. (iodc_data[5] << 8) | iodc_data[6];
  356. dev->hpa = hpa;
  357. name = parisc_hardware_description(&dev->id);
  358. if (name) {
  359. strncpy(dev->name, name, sizeof(dev->name)-1);
  360. }
  361. return dev;
  362. }
  363. /**
  364.  * register_parisc_device - Locate a driver to manage this device.
  365.  * @dev: The parisc device.
  366.  *
  367.  * Search the driver list for a driver that is willing to manage
  368.  * this device.
  369.  */
  370. int register_parisc_device(struct parisc_device *dev)
  371. {
  372. struct parisc_driver *driver;
  373. if (!dev)
  374. return 0;
  375. if (dev->driver)
  376. return 1;
  377. spin_lock(&pa_lock);
  378. /* Locate a driver which agrees to manage this device.  */
  379. for (driver = pa_drivers; driver; driver = driver->next) {
  380. if (!match_device(driver,dev))
  381. continue;
  382. if (driver->probe(dev) == 0)
  383. break;
  384. }
  385. if (driver != NULL) {
  386. claim_device(driver, dev);
  387. }
  388. spin_unlock(&pa_lock);
  389. return driver != NULL;
  390. }
  391. #define BC_PORT_MASK 0x8
  392. #define BC_LOWER_PORT 0x8
  393. #define BUS_CONVERTER(dev) 
  394.         ((dev->id.hw_type == HPHW_IOA) || (dev->id.hw_type == HPHW_BCPORT))
  395. #define IS_LOWER_PORT(dev) 
  396.         ((gsc_readl(&((struct bc_module *)dev->hpa)->io_status) 
  397.                 & BC_PORT_MASK) == BC_LOWER_PORT)
  398. #define READ_IO_IO_LOW(dev) 
  399. (dev->id.hw_type == HPHW_IOA ? 
  400.         __raw_readl((unsigned long)&((struct bc_module *)dev->hpa)->io_io_low) << 16 : 
  401.         __raw_readl((unsigned long)&((struct bc_module *)dev->hpa)->io_io_low))
  402. static void walk_native_bus(unsigned long addr, struct parisc_device *parent);
  403. void walk_lower_bus(struct parisc_device *dev)
  404. {
  405. if(!BUS_CONVERTER(dev) || IS_LOWER_PORT(dev))
  406. return;
  407. walk_native_bus((unsigned long)(signed int)READ_IO_IO_LOW(dev), dev);
  408. }
  409. #define MAX_NATIVE_DEVICES 64
  410. #define NATIVE_DEVICE_OFFSET 0x1000
  411. /**
  412.  * walk_native_bus -- Probe a bus for devices
  413.  * @addr: Base address of this bus.
  414.  * 
  415.  * A native bus (eg Runway or GSC) may have up to 64 devices on it,
  416.  * spaced at intervals of 0x1000 bytes.  PDC may not inform us of these
  417.  * devices, so we have to probe for them.  Unfortunately, we may find
  418.  * devices which are not physically connected (such as extra serial &
  419.  * keyboard ports).  This problem is not yet solved.
  420.  */
  421. static void walk_native_bus(unsigned long addr, struct parisc_device *parent)
  422. {
  423. int i;
  424. struct hardware_path path;
  425. get_node_path(parent, &path);
  426. for (i = 0; i < MAX_NATIVE_DEVICES; i++) {
  427. unsigned long hpa = (addr + i * NATIVE_DEVICE_OFFSET);
  428. struct parisc_device *dev;
  429. /* Was the device already added by Firmware? */
  430. dev = find_device_by_addr(hpa);
  431. if (!dev) {
  432. path.mod = i;
  433. dev = alloc_pa_dev(hpa, &path);
  434. if (!dev)
  435. continue;
  436. register_parisc_device(dev);
  437. }
  438. walk_lower_bus(dev);
  439. }
  440. }
  441. #define CENTRAL_BUS_ADDR (unsigned long) 0xfffffffffff80000
  442. /**
  443.  * walk_central_bus - Find devices attached to the central bus
  444.  *
  445.  * PDC doesn't tell us about all devices in the system.  This routine
  446.  * finds devices connected to the central bus.
  447.  */
  448. void walk_central_bus(void)
  449. {
  450. walk_native_bus(CENTRAL_BUS_ADDR, &root);
  451. }
  452. void fixup_child_irqs(struct parisc_device *parent, int base,
  453. int (*choose_irq)(struct parisc_device *))
  454. {
  455. struct parisc_device *dev;
  456. if (!parent->child)
  457. return;
  458. for (dev = check_dev(parent->child); dev; dev = dev->sibling) {
  459. int irq = choose_irq(dev);
  460. if (irq > 0) {
  461. #ifdef __LP64__
  462. irq += 32;
  463. #endif
  464. dev->irq = base + irq;
  465. }
  466. }
  467. }
  468. static void print_parisc_device(struct parisc_device *dev)
  469. {
  470. char hw_path[64];
  471. static int count;
  472. print_pa_hwpath(dev, hw_path);
  473. printk(KERN_INFO "%d. %s (%d) at 0x%lx [%s], versions 0x%x, 0x%x, 0x%x",
  474. ++count, dev->name, dev->id.hw_type, dev->hpa, hw_path,
  475. dev->id.hversion, dev->id.hversion_rev, dev->id.sversion);
  476. if (dev->num_addrs) {
  477. int k;
  478. printk(",  additional addresses: ");
  479. for (k = 0; k < dev->num_addrs; k++)
  480. printk("0x%lx ", dev->addr[k]);
  481. }
  482. printk("n");
  483. }
  484. void print_subdevices(struct parisc_device *parent)
  485. {
  486. struct parisc_device *dev;
  487. for (dev = parent->child; dev != parent->sibling; dev = next_dev(dev)) {
  488. print_parisc_device(dev);
  489. }
  490. }
  491. /**
  492.  * print_parisc_devices - Print out a list of devices found in this system
  493.  */
  494. void print_parisc_devices(void)
  495. {
  496. struct parisc_device *dev;
  497. for_each_padev(dev) {
  498. print_parisc_device(dev);
  499. }
  500. }