18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * TURBOchannel architecture calls. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (c) Harald Koerfgen, 1998 58c2ecf20Sopenharmony_ci * Copyright (c) 2001, 2003, 2005, 2006 Maciej W. Rozycki 68c2ecf20Sopenharmony_ci * Copyright (c) 2005 James Simmons 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU 98c2ecf20Sopenharmony_ci * General Public License. See the file "COPYING" in the main 108c2ecf20Sopenharmony_ci * directory of this archive for more details. 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci#include <linux/compiler.h> 138c2ecf20Sopenharmony_ci#include <linux/errno.h> 148c2ecf20Sopenharmony_ci#include <linux/init.h> 158c2ecf20Sopenharmony_ci#include <linux/string.h> 168c2ecf20Sopenharmony_ci#include <linux/tc.h> 178c2ecf20Sopenharmony_ci#include <linux/types.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <asm/addrspace.h> 208c2ecf20Sopenharmony_ci#include <asm/bootinfo.h> 218c2ecf20Sopenharmony_ci#include <asm/paccess.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#include <asm/dec/interrupts.h> 248c2ecf20Sopenharmony_ci#include <asm/dec/prom.h> 258c2ecf20Sopenharmony_ci#include <asm/dec/system.h> 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* 288c2ecf20Sopenharmony_ci * Protected read byte from TURBOchannel slot space. 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_ciint tc_preadb(u8 *valp, void __iomem *addr) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci return get_dbe(*valp, (u8 *)addr); 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* 368c2ecf20Sopenharmony_ci * Get TURBOchannel bus information as specified by the spec, plus 378c2ecf20Sopenharmony_ci * the slot space base address and the number of slots. 388c2ecf20Sopenharmony_ci */ 398c2ecf20Sopenharmony_ciint __init tc_bus_get_info(struct tc_bus *tbus) 408c2ecf20Sopenharmony_ci{ 418c2ecf20Sopenharmony_ci if (!dec_tc_bus) 428c2ecf20Sopenharmony_ci return -ENXIO; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci memcpy(&tbus->info, rex_gettcinfo(), sizeof(tbus->info)); 458c2ecf20Sopenharmony_ci tbus->slot_base = CPHYSADDR((long)rex_slot_address(0)); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci switch (mips_machtype) { 488c2ecf20Sopenharmony_ci case MACH_DS5000_200: 498c2ecf20Sopenharmony_ci tbus->num_tcslots = 7; 508c2ecf20Sopenharmony_ci break; 518c2ecf20Sopenharmony_ci case MACH_DS5000_2X0: 528c2ecf20Sopenharmony_ci case MACH_DS5900: 538c2ecf20Sopenharmony_ci tbus->ext_slot_base = 0x20000000; 548c2ecf20Sopenharmony_ci tbus->ext_slot_size = 0x20000000; 558c2ecf20Sopenharmony_ci fallthrough; 568c2ecf20Sopenharmony_ci case MACH_DS5000_1XX: 578c2ecf20Sopenharmony_ci tbus->num_tcslots = 3; 588c2ecf20Sopenharmony_ci break; 598c2ecf20Sopenharmony_ci case MACH_DS5000_XX: 608c2ecf20Sopenharmony_ci tbus->num_tcslots = 2; 618c2ecf20Sopenharmony_ci default: 628c2ecf20Sopenharmony_ci break; 638c2ecf20Sopenharmony_ci } 648c2ecf20Sopenharmony_ci return 0; 658c2ecf20Sopenharmony_ci} 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* 688c2ecf20Sopenharmony_ci * Get the IRQ for the specified slot. 698c2ecf20Sopenharmony_ci */ 708c2ecf20Sopenharmony_civoid __init tc_device_get_irq(struct tc_dev *tdev) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci switch (tdev->slot) { 738c2ecf20Sopenharmony_ci case 0: 748c2ecf20Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC0]; 758c2ecf20Sopenharmony_ci break; 768c2ecf20Sopenharmony_ci case 1: 778c2ecf20Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC1]; 788c2ecf20Sopenharmony_ci break; 798c2ecf20Sopenharmony_ci case 2: 808c2ecf20Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC2]; 818c2ecf20Sopenharmony_ci break; 828c2ecf20Sopenharmony_ci /* 838c2ecf20Sopenharmony_ci * Yuck! DS5000/200 onboard devices 848c2ecf20Sopenharmony_ci */ 858c2ecf20Sopenharmony_ci case 5: 868c2ecf20Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC5]; 878c2ecf20Sopenharmony_ci break; 888c2ecf20Sopenharmony_ci case 6: 898c2ecf20Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC6]; 908c2ecf20Sopenharmony_ci break; 918c2ecf20Sopenharmony_ci default: 928c2ecf20Sopenharmony_ci tdev->interrupt = -1; 938c2ecf20Sopenharmony_ci break; 948c2ecf20Sopenharmony_ci } 958c2ecf20Sopenharmony_ci} 96