18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *	include/asm-mips/dec/prom.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *	DECstation PROM interface.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *	Copyright (C) 2002  Maciej W. Rozycki
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci *	Based on arch/mips/dec/prom/prom.h by the Anonymous.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci#ifndef _ASM_DEC_PROM_H
128c2ecf20Sopenharmony_ci#define _ASM_DEC_PROM_H
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <linux/types.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <asm/addrspace.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/*
198c2ecf20Sopenharmony_ci * PMAX/3MAX PROM entry points for DS2100/3100's and DS5000/2xx's.
208c2ecf20Sopenharmony_ci * Many of these will work for MIPSen as well!
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_ci#define VEC_RESET		(u64 *)CKSEG1ADDR(0x1fc00000)
238c2ecf20Sopenharmony_ci							/* Prom base address */
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define PMAX_PROM_ENTRY(x)	(VEC_RESET + (x))	/* Prom jump table */
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#define PMAX_PROM_HALT		PMAX_PROM_ENTRY(2)	/* valid on MIPSen */
288c2ecf20Sopenharmony_ci#define PMAX_PROM_AUTOBOOT	PMAX_PROM_ENTRY(5)	/* valid on MIPSen */
298c2ecf20Sopenharmony_ci#define PMAX_PROM_OPEN		PMAX_PROM_ENTRY(6)
308c2ecf20Sopenharmony_ci#define PMAX_PROM_READ		PMAX_PROM_ENTRY(7)
318c2ecf20Sopenharmony_ci#define PMAX_PROM_CLOSE		PMAX_PROM_ENTRY(10)
328c2ecf20Sopenharmony_ci#define PMAX_PROM_LSEEK		PMAX_PROM_ENTRY(11)
338c2ecf20Sopenharmony_ci#define PMAX_PROM_GETCHAR	PMAX_PROM_ENTRY(12)
348c2ecf20Sopenharmony_ci#define PMAX_PROM_PUTCHAR	PMAX_PROM_ENTRY(13)	/* 12 on MIPSen */
358c2ecf20Sopenharmony_ci#define PMAX_PROM_GETS		PMAX_PROM_ENTRY(15)
368c2ecf20Sopenharmony_ci#define PMAX_PROM_PRINTF	PMAX_PROM_ENTRY(17)
378c2ecf20Sopenharmony_ci#define PMAX_PROM_GETENV	PMAX_PROM_ENTRY(33)	/* valid on MIPSen */
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/*
418c2ecf20Sopenharmony_ci * Magic number indicating REX PROM available on DECstation.  Found in
428c2ecf20Sopenharmony_ci * register a2 on transfer of control to program from PROM.
438c2ecf20Sopenharmony_ci */
448c2ecf20Sopenharmony_ci#define REX_PROM_MAGIC		0x30464354
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci/* KN04 and KN05 are REX PROMs, so only do the check for R3k systems.  */
478c2ecf20Sopenharmony_cistatic inline bool prom_is_rex(u32 magic)
488c2ecf20Sopenharmony_ci{
498c2ecf20Sopenharmony_ci	return !IS_ENABLED(CONFIG_CPU_R3000) || magic == REX_PROM_MAGIC;
508c2ecf20Sopenharmony_ci}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci/*
538c2ecf20Sopenharmony_ci * 3MIN/MAXINE PROM entry points for DS5000/1xx's, DS5000/xx's and
548c2ecf20Sopenharmony_ci * DS5000/2x0.
558c2ecf20Sopenharmony_ci */
568c2ecf20Sopenharmony_ci#define REX_PROM_GETBITMAP	0x84/4	/* get mem bitmap */
578c2ecf20Sopenharmony_ci#define REX_PROM_GETCHAR	0x24/4	/* getch() */
588c2ecf20Sopenharmony_ci#define REX_PROM_GETENV		0x64/4	/* get env. variable */
598c2ecf20Sopenharmony_ci#define REX_PROM_GETSYSID	0x80/4	/* get system id */
608c2ecf20Sopenharmony_ci#define REX_PROM_GETTCINFO	0xa4/4
618c2ecf20Sopenharmony_ci#define REX_PROM_PRINTF		0x30/4	/* printf() */
628c2ecf20Sopenharmony_ci#define REX_PROM_SLOTADDR	0x6c/4	/* slotaddr */
638c2ecf20Sopenharmony_ci#define REX_PROM_BOOTINIT	0x54/4	/* open() */
648c2ecf20Sopenharmony_ci#define REX_PROM_BOOTREAD	0x58/4	/* read() */
658c2ecf20Sopenharmony_ci#define REX_PROM_CLEARCACHE	0x7c/4
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci/*
698c2ecf20Sopenharmony_ci * Used by rex_getbitmap().
708c2ecf20Sopenharmony_ci */
718c2ecf20Sopenharmony_citypedef struct {
728c2ecf20Sopenharmony_ci	int pagesize;
738c2ecf20Sopenharmony_ci	unsigned char bitmap[];
748c2ecf20Sopenharmony_ci} memmap;
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci/*
788c2ecf20Sopenharmony_ci * Function pointers as read from a PROM's callback vector.
798c2ecf20Sopenharmony_ci */
808c2ecf20Sopenharmony_ciextern int (*__rex_bootinit)(void);
818c2ecf20Sopenharmony_ciextern int (*__rex_bootread)(void);
828c2ecf20Sopenharmony_ciextern int (*__rex_getbitmap)(memmap *);
838c2ecf20Sopenharmony_ciextern unsigned long *(*__rex_slot_address)(int);
848c2ecf20Sopenharmony_ciextern void *(*__rex_gettcinfo)(void);
858c2ecf20Sopenharmony_ciextern int (*__rex_getsysid)(void);
868c2ecf20Sopenharmony_ciextern void (*__rex_clear_cache)(void);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ciextern int (*__prom_getchar)(void);
898c2ecf20Sopenharmony_ciextern char *(*__prom_getenv)(char *);
908c2ecf20Sopenharmony_ciextern int (*__prom_printf)(char *, ...);
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ciextern int (*__pmax_open)(char*, int);
938c2ecf20Sopenharmony_ciextern int (*__pmax_lseek)(int, long, int);
948c2ecf20Sopenharmony_ciextern int (*__pmax_read)(int, void *, int);
958c2ecf20Sopenharmony_ciextern int (*__pmax_close)(int);
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci/*
1018c2ecf20Sopenharmony_ci * On MIPS64 we have to call PROM functions via a helper
1028c2ecf20Sopenharmony_ci * dispatcher to accommodate ABI incompatibilities.
1038c2ecf20Sopenharmony_ci */
1048c2ecf20Sopenharmony_ci#define __DEC_PROM_O32(fun, arg) fun arg __asm__(#fun); \
1058c2ecf20Sopenharmony_ci				 __asm__(#fun " = call_o32")
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_rex_bootinit, (int (*)(void), void *));
1088c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_rex_bootread, (int (*)(void), void *));
1098c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_rex_getbitmap, (int (*)(memmap *), void *, memmap *));
1108c2ecf20Sopenharmony_ciunsigned long *__DEC_PROM_O32(_rex_slot_address,
1118c2ecf20Sopenharmony_ci			     (unsigned long *(*)(int), void *, int));
1128c2ecf20Sopenharmony_civoid *__DEC_PROM_O32(_rex_gettcinfo, (void *(*)(void), void *));
1138c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_rex_getsysid, (int (*)(void), void *));
1148c2ecf20Sopenharmony_civoid __DEC_PROM_O32(_rex_clear_cache, (void (*)(void), void *));
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_prom_getchar, (int (*)(void), void *));
1178c2ecf20Sopenharmony_cichar *__DEC_PROM_O32(_prom_getenv, (char *(*)(char *), void *, char *));
1188c2ecf20Sopenharmony_ciint __DEC_PROM_O32(_prom_printf, (int (*)(char *, ...), void *, char *, ...));
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci#define rex_bootinit()		_rex_bootinit(__rex_bootinit, NULL)
1228c2ecf20Sopenharmony_ci#define rex_bootread()		_rex_bootread(__rex_bootread, NULL)
1238c2ecf20Sopenharmony_ci#define rex_getbitmap(x)	_rex_getbitmap(__rex_getbitmap, NULL, x)
1248c2ecf20Sopenharmony_ci#define rex_slot_address(x)	_rex_slot_address(__rex_slot_address, NULL, x)
1258c2ecf20Sopenharmony_ci#define rex_gettcinfo()		_rex_gettcinfo(__rex_gettcinfo, NULL)
1268c2ecf20Sopenharmony_ci#define rex_getsysid()		_rex_getsysid(__rex_getsysid, NULL)
1278c2ecf20Sopenharmony_ci#define rex_clear_cache()	_rex_clear_cache(__rex_clear_cache, NULL)
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci#define prom_getchar()		_prom_getchar(__prom_getchar, NULL)
1308c2ecf20Sopenharmony_ci#define prom_getenv(x)		_prom_getenv(__prom_getenv, NULL, x)
1318c2ecf20Sopenharmony_ci#define prom_printf(x...)	_prom_printf(__prom_printf, NULL, x)
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci#else /* !CONFIG_64BIT */
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci/*
1368c2ecf20Sopenharmony_ci * On plain MIPS we just call PROM functions directly.
1378c2ecf20Sopenharmony_ci */
1388c2ecf20Sopenharmony_ci#define rex_bootinit		__rex_bootinit
1398c2ecf20Sopenharmony_ci#define rex_bootread		__rex_bootread
1408c2ecf20Sopenharmony_ci#define rex_getbitmap		__rex_getbitmap
1418c2ecf20Sopenharmony_ci#define rex_slot_address	__rex_slot_address
1428c2ecf20Sopenharmony_ci#define rex_gettcinfo		__rex_gettcinfo
1438c2ecf20Sopenharmony_ci#define rex_getsysid		__rex_getsysid
1448c2ecf20Sopenharmony_ci#define rex_clear_cache		__rex_clear_cache
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci#define prom_getchar		__prom_getchar
1478c2ecf20Sopenharmony_ci#define prom_getenv		__prom_getenv
1488c2ecf20Sopenharmony_ci#define prom_printf		__prom_printf
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ci#define pmax_open		__pmax_open
1518c2ecf20Sopenharmony_ci#define pmax_lseek		__pmax_lseek
1528c2ecf20Sopenharmony_ci#define pmax_read		__pmax_read
1538c2ecf20Sopenharmony_ci#define pmax_close		__pmax_close
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci#endif /* !CONFIG_64BIT */
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ciextern void prom_meminit(u32);
1598c2ecf20Sopenharmony_ciextern void prom_identify_arch(u32);
1608c2ecf20Sopenharmony_ciextern void prom_init_cmdline(s32, s32 *, u32);
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ciextern void register_prom_console(void);
1638c2ecf20Sopenharmony_ciextern void unregister_prom_console(void);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci#endif /* _ASM_DEC_PROM_H */
166