162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * TURBOchannel architecture calls. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) Harald Koerfgen, 1998 562306a36Sopenharmony_ci * Copyright (c) 2001, 2003, 2005, 2006 Maciej W. Rozycki 662306a36Sopenharmony_ci * Copyright (c) 2005 James Simmons 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU 962306a36Sopenharmony_ci * General Public License. See the file "COPYING" in the main 1062306a36Sopenharmony_ci * directory of this archive for more details. 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci#include <linux/compiler.h> 1362306a36Sopenharmony_ci#include <linux/errno.h> 1462306a36Sopenharmony_ci#include <linux/init.h> 1562306a36Sopenharmony_ci#include <linux/string.h> 1662306a36Sopenharmony_ci#include <linux/tc.h> 1762306a36Sopenharmony_ci#include <linux/types.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <asm/addrspace.h> 2062306a36Sopenharmony_ci#include <asm/bootinfo.h> 2162306a36Sopenharmony_ci#include <asm/paccess.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <asm/dec/interrupts.h> 2462306a36Sopenharmony_ci#include <asm/dec/prom.h> 2562306a36Sopenharmony_ci#include <asm/dec/system.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * Protected read byte from TURBOchannel slot space. 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_ciint tc_preadb(u8 *valp, void __iomem *addr) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci return get_dbe(*valp, (u8 *)addr); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * Get TURBOchannel bus information as specified by the spec, plus 3762306a36Sopenharmony_ci * the slot space base address and the number of slots. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_ciint __init tc_bus_get_info(struct tc_bus *tbus) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci if (!dec_tc_bus) 4262306a36Sopenharmony_ci return -ENXIO; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci memcpy(&tbus->info, rex_gettcinfo(), sizeof(tbus->info)); 4562306a36Sopenharmony_ci tbus->slot_base = CPHYSADDR((long)rex_slot_address(0)); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci switch (mips_machtype) { 4862306a36Sopenharmony_ci case MACH_DS5000_200: 4962306a36Sopenharmony_ci tbus->num_tcslots = 7; 5062306a36Sopenharmony_ci break; 5162306a36Sopenharmony_ci case MACH_DS5000_2X0: 5262306a36Sopenharmony_ci case MACH_DS5900: 5362306a36Sopenharmony_ci tbus->ext_slot_base = 0x20000000; 5462306a36Sopenharmony_ci tbus->ext_slot_size = 0x20000000; 5562306a36Sopenharmony_ci fallthrough; 5662306a36Sopenharmony_ci case MACH_DS5000_1XX: 5762306a36Sopenharmony_ci tbus->num_tcslots = 3; 5862306a36Sopenharmony_ci break; 5962306a36Sopenharmony_ci case MACH_DS5000_XX: 6062306a36Sopenharmony_ci tbus->num_tcslots = 2; 6162306a36Sopenharmony_ci default: 6262306a36Sopenharmony_ci break; 6362306a36Sopenharmony_ci } 6462306a36Sopenharmony_ci return 0; 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* 6862306a36Sopenharmony_ci * Get the IRQ for the specified slot. 6962306a36Sopenharmony_ci */ 7062306a36Sopenharmony_civoid __init tc_device_get_irq(struct tc_dev *tdev) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci switch (tdev->slot) { 7362306a36Sopenharmony_ci case 0: 7462306a36Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC0]; 7562306a36Sopenharmony_ci break; 7662306a36Sopenharmony_ci case 1: 7762306a36Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC1]; 7862306a36Sopenharmony_ci break; 7962306a36Sopenharmony_ci case 2: 8062306a36Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC2]; 8162306a36Sopenharmony_ci break; 8262306a36Sopenharmony_ci /* 8362306a36Sopenharmony_ci * Yuck! DS5000/200 onboard devices 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_ci case 5: 8662306a36Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC5]; 8762306a36Sopenharmony_ci break; 8862306a36Sopenharmony_ci case 6: 8962306a36Sopenharmony_ci tdev->interrupt = dec_interrupt[DEC_IRQ_TC6]; 9062306a36Sopenharmony_ci break; 9162306a36Sopenharmony_ci default: 9262306a36Sopenharmony_ci tdev->interrupt = -1; 9362306a36Sopenharmony_ci break; 9462306a36Sopenharmony_ci } 9562306a36Sopenharmony_ci} 96