Commit | Line | Data |
---|---|---|
9d24c888 | 1 | #include <linux/of.h> /* linux/of.h gets to determine #include ordering */ |
9b6b563c PM |
2 | #ifndef _POWERPC_PROM_H |
3 | #define _POWERPC_PROM_H | |
4 | #ifdef __KERNEL__ | |
5 | ||
6 | /* | |
7 | * Definitions for talking to the Open Firmware PROM on | |
8 | * Power Macintosh computers. | |
9 | * | |
10 | * Copyright (C) 1996-2005 Paul Mackerras. | |
11 | * | |
12 | * Updates for PPC64 by Peter Bergner & David Engebretsen, IBM Corp. | |
13 | * | |
14 | * This program is free software; you can redistribute it and/or | |
15 | * modify it under the terms of the GNU General Public License | |
16 | * as published by the Free Software Foundation; either version | |
17 | * 2 of the License, or (at your option) any later version. | |
18 | */ | |
19 | #include <linux/types.h> | |
d8678b58 | 20 | #include <linux/of_fdt.h> |
6b884a8d | 21 | #include <linux/of_address.h> |
e3873444 | 22 | #include <linux/of_irq.h> |
9b6b563c | 23 | #include <linux/proc_fs.h> |
a9b14973 | 24 | #include <linux/platform_device.h> |
99ddef9b | 25 | #include <asm/irq.h> |
9b6b563c PM |
26 | #include <asm/atomic.h> |
27 | ||
9b6b563c PM |
28 | #define HAVE_ARCH_DEVTREE_FIXUPS |
29 | ||
40ef8cbc | 30 | #ifdef CONFIG_PPC32 |
9b6b563c PM |
31 | /* |
32 | * PCI <-> OF matching functions | |
33 | * (XXX should these be here?) | |
34 | */ | |
35 | struct pci_bus; | |
36 | struct pci_dev; | |
37 | extern int pci_device_from_OF_node(struct device_node *node, | |
38 | u8* bus, u8* devfn); | |
39 | extern struct device_node* pci_busdev_to_OF_node(struct pci_bus *, int); | |
40 | extern struct device_node* pci_device_to_OF_node(struct pci_dev *); | |
41 | extern void pci_create_OF_bus_map(void); | |
40ef8cbc PM |
42 | #endif |
43 | ||
d1405b86 | 44 | /* |
d2dd482b BH |
45 | * OF address retreival & translation |
46 | */ | |
47 | ||
d2dd482b | 48 | /* Translate an OF address block into a CPU physical address |
d1405b86 | 49 | */ |
a7f67bdf | 50 | extern u64 of_translate_address(struct device_node *np, const u32 *addr); |
d1405b86 | 51 | |
837c54db BH |
52 | /* Translate a DMA address from device space to CPU space */ |
53 | extern u64 of_translate_dma_address(struct device_node *dev, | |
54 | const u32 *in_addr); | |
55 | ||
d2dd482b BH |
56 | /* Extract an address from a device, returns the region size and |
57 | * the address space flags too. The PCI version uses a BAR number | |
58 | * instead of an absolute index | |
59 | */ | |
a7f67bdf | 60 | extern const u32 *of_get_address(struct device_node *dev, int index, |
d2dd482b | 61 | u64 *size, unsigned int *flags); |
ff1f4ee9 | 62 | #ifdef CONFIG_PCI |
a7f67bdf | 63 | extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no, |
d2dd482b | 64 | u64 *size, unsigned int *flags); |
ff1f4ee9 AV |
65 | #else |
66 | static inline const u32 *of_get_pci_address(struct device_node *dev, | |
67 | int bar_no, u64 *size, unsigned int *flags) | |
68 | { | |
69 | return NULL; | |
70 | } | |
71 | #endif /* CONFIG_PCI */ | |
d2dd482b BH |
72 | |
73 | /* Get an address as a resource. Note that if your address is | |
74 | * a PIO address, the conversion will fail if the physical address | |
75 | * can't be internally converted to an IO token with | |
76 | * pci_address_to_pio(), that is because it's either called to early | |
77 | * or it can't be matched to any host bridge IO space | |
78 | */ | |
79 | extern int of_address_to_resource(struct device_node *dev, int index, | |
80 | struct resource *r); | |
ff1f4ee9 | 81 | #ifdef CONFIG_PCI |
d2dd482b BH |
82 | extern int of_pci_address_to_resource(struct device_node *dev, int bar, |
83 | struct resource *r); | |
ff1f4ee9 AV |
84 | #else |
85 | static inline int of_pci_address_to_resource(struct device_node *dev, int bar, | |
86 | struct resource *r) | |
87 | { | |
88 | return -ENOSYS; | |
89 | } | |
90 | #endif /* CONFIG_PCI */ | |
d1405b86 | 91 | |
d4ad66fa JK |
92 | /* Parse the ibm,dma-window property of an OF node into the busno, phys and |
93 | * size parameters. | |
94 | */ | |
a7f67bdf | 95 | void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, |
d4ad66fa JK |
96 | unsigned long *busno, unsigned long *phys, unsigned long *size); |
97 | ||
b68239ee ME |
98 | extern void kdump_move_device_tree(void); |
99 | ||
acf7d768 BH |
100 | /* CPU OF node matching */ |
101 | struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); | |
102 | ||
e523f723 NL |
103 | /* cache lookup */ |
104 | struct device_node *of_find_next_cache_node(struct device_node *np); | |
105 | ||
29cfe6f4 TT |
106 | /* Get the MAC address */ |
107 | extern const void *of_get_mac_address(struct device_node *np); | |
cc9fd71c | 108 | |
40681b95 | 109 | /** |
cc9fd71c BH |
110 | * of_irq_map_pci - Resolve the interrupt for a PCI device |
111 | * @pdev: the device whose interrupt is to be resolved | |
112 | * @out_irq: structure of_irq filled by this function | |
113 | * | |
114 | * This function resolves the PCI interrupt for a given PCI device. If a | |
115 | * device-node exists for a given pci_dev, it will use normal OF tree | |
116 | * walking. If not, it will implement standard swizzling and walk up the | |
117 | * PCI tree until an device-node is found, at which point it will finish | |
118 | * resolving using the OF tree walking. | |
119 | */ | |
120 | struct pci_dev; | |
121 | extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); | |
122 | ||
9b6b563c PM |
123 | #endif /* __KERNEL__ */ |
124 | #endif /* _POWERPC_PROM_H */ |