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

tc.c (2050B)


      1/*
      2 *	TURBOchannel architecture calls.
      3 *
      4 *	Copyright (c) Harald Koerfgen, 1998
      5 *	Copyright (c) 2001, 2003, 2005, 2006  Maciej W. Rozycki
      6 *	Copyright (c) 2005  James Simmons
      7 *
      8 *	This file is subject to the terms and conditions of the GNU
      9 *	General Public License.  See the file "COPYING" in the main
     10 *	directory of this archive for more details.
     11 */
     12#include <linux/compiler.h>
     13#include <linux/errno.h>
     14#include <linux/init.h>
     15#include <linux/string.h>
     16#include <linux/tc.h>
     17#include <linux/types.h>
     18
     19#include <asm/addrspace.h>
     20#include <asm/bootinfo.h>
     21#include <asm/paccess.h>
     22
     23#include <asm/dec/interrupts.h>
     24#include <asm/dec/prom.h>
     25#include <asm/dec/system.h>
     26
     27/*
     28 * Protected read byte from TURBOchannel slot space.
     29 */
     30int tc_preadb(u8 *valp, void __iomem *addr)
     31{
     32	return get_dbe(*valp, (u8 *)addr);
     33}
     34
     35/*
     36 * Get TURBOchannel bus information as specified by the spec, plus
     37 * the slot space base address and the number of slots.
     38 */
     39int __init tc_bus_get_info(struct tc_bus *tbus)
     40{
     41	if (!dec_tc_bus)
     42		return -ENXIO;
     43
     44	memcpy(&tbus->info, rex_gettcinfo(), sizeof(tbus->info));
     45	tbus->slot_base = CPHYSADDR((long)rex_slot_address(0));
     46
     47	switch (mips_machtype) {
     48	case MACH_DS5000_200:
     49		tbus->num_tcslots = 7;
     50		break;
     51	case MACH_DS5000_2X0:
     52	case MACH_DS5900:
     53		tbus->ext_slot_base = 0x20000000;
     54		tbus->ext_slot_size = 0x20000000;
     55		fallthrough;
     56	case MACH_DS5000_1XX:
     57		tbus->num_tcslots = 3;
     58		break;
     59	case MACH_DS5000_XX:
     60		tbus->num_tcslots = 2;
     61	default:
     62		break;
     63	}
     64	return 0;
     65}
     66
     67/*
     68 * Get the IRQ for the specified slot.
     69 */
     70void __init tc_device_get_irq(struct tc_dev *tdev)
     71{
     72	switch (tdev->slot) {
     73	case 0:
     74		tdev->interrupt = dec_interrupt[DEC_IRQ_TC0];
     75		break;
     76	case 1:
     77		tdev->interrupt = dec_interrupt[DEC_IRQ_TC1];
     78		break;
     79	case 2:
     80		tdev->interrupt = dec_interrupt[DEC_IRQ_TC2];
     81		break;
     82	/*
     83	 * Yuck! DS5000/200 onboard devices
     84	 */
     85	case 5:
     86		tdev->interrupt = dec_interrupt[DEC_IRQ_TC5];
     87		break;
     88	case 6:
     89		tdev->interrupt = dec_interrupt[DEC_IRQ_TC6];
     90		break;
     91	default:
     92		tdev->interrupt = -1;
     93		break;
     94	}
     95}