Path: blob/master/arch/powerpc/platforms/amigaone/setup.c
26583 views
// SPDX-License-Identifier: GPL-2.0-or-later1/*2* AmigaOne platform setup3*4* Copyright 2008 Gerhard Pircher ([email protected])5*6* Based on original amigaone_setup.c source code7* Copyright 2003 by Hans-Joerg Frieden and Thomas Frieden8*/910#include <linux/irqdomain.h>11#include <linux/kernel.h>12#include <linux/of.h>13#include <linux/of_address.h>14#include <linux/seq_file.h>15#include <generated/utsrelease.h>1617#include <asm/machdep.h>18#include <asm/cputable.h>19#include <asm/pci-bridge.h>20#include <asm/i8259.h>21#include <asm/time.h>22#include <asm/udbg.h>23#include <asm/dma.h>2425extern void __flush_disable_L1(void);2627static void amigaone_show_cpuinfo(struct seq_file *m)28{29seq_printf(m, "vendor\t\t: Eyetech Ltd.\n");30}3132static int __init amigaone_add_bridge(struct device_node *dev)33{34const u32 *cfg_addr, *cfg_data;35int len;36const int *bus_range;37struct pci_controller *hose;3839printk(KERN_INFO "Adding PCI host bridge %pOF\n", dev);4041cfg_addr = of_get_address(dev, 0, NULL, NULL);42cfg_data = of_get_address(dev, 1, NULL, NULL);43if ((cfg_addr == NULL) || (cfg_data == NULL))44return -ENODEV;4546bus_range = of_get_property(dev, "bus-range", &len);47if ((bus_range == NULL) || (len < 2 * sizeof(int)))48printk(KERN_WARNING "Can't get bus-range for %pOF, assume"49" bus 0\n", dev);5051hose = pcibios_alloc_controller(dev);52if (hose == NULL)53return -ENOMEM;5455hose->first_busno = bus_range ? bus_range[0] : 0;56hose->last_busno = bus_range ? bus_range[1] : 0xff;5758setup_indirect_pci(hose, cfg_addr[0], cfg_data[0], 0);5960/* Interpret the "ranges" property */61/* This also maps the I/O region and sets isa_io/mem_base */62pci_process_bridge_OF_ranges(hose, dev, 1);6364return 0;65}6667static void __init amigaone_setup_arch(void)68{69if (ppc_md.progress)70ppc_md.progress("Linux/PPC "UTS_RELEASE"\n", 0);71}7273static void __init amigaone_discover_phbs(void)74{75struct device_node *np;76int phb = -ENODEV;7778/* Lookup PCI host bridges. */79for_each_compatible_node(np, "pci", "mai-logic,articia-s")80phb = amigaone_add_bridge(np);8182BUG_ON(phb != 0);83}8485static void __init amigaone_init_IRQ(void)86{87struct device_node *pic, *np = NULL;88const unsigned long *prop = NULL;89unsigned long int_ack = 0;9091/* Search for ISA interrupt controller. */92pic = of_find_compatible_node(NULL, "interrupt-controller",93"pnpPNP,000");94BUG_ON(pic == NULL);9596/* Look for interrupt acknowledge address in the PCI root node. */97np = of_find_compatible_node(NULL, "pci", "mai-logic,articia-s");98if (np) {99prop = of_get_property(np, "8259-interrupt-acknowledge", NULL);100if (prop)101int_ack = prop[0];102of_node_put(np);103}104105if (int_ack == 0)106printk(KERN_WARNING "Cannot find PCI interrupt acknowledge"107" address, polling\n");108109i8259_init(pic, int_ack);110ppc_md.get_irq = i8259_irq;111irq_set_default_domain(i8259_get_host());112}113114static int __init request_isa_regions(void)115{116request_region(0x00, 0x20, "dma1");117request_region(0x40, 0x20, "timer");118request_region(0x80, 0x10, "dma page reg");119request_region(0xc0, 0x20, "dma2");120121return 0;122}123machine_device_initcall(amigaone, request_isa_regions);124125static void __noreturn amigaone_restart(char *cmd)126{127local_irq_disable();128129/* Flush and disable caches. */130__flush_disable_L1();131132/* Set SRR0 to the reset vector and turn on MSR_IP. */133mtspr(SPRN_SRR0, 0xfff00100);134mtspr(SPRN_SRR1, MSR_IP);135136/* Do an rfi to jump back to firmware. */137__asm__ __volatile__("rfi" : : : "memory");138139/* Not reached. */140while (1);141}142143static int __init amigaone_probe(void)144{145/*146* Coherent memory access cause complete system lockup! Thus147* disable this CPU feature, even if the CPU needs it.148*/149cur_cpu_spec->cpu_features &= ~CPU_FTR_NEED_COHERENT;150151DMA_MODE_READ = 0x44;152DMA_MODE_WRITE = 0x48;153154return 1;155}156157define_machine(amigaone) {158.name = "AmigaOne",159.compatible = "eyetech,amigaone",160.probe = amigaone_probe,161.setup_arch = amigaone_setup_arch,162.discover_phbs = amigaone_discover_phbs,163.show_cpuinfo = amigaone_show_cpuinfo,164.init_IRQ = amigaone_init_IRQ,165.restart = amigaone_restart,166.progress = udbg_progress,167};168169170