3 #include <linux/kernel.h>
4 #include <linux/string.h>
5 #include <linux/pci_regs.h>
6 #include <linux/module.h>
7 #include <linux/ioport.h>
8 #include <linux/etherdevice.h>
9 #include <linux/of_address.h>
11 #include <asm/pci-bridge.h>
14 int of_irq_map_pci(struct pci_dev
*pdev
, struct of_irq
*out_irq
)
16 struct device_node
*dn
, *ppnode
;
17 struct pci_dev
*ppdev
;
23 /* Check if we have a device node, if yes, fallback to standard OF
26 dn
= pci_device_to_OF_node(pdev
);
28 return of_irq_map_one(dn
, 0, out_irq
);
30 /* Ok, we don't, time to have fun. Let's start by building up an
31 * interrupt spec. we assume #interrupt-cells is 1, which is standard
32 * for PCI. If you do different, then don't use that routine.
34 rc
= pci_read_config_byte(pdev
, PCI_INTERRUPT_PIN
, &pin
);
41 /* Now we walk up the PCI tree */
44 /* Get the pci_dev of our parent */
45 ppdev
= pdev
->bus
->self
;
47 /* Ouch, it's a host bridge... */
49 struct pci_controller
*host
;
50 host
= pci_bus_to_host(pdev
->bus
);
51 ppnode
= host
? host
->dn
: NULL
;
52 /* No node for host bridge ? give up */
56 /* We found a P2P bridge, check if it has a node */
57 ppnode
= pci_device_to_OF_node(ppdev
);
59 /* Ok, we have found a parent with a device-node, hand over to
60 * the OF parsing code.
61 * We build a unit address from the linux device to be used for
62 * resolution. Note that we use the linux bus number which may
63 * not match your firmware bus numbering.
64 * Fortunately, in most cases, interrupt-map-mask doesn't
65 * include the bus number as part of the matching.
66 * You should still be careful about that though if you intend
67 * to rely on this function (you ship a firmware that doesn't
68 * create device nodes for all PCI devices).
73 /* We can only get here if we hit a P2P bridge with no node,
74 * let's do standard swizzling and try again
76 lspec
= pci_swizzle_interrupt_pin(pdev
, lspec
);
80 laddr
[0] = (pdev
->bus
->number
<< 16)
82 laddr
[1] = laddr
[2] = 0;
83 return of_irq_map_raw(ppnode
, &lspec
, 1, laddr
, out_irq
);
85 EXPORT_SYMBOL_GPL(of_irq_map_pci
);
86 #endif /* CONFIG_PCI */
88 void of_parse_dma_window(struct device_node
*dn
, const void *dma_window_prop
,
89 unsigned long *busno
, unsigned long *phys
, unsigned long *size
)
91 const u32
*dma_window
;
93 const unsigned char *prop
;
95 dma_window
= dma_window_prop
;
97 /* busno is always one cell */
98 *busno
= *(dma_window
++);
100 prop
= of_get_property(dn
, "ibm,#dma-address-cells", NULL
);
102 prop
= of_get_property(dn
, "#address-cells", NULL
);
104 cells
= prop
? *(u32
*)prop
: of_n_addr_cells(dn
);
105 *phys
= of_read_number(dma_window
, cells
);
109 prop
= of_get_property(dn
, "ibm,#dma-size-cells", NULL
);
110 cells
= prop
? *(u32
*)prop
: of_n_size_cells(dn
);
111 *size
= of_read_number(dma_window
, cells
);
This page took 0.032794 seconds and 5 git commands to generate.