1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 3f30c2269SUwe Zeisberger * linux/arch/alpha/kernel/machvec_impl.h 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1997, 1998 Richard Henderson 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * This file has goodies to help simplify instantiation of machine vectors. 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds /* Whee. These systems don't have an HAE: 111da177e4SLinus Torvalds IRONGATE, MARVEL, POLARIS, TSUNAMI, TITAN, WILDFIRE 121da177e4SLinus Torvalds Fix things up for the GENERIC kernel by defining the HAE address 131da177e4SLinus Torvalds to be that of the cache. Now we can read and write it as we like. ;-) */ 141da177e4SLinus Torvalds #define IRONGATE_HAE_ADDRESS (&alpha_mv.hae_cache) 151da177e4SLinus Torvalds #define MARVEL_HAE_ADDRESS (&alpha_mv.hae_cache) 161da177e4SLinus Torvalds #define POLARIS_HAE_ADDRESS (&alpha_mv.hae_cache) 171da177e4SLinus Torvalds #define TSUNAMI_HAE_ADDRESS (&alpha_mv.hae_cache) 181da177e4SLinus Torvalds #define TITAN_HAE_ADDRESS (&alpha_mv.hae_cache) 191da177e4SLinus Torvalds #define WILDFIRE_HAE_ADDRESS (&alpha_mv.hae_cache) 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #ifdef CIA_ONE_HAE_WINDOW 221da177e4SLinus Torvalds #define CIA_HAE_ADDRESS (&alpha_mv.hae_cache) 231da177e4SLinus Torvalds #endif 241da177e4SLinus Torvalds #ifdef MCPCIA_ONE_HAE_WINDOW 251da177e4SLinus Torvalds #define MCPCIA_HAE_ADDRESS (&alpha_mv.hae_cache) 261da177e4SLinus Torvalds #endif 2798c532ecSIvan Kokshaysky #ifdef T2_ONE_HAE_WINDOW 2898c532ecSIvan Kokshaysky #define T2_HAE_ADDRESS (&alpha_mv.hae_cache) 2998c532ecSIvan Kokshaysky #endif 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /* Only a few systems don't define IACK_SC, handling all interrupts through 321da177e4SLinus Torvalds the SRM console. But splitting out that one case from IO() below 331da177e4SLinus Torvalds seems like such a pain. Define this to get things to compile. */ 341da177e4SLinus Torvalds #define JENSEN_IACK_SC 1 351da177e4SLinus Torvalds #define T2_IACK_SC 1 361da177e4SLinus Torvalds #define WILDFIRE_IACK_SC 1 /* FIXME */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds /* 391da177e4SLinus Torvalds * Some helpful macros for filling in the blanks. 401da177e4SLinus Torvalds */ 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds #define CAT1(x,y) x##y 431da177e4SLinus Torvalds #define CAT(x,y) CAT1(x,y) 441da177e4SLinus Torvalds 4585d0b3a5SRichard Henderson #define DO_DEFAULT_RTC .rtc_port = 0x70 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds #define DO_EV4_MMU \ 481da177e4SLinus Torvalds .max_asn = EV4_MAX_ASN, \ 491da177e4SLinus Torvalds .mv_switch_mm = ev4_switch_mm, \ 501da177e4SLinus Torvalds .mv_activate_mm = ev4_activate_mm, \ 511da177e4SLinus Torvalds .mv_flush_tlb_current = ev4_flush_tlb_current, \ 521da177e4SLinus Torvalds .mv_flush_tlb_current_page = ev4_flush_tlb_current_page 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds #define DO_EV5_MMU \ 551da177e4SLinus Torvalds .max_asn = EV5_MAX_ASN, \ 561da177e4SLinus Torvalds .mv_switch_mm = ev5_switch_mm, \ 571da177e4SLinus Torvalds .mv_activate_mm = ev5_activate_mm, \ 581da177e4SLinus Torvalds .mv_flush_tlb_current = ev5_flush_tlb_current, \ 591da177e4SLinus Torvalds .mv_flush_tlb_current_page = ev5_flush_tlb_current_page 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds #define DO_EV6_MMU \ 621da177e4SLinus Torvalds .max_asn = EV6_MAX_ASN, \ 631da177e4SLinus Torvalds .mv_switch_mm = ev5_switch_mm, \ 641da177e4SLinus Torvalds .mv_activate_mm = ev5_activate_mm, \ 651da177e4SLinus Torvalds .mv_flush_tlb_current = ev5_flush_tlb_current, \ 661da177e4SLinus Torvalds .mv_flush_tlb_current_page = ev5_flush_tlb_current_page 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds #define DO_EV7_MMU \ 691da177e4SLinus Torvalds .max_asn = EV6_MAX_ASN, \ 701da177e4SLinus Torvalds .mv_switch_mm = ev5_switch_mm, \ 711da177e4SLinus Torvalds .mv_activate_mm = ev5_activate_mm, \ 721da177e4SLinus Torvalds .mv_flush_tlb_current = ev5_flush_tlb_current, \ 731da177e4SLinus Torvalds .mv_flush_tlb_current_page = ev5_flush_tlb_current_page 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds #define IO_LITE(UP,low) \ 761da177e4SLinus Torvalds .hae_register = (unsigned long *) CAT(UP,_HAE_ADDRESS), \ 771da177e4SLinus Torvalds .iack_sc = CAT(UP,_IACK_SC), \ 781da177e4SLinus Torvalds .mv_ioread8 = CAT(low,_ioread8), \ 791da177e4SLinus Torvalds .mv_ioread16 = CAT(low,_ioread16), \ 801da177e4SLinus Torvalds .mv_ioread32 = CAT(low,_ioread32), \ 81*e19d4ebcSArnd Bergmann .mv_ioread64 = CAT(low,_ioread64), \ 821da177e4SLinus Torvalds .mv_iowrite8 = CAT(low,_iowrite8), \ 831da177e4SLinus Torvalds .mv_iowrite16 = CAT(low,_iowrite16), \ 841da177e4SLinus Torvalds .mv_iowrite32 = CAT(low,_iowrite32), \ 85*e19d4ebcSArnd Bergmann .mv_iowrite64 = CAT(low,_iowrite64), \ 861da177e4SLinus Torvalds .mv_readb = CAT(low,_readb), \ 871da177e4SLinus Torvalds .mv_readw = CAT(low,_readw), \ 881da177e4SLinus Torvalds .mv_readl = CAT(low,_readl), \ 891da177e4SLinus Torvalds .mv_readq = CAT(low,_readq), \ 901da177e4SLinus Torvalds .mv_writeb = CAT(low,_writeb), \ 911da177e4SLinus Torvalds .mv_writew = CAT(low,_writew), \ 921da177e4SLinus Torvalds .mv_writel = CAT(low,_writel), \ 931da177e4SLinus Torvalds .mv_writeq = CAT(low,_writeq), \ 941da177e4SLinus Torvalds .mv_ioportmap = CAT(low,_ioportmap), \ 951da177e4SLinus Torvalds .mv_ioremap = CAT(low,_ioremap), \ 961da177e4SLinus Torvalds .mv_iounmap = CAT(low,_iounmap), \ 971da177e4SLinus Torvalds .mv_is_ioaddr = CAT(low,_is_ioaddr), \ 981da177e4SLinus Torvalds .mv_is_mmio = CAT(low,_is_mmio) \ 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds #define IO(UP,low) \ 1011da177e4SLinus Torvalds IO_LITE(UP,low), \ 1021da177e4SLinus Torvalds .pci_ops = &CAT(low,_pci_ops), \ 1031da177e4SLinus Torvalds .mv_pci_tbi = CAT(low,_pci_tbi) 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds #define DO_APECS_IO IO(APECS,apecs) 1061da177e4SLinus Torvalds #define DO_CIA_IO IO(CIA,cia) 1071da177e4SLinus Torvalds #define DO_IRONGATE_IO IO(IRONGATE,irongate) 1081da177e4SLinus Torvalds #define DO_LCA_IO IO(LCA,lca) 1091da177e4SLinus Torvalds #define DO_MARVEL_IO IO(MARVEL,marvel) 1101da177e4SLinus Torvalds #define DO_MCPCIA_IO IO(MCPCIA,mcpcia) 1111da177e4SLinus Torvalds #define DO_POLARIS_IO IO(POLARIS,polaris) 1121da177e4SLinus Torvalds #define DO_T2_IO IO(T2,t2) 1131da177e4SLinus Torvalds #define DO_TSUNAMI_IO IO(TSUNAMI,tsunami) 1141da177e4SLinus Torvalds #define DO_TITAN_IO IO(TITAN,titan) 1151da177e4SLinus Torvalds #define DO_WILDFIRE_IO IO(WILDFIRE,wildfire) 1161da177e4SLinus Torvalds 1171da177e4SLinus Torvalds #define DO_PYXIS_IO IO_LITE(CIA,cia_bwx), \ 1181da177e4SLinus Torvalds .pci_ops = &cia_pci_ops, \ 1191da177e4SLinus Torvalds .mv_pci_tbi = cia_pci_tbi 1201da177e4SLinus Torvalds 1211da177e4SLinus Torvalds /* 1221da177e4SLinus Torvalds * In a GENERIC kernel, we have lots of these vectors floating about, 1231da177e4SLinus Torvalds * all but one of which we want to go away. In a non-GENERIC kernel, 1241da177e4SLinus Torvalds * we want only one, ever. 1251da177e4SLinus Torvalds * 1261da177e4SLinus Torvalds * Accomplish this in the GENERIC kernel by putting all of the vectors 1271da177e4SLinus Torvalds * in the .init.data section where they'll go away. We'll copy the 1281da177e4SLinus Torvalds * one we want to the real alpha_mv vector in setup_arch. 1291da177e4SLinus Torvalds * 1301da177e4SLinus Torvalds * Accomplish this in a non-GENERIC kernel by ifdef'ing out all but 1311da177e4SLinus Torvalds * one of the vectors, which will not reside in .init.data. We then 1321da177e4SLinus Torvalds * alias this one vector to alpha_mv, so no copy is needed. 1331da177e4SLinus Torvalds * 1341da177e4SLinus Torvalds * Upshot: set __initdata to nothing for non-GENERIC kernels. 1351da177e4SLinus Torvalds */ 1361da177e4SLinus Torvalds 1371da177e4SLinus Torvalds #ifdef CONFIG_ALPHA_GENERIC 1381da177e4SLinus Torvalds #define __initmv __initdata 1391da177e4SLinus Torvalds #define ALIAS_MV(x) 1401da177e4SLinus Torvalds #else 141bd721ea7SFabian Frederick #define __initmv __refdata 1421da177e4SLinus Torvalds 1431da177e4SLinus Torvalds /* GCC actually has a syntax for defining aliases, but is under some 1441da177e4SLinus Torvalds delusion that you shouldn't be able to declare it extern somewhere 1451da177e4SLinus Torvalds else beforehand. Fine. We'll do it ourselves. */ 1461da177e4SLinus Torvalds #if 0 1471da177e4SLinus Torvalds #define ALIAS_MV(system) \ 14800fc0e0dSAl Viro struct alpha_machine_vector alpha_mv __attribute__((alias(#system "_mv"))); \ 14900fc0e0dSAl Viro EXPORT_SYMBOL(alpha_mv); 1501da177e4SLinus Torvalds #else 1511da177e4SLinus Torvalds #define ALIAS_MV(system) \ 15200fc0e0dSAl Viro asm(".global alpha_mv\nalpha_mv = " #system "_mv"); \ 15300fc0e0dSAl Viro EXPORT_SYMBOL(alpha_mv); 1541da177e4SLinus Torvalds #endif 1551da177e4SLinus Torvalds #endif /* GENERIC */ 156