devicetree.c revision 9079b35364e75ce6b968a179f861d2f819f33e61
1/* 2 * Architecture specific OF callbacks. 3 */ 4#include <linux/bootmem.h> 5#include <linux/io.h> 6#include <linux/interrupt.h> 7#include <linux/list.h> 8#include <linux/of.h> 9#include <linux/of_fdt.h> 10#include <linux/of_address.h> 11#include <linux/of_platform.h> 12#include <linux/of_irq.h> 13#include <linux/slab.h> 14#include <linux/pci.h> 15#include <linux/of_pci.h> 16 17#include <asm/hpet.h> 18#include <asm/irq_controller.h> 19#include <asm/apic.h> 20#include <asm/pci_x86.h> 21 22__initdata u64 initial_dtb; 23char __initdata cmd_line[COMMAND_LINE_SIZE]; 24static LIST_HEAD(irq_domains); 25static DEFINE_RAW_SPINLOCK(big_irq_lock); 26 27int __initdata of_ioapic; 28 29void add_interrupt_host(struct irq_domain *ih) 30{ 31 unsigned long flags; 32 33 raw_spin_lock_irqsave(&big_irq_lock, flags); 34 list_add(&ih->l, &irq_domains); 35 raw_spin_unlock_irqrestore(&big_irq_lock, flags); 36} 37 38static struct irq_domain *get_ih_from_node(struct device_node *controller) 39{ 40 struct irq_domain *ih, *found = NULL; 41 unsigned long flags; 42 43 raw_spin_lock_irqsave(&big_irq_lock, flags); 44 list_for_each_entry(ih, &irq_domains, l) { 45 if (ih->controller == controller) { 46 found = ih; 47 break; 48 } 49 } 50 raw_spin_unlock_irqrestore(&big_irq_lock, flags); 51 return found; 52} 53 54unsigned int irq_create_of_mapping(struct device_node *controller, 55 const u32 *intspec, unsigned int intsize) 56{ 57 struct irq_domain *ih; 58 u32 virq, type; 59 int ret; 60 61 ih = get_ih_from_node(controller); 62 if (!ih) 63 return 0; 64 ret = ih->xlate(ih, intspec, intsize, &virq, &type); 65 if (ret) 66 return ret; 67 if (type == IRQ_TYPE_NONE) 68 return virq; 69 /* set the mask if it is different from current */ 70 if (type == (irq_to_desc(virq)->status & IRQF_TRIGGER_MASK)) 71 set_irq_type(virq, type); 72 return virq; 73} 74EXPORT_SYMBOL_GPL(irq_create_of_mapping); 75 76unsigned long pci_address_to_pio(phys_addr_t address) 77{ 78 /* 79 * The ioport address can be directly used by inX / outX 80 */ 81 BUG_ON(address >= (1 << 16)); 82 return (unsigned long)address; 83} 84EXPORT_SYMBOL_GPL(pci_address_to_pio); 85 86void __init early_init_dt_scan_chosen_arch(unsigned long node) 87{ 88 BUG(); 89} 90 91void __init early_init_dt_add_memory_arch(u64 base, u64 size) 92{ 93 BUG(); 94} 95 96void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align) 97{ 98 return __alloc_bootmem(size, align, __pa(MAX_DMA_ADDRESS)); 99} 100 101void __init add_dtb(u64 data) 102{ 103 initial_dtb = data + offsetof(struct setup_data, data); 104} 105 106/* 107 * CE4100 ids. Will be moved to machine_device_initcall() once we have it. 108 */ 109static struct of_device_id __initdata ce4100_ids[] = { 110 { .compatible = "intel,ce4100-cp", }, 111 { .compatible = "isa", }, 112 { .compatible = "pci", }, 113 {}, 114}; 115 116static int __init add_bus_probe(void) 117{ 118 if (!initial_boot_params) 119 return 0; 120 121 return of_platform_bus_probe(NULL, ce4100_ids, NULL); 122} 123module_init(add_bus_probe); 124 125#ifdef CONFIG_PCI 126static int x86_of_pci_irq_enable(struct pci_dev *dev) 127{ 128 struct of_irq oirq; 129 u32 virq; 130 int ret; 131 u8 pin; 132 133 ret = pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); 134 if (ret) 135 return ret; 136 if (!pin) 137 return 0; 138 139 ret = of_irq_map_pci(dev, &oirq); 140 if (ret) 141 return ret; 142 143 virq = irq_create_of_mapping(oirq.controller, oirq.specifier, 144 oirq.size); 145 if (virq == 0) 146 return -EINVAL; 147 dev->irq = virq; 148 return 0; 149} 150 151static void x86_of_pci_irq_disable(struct pci_dev *dev) 152{ 153} 154 155void __cpuinit x86_of_pci_init(void) 156{ 157 struct device_node *np; 158 159 pcibios_enable_irq = x86_of_pci_irq_enable; 160 pcibios_disable_irq = x86_of_pci_irq_disable; 161 162 for_each_node_by_type(np, "pci") { 163 const void *prop; 164 struct pci_bus *bus; 165 unsigned int bus_min; 166 struct device_node *child; 167 168 prop = of_get_property(np, "bus-range", NULL); 169 if (!prop) 170 continue; 171 bus_min = be32_to_cpup(prop); 172 173 bus = pci_find_bus(0, bus_min); 174 if (!bus) { 175 printk(KERN_ERR "Can't find a node for bus %s.\n", 176 np->full_name); 177 continue; 178 } 179 180 if (bus->self) 181 bus->self->dev.of_node = np; 182 else 183 bus->dev.of_node = np; 184 185 for_each_child_of_node(np, child) { 186 struct pci_dev *dev; 187 u32 devfn; 188 189 prop = of_get_property(child, "reg", NULL); 190 if (!prop) 191 continue; 192 193 devfn = (be32_to_cpup(prop) >> 8) & 0xff; 194 dev = pci_get_slot(bus, devfn); 195 if (!dev) 196 continue; 197 dev->dev.of_node = child; 198 pci_dev_put(dev); 199 } 200 } 201} 202#endif 203 204static void __init dtb_setup_hpet(void) 205{ 206 struct device_node *dn; 207 struct resource r; 208 int ret; 209 210 dn = of_find_compatible_node(NULL, NULL, "intel,ce4100-hpet"); 211 if (!dn) 212 return; 213 ret = of_address_to_resource(dn, 0, &r); 214 if (ret) { 215 WARN_ON(1); 216 return; 217 } 218 hpet_address = r.start; 219} 220 221static void __init dtb_lapic_setup(void) 222{ 223#ifdef CONFIG_X86_LOCAL_APIC 224 if (apic_force_enable()) 225 return; 226 227 smp_found_config = 1; 228 pic_mode = 1; 229 /* Required for ioapic registration */ 230 set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr); 231 if (boot_cpu_physical_apicid == -1U) 232 boot_cpu_physical_apicid = read_apic_id(); 233 234 generic_processor_info(boot_cpu_physical_apicid, 235 GET_APIC_VERSION(apic_read(APIC_LVR))); 236#endif 237} 238 239#ifdef CONFIG_X86_IO_APIC 240static unsigned int ioapic_id; 241 242static void __init dtb_add_ioapic(struct device_node *dn) 243{ 244 struct resource r; 245 int ret; 246 247 ret = of_address_to_resource(dn, 0, &r); 248 if (ret) { 249 printk(KERN_ERR "Can't obtain address from node %s.\n", 250 dn->full_name); 251 return; 252 } 253 mp_register_ioapic(++ioapic_id, r.start, gsi_top); 254} 255 256static void __init dtb_ioapic_setup(void) 257{ 258 struct device_node *dn; 259 260 if (!smp_found_config) 261 return; 262 263 for_each_compatible_node(dn, NULL, "intel,ce4100-ioapic") 264 dtb_add_ioapic(dn); 265 266 if (nr_ioapics) { 267 of_ioapic = 1; 268 return; 269 } 270 printk(KERN_ERR "Error: No information about IO-APIC in OF.\n"); 271 smp_found_config = 0; 272} 273#else 274static void __init dtb_ioapic_setup(void) {} 275#endif 276 277static void __init dtb_apic_setup(void) 278{ 279 dtb_lapic_setup(); 280 dtb_ioapic_setup(); 281} 282 283void __init x86_dtb_find_config(void) 284{ 285 if (initial_dtb) 286 smp_found_config = 1; 287 else 288 printk(KERN_ERR "Missing device tree!.\n"); 289} 290 291void __init x86_dtb_get_config(unsigned int unused) 292{ 293 u32 size, map_len; 294 void *new_dtb; 295 296 if (!initial_dtb) 297 return; 298 299 map_len = max(PAGE_SIZE - (initial_dtb & ~PAGE_MASK), 300 (u64)sizeof(struct boot_param_header)); 301 302 initial_boot_params = early_memremap(initial_dtb, map_len); 303 size = be32_to_cpu(initial_boot_params->totalsize); 304 if (map_len < size) { 305 early_iounmap(initial_boot_params, map_len); 306 initial_boot_params = early_memremap(initial_dtb, size); 307 map_len = size; 308 } 309 310 new_dtb = alloc_bootmem(size); 311 memcpy(new_dtb, initial_boot_params, size); 312 early_iounmap(initial_boot_params, map_len); 313 314 initial_boot_params = new_dtb; 315 316 /* root level address cells */ 317 of_scan_flat_dt(early_init_dt_scan_root, NULL); 318 319 unflatten_device_tree(); 320 dtb_setup_hpet(); 321 dtb_apic_setup(); 322} 323