cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

linkstation.c (3967B)


      1/*
      2 * Board setup routines for the Buffalo Linkstation / Kurobox Platform.
      3 *
      4 * Copyright (C) 2006 G. Liakhovetski (g.liakhovetski@gmx.de)
      5 *
      6 * Based on sandpoint.c by Mark A. Greer
      7 *
      8 * This file is licensed under the terms of the GNU General Public License
      9 * version 2.  This program is licensed "as is" without any warranty of
     10 * any kind, whether express or implied.
     11 */
     12
     13#include <linux/kernel.h>
     14#include <linux/initrd.h>
     15#include <linux/of_platform.h>
     16
     17#include <asm/time.h>
     18#include <asm/mpic.h>
     19#include <asm/pci-bridge.h>
     20
     21#include "mpc10x.h"
     22
     23static const struct of_device_id of_bus_ids[] __initconst = {
     24	{ .type = "soc", },
     25	{ .compatible = "simple-bus", },
     26	{},
     27};
     28
     29static int __init declare_of_platform_devices(void)
     30{
     31	of_platform_bus_probe(NULL, of_bus_ids, NULL);
     32	return 0;
     33}
     34machine_device_initcall(linkstation, declare_of_platform_devices);
     35
     36static int __init linkstation_add_bridge(struct device_node *dev)
     37{
     38#ifdef CONFIG_PCI
     39	int len;
     40	struct pci_controller *hose;
     41	const int *bus_range;
     42
     43	printk("Adding PCI host bridge %pOF\n", dev);
     44
     45	bus_range = of_get_property(dev, "bus-range", &len);
     46	if (bus_range == NULL || len < 2 * sizeof(int))
     47		printk(KERN_WARNING "Can't get bus-range for %pOF, assume"
     48				" bus 0\n", dev);
     49
     50	hose = pcibios_alloc_controller(dev);
     51	if (hose == NULL)
     52		return -ENOMEM;
     53	hose->first_busno = bus_range ? bus_range[0] : 0;
     54	hose->last_busno = bus_range ? bus_range[1] : 0xff;
     55	setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
     56
     57	/* Interpret the "ranges" property */
     58	/* This also maps the I/O region and sets isa_io/mem_base */
     59	pci_process_bridge_OF_ranges(hose, dev, 1);
     60#endif
     61	return 0;
     62}
     63
     64static void __init linkstation_setup_arch(void)
     65{
     66	printk(KERN_INFO "BUFFALO Network Attached Storage Series\n");
     67	printk(KERN_INFO "(C) 2002-2005 BUFFALO INC.\n");
     68}
     69
     70static void __init linkstation_setup_pci(void)
     71{
     72	struct device_node *np;
     73
     74	/* Lookup PCI host bridges */
     75	for_each_compatible_node(np, "pci", "mpc10x-pci")
     76		linkstation_add_bridge(np);
     77}
     78
     79/*
     80 * Interrupt setup and service.  Interrupts on the linkstation come
     81 * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
     82 */
     83static void __init linkstation_init_IRQ(void)
     84{
     85	struct mpic *mpic;
     86
     87	mpic = mpic_alloc(NULL, 0, 0, 4, 0, " EPIC     ");
     88	BUG_ON(mpic == NULL);
     89
     90	/* PCI IRQs */
     91	mpic_assign_isu(mpic, 0, mpic->paddr + 0x10200);
     92
     93	/* I2C */
     94	mpic_assign_isu(mpic, 1, mpic->paddr + 0x11000);
     95
     96	/* ttyS0, ttyS1 */
     97	mpic_assign_isu(mpic, 2, mpic->paddr + 0x11100);
     98
     99	mpic_init(mpic);
    100}
    101
    102extern void avr_uart_configure(void);
    103extern void avr_uart_send(const char);
    104
    105static void __noreturn linkstation_restart(char *cmd)
    106{
    107	local_irq_disable();
    108
    109	/* Reset system via AVR */
    110	avr_uart_configure();
    111	/* Send reboot command */
    112	avr_uart_send('C');
    113
    114	for(;;)  /* Spin until reset happens */
    115		avr_uart_send('G');	/* "kick" */
    116}
    117
    118static void __noreturn linkstation_power_off(void)
    119{
    120	local_irq_disable();
    121
    122	/* Power down system via AVR */
    123	avr_uart_configure();
    124	/* send shutdown command */
    125	avr_uart_send('E');
    126
    127	for(;;)  /* Spin until power-off happens */
    128		avr_uart_send('G');	/* "kick" */
    129	/* NOTREACHED */
    130}
    131
    132static void __noreturn linkstation_halt(void)
    133{
    134	linkstation_power_off();
    135	/* NOTREACHED */
    136}
    137
    138static void linkstation_show_cpuinfo(struct seq_file *m)
    139{
    140	seq_printf(m, "vendor\t\t: Buffalo Technology\n");
    141	seq_printf(m, "machine\t\t: Linkstation I/Kurobox(HG)\n");
    142}
    143
    144static int __init linkstation_probe(void)
    145{
    146	if (!of_machine_is_compatible("linkstation"))
    147		return 0;
    148
    149	pm_power_off = linkstation_power_off;
    150
    151	return 1;
    152}
    153
    154define_machine(linkstation){
    155	.name 			= "Buffalo Linkstation",
    156	.probe 			= linkstation_probe,
    157	.setup_arch 		= linkstation_setup_arch,
    158	.discover_phbs		= linkstation_setup_pci,
    159	.init_IRQ 		= linkstation_init_IRQ,
    160	.show_cpuinfo 		= linkstation_show_cpuinfo,
    161	.get_irq 		= mpic_get_irq,
    162	.restart 		= linkstation_restart,
    163	.halt	 		= linkstation_halt,
    164	.calibrate_decr 	= generic_calibrate_decr,
    165};