xref: /linux-6.15/arch/alpha/kernel/machvec_impl.h (revision a4184174)
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_EV5_MMU							\
48*a4184174SArnd Bergmann 	.max_asn =			EV5_MAX_ASN			\
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds #define DO_EV6_MMU							\
51*a4184174SArnd Bergmann 	.max_asn =			EV6_MAX_ASN			\
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds #define DO_EV7_MMU							\
54*a4184174SArnd Bergmann 	.max_asn =			EV6_MAX_ASN			\
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds #define IO_LITE(UP,low)							\
571da177e4SLinus Torvalds 	.hae_register =		(unsigned long *) CAT(UP,_HAE_ADDRESS),	\
581da177e4SLinus Torvalds 	.iack_sc =		CAT(UP,_IACK_SC),			\
591da177e4SLinus Torvalds 	.mv_ioread8 =		CAT(low,_ioread8),			\
601da177e4SLinus Torvalds 	.mv_ioread16 =		CAT(low,_ioread16),			\
611da177e4SLinus Torvalds 	.mv_ioread32 =		CAT(low,_ioread32),			\
62e19d4ebcSArnd Bergmann 	.mv_ioread64 =		CAT(low,_ioread64),			\
631da177e4SLinus Torvalds 	.mv_iowrite8 =		CAT(low,_iowrite8),			\
641da177e4SLinus Torvalds 	.mv_iowrite16 =		CAT(low,_iowrite16),			\
651da177e4SLinus Torvalds 	.mv_iowrite32 =		CAT(low,_iowrite32),			\
66e19d4ebcSArnd Bergmann 	.mv_iowrite64 =		CAT(low,_iowrite64),			\
671da177e4SLinus Torvalds 	.mv_readb =		CAT(low,_readb),			\
681da177e4SLinus Torvalds 	.mv_readw =		CAT(low,_readw),			\
691da177e4SLinus Torvalds 	.mv_readl =		CAT(low,_readl),			\
701da177e4SLinus Torvalds 	.mv_readq =		CAT(low,_readq),			\
711da177e4SLinus Torvalds 	.mv_writeb =		CAT(low,_writeb),			\
721da177e4SLinus Torvalds 	.mv_writew =		CAT(low,_writew),			\
731da177e4SLinus Torvalds 	.mv_writel =		CAT(low,_writel),			\
741da177e4SLinus Torvalds 	.mv_writeq =		CAT(low,_writeq),			\
751da177e4SLinus Torvalds 	.mv_ioportmap =		CAT(low,_ioportmap),			\
761da177e4SLinus Torvalds 	.mv_ioremap =		CAT(low,_ioremap),			\
771da177e4SLinus Torvalds 	.mv_iounmap =		CAT(low,_iounmap),			\
781da177e4SLinus Torvalds 	.mv_is_ioaddr =		CAT(low,_is_ioaddr),			\
791da177e4SLinus Torvalds 	.mv_is_mmio =		CAT(low,_is_mmio)			\
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds #define IO(UP,low)							\
821da177e4SLinus Torvalds 	IO_LITE(UP,low),						\
831da177e4SLinus Torvalds 	.pci_ops =		&CAT(low,_pci_ops),			\
841da177e4SLinus Torvalds 	.mv_pci_tbi =		CAT(low,_pci_tbi)
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds #define DO_APECS_IO	IO(APECS,apecs)
871da177e4SLinus Torvalds #define DO_CIA_IO	IO(CIA,cia)
881da177e4SLinus Torvalds #define DO_IRONGATE_IO	IO(IRONGATE,irongate)
891da177e4SLinus Torvalds #define DO_LCA_IO	IO(LCA,lca)
901da177e4SLinus Torvalds #define DO_MARVEL_IO	IO(MARVEL,marvel)
911da177e4SLinus Torvalds #define DO_MCPCIA_IO	IO(MCPCIA,mcpcia)
921da177e4SLinus Torvalds #define DO_POLARIS_IO	IO(POLARIS,polaris)
931da177e4SLinus Torvalds #define DO_T2_IO	IO(T2,t2)
941da177e4SLinus Torvalds #define DO_TSUNAMI_IO	IO(TSUNAMI,tsunami)
951da177e4SLinus Torvalds #define DO_TITAN_IO	IO(TITAN,titan)
961da177e4SLinus Torvalds #define DO_WILDFIRE_IO	IO(WILDFIRE,wildfire)
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds #define DO_PYXIS_IO	IO_LITE(CIA,cia_bwx), \
991da177e4SLinus Torvalds 			.pci_ops = &cia_pci_ops, \
1001da177e4SLinus Torvalds 			.mv_pci_tbi = cia_pci_tbi
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds /*
1031da177e4SLinus Torvalds  * In a GENERIC kernel, we have lots of these vectors floating about,
1041da177e4SLinus Torvalds  * all but one of which we want to go away.  In a non-GENERIC kernel,
1051da177e4SLinus Torvalds  * we want only one, ever.
1061da177e4SLinus Torvalds  *
1071da177e4SLinus Torvalds  * Accomplish this in the GENERIC kernel by putting all of the vectors
1081da177e4SLinus Torvalds  * in the .init.data section where they'll go away.  We'll copy the
1091da177e4SLinus Torvalds  * one we want to the real alpha_mv vector in setup_arch.
1101da177e4SLinus Torvalds  *
1111da177e4SLinus Torvalds  * Accomplish this in a non-GENERIC kernel by ifdef'ing out all but
1121da177e4SLinus Torvalds  * one of the vectors, which will not reside in .init.data.  We then
1131da177e4SLinus Torvalds  * alias this one vector to alpha_mv, so no copy is needed.
1141da177e4SLinus Torvalds  *
1151da177e4SLinus Torvalds  * Upshot: set __initdata to nothing for non-GENERIC kernels.
1161da177e4SLinus Torvalds  */
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds #ifdef CONFIG_ALPHA_GENERIC
1191da177e4SLinus Torvalds #define __initmv __initdata
1201da177e4SLinus Torvalds #define ALIAS_MV(x)
1211da177e4SLinus Torvalds #else
122bd721ea7SFabian Frederick #define __initmv __refdata
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds /* GCC actually has a syntax for defining aliases, but is under some
1251da177e4SLinus Torvalds    delusion that you shouldn't be able to declare it extern somewhere
1261da177e4SLinus Torvalds    else beforehand.  Fine.  We'll do it ourselves.  */
1271da177e4SLinus Torvalds #if 0
1281da177e4SLinus Torvalds #define ALIAS_MV(system) \
12900fc0e0dSAl Viro   struct alpha_machine_vector alpha_mv __attribute__((alias(#system "_mv"))); \
13000fc0e0dSAl Viro   EXPORT_SYMBOL(alpha_mv);
1311da177e4SLinus Torvalds #else
1321da177e4SLinus Torvalds #define ALIAS_MV(system) \
13300fc0e0dSAl Viro   asm(".global alpha_mv\nalpha_mv = " #system "_mv"); \
13400fc0e0dSAl Viro   EXPORT_SYMBOL(alpha_mv);
1351da177e4SLinus Torvalds #endif
1361da177e4SLinus Torvalds #endif /* GENERIC */
137