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 */ 30 int 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 */ 39 int __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 */ 70 void __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 } 96