162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * misc.c:  Miscellaneous prom functions that don't belong
462306a36Sopenharmony_ci *          anywhere else.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci#include <linux/sched.h>
1262306a36Sopenharmony_ci#include <asm/sun3-head.h>
1362306a36Sopenharmony_ci#include <asm/idprom.h>
1462306a36Sopenharmony_ci#include <asm/openprom.h>
1562306a36Sopenharmony_ci#include <asm/oplib.h>
1662306a36Sopenharmony_ci#include <asm/movs.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Reset and reboot the machine with the command 'bcommand'. */
1962306a36Sopenharmony_civoid
2062306a36Sopenharmony_ciprom_reboot(char *bcommand)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	unsigned long flags;
2362306a36Sopenharmony_ci	local_irq_save(flags);
2462306a36Sopenharmony_ci	(*(romvec->pv_reboot))(bcommand);
2562306a36Sopenharmony_ci	local_irq_restore(flags);
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* Drop into the prom, with the chance to continue with the 'go'
2962306a36Sopenharmony_ci * prom command.
3062306a36Sopenharmony_ci */
3162306a36Sopenharmony_civoid
3262306a36Sopenharmony_ciprom_cmdline(void)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Drop into the prom, but completely terminate the program.
3762306a36Sopenharmony_ci * No chance of continuing.
3862306a36Sopenharmony_ci */
3962306a36Sopenharmony_civoid
4062306a36Sopenharmony_ciprom_halt(void)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	unsigned long flags;
4362306a36Sopenharmony_ciagain:
4462306a36Sopenharmony_ci	local_irq_save(flags);
4562306a36Sopenharmony_ci	(*(romvec->pv_halt))();
4662306a36Sopenharmony_ci	local_irq_restore(flags);
4762306a36Sopenharmony_ci	goto again; /* PROM is out to get me -DaveM */
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_citypedef void (*sfunc_t)(void);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
5362306a36Sopenharmony_ci * format type.  'num_bytes' is the number of bytes that your idbuf
5462306a36Sopenharmony_ci * has space for.  Returns 0xff on error.
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_ciunsigned char
5762306a36Sopenharmony_ciprom_get_idprom(char *idbuf, int num_bytes)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	int i, oldsfc;
6062306a36Sopenharmony_ci	GET_SFC(oldsfc);
6162306a36Sopenharmony_ci	SET_SFC(FC_CONTROL);
6262306a36Sopenharmony_ci	for(i=0;i<num_bytes; i++)
6362306a36Sopenharmony_ci	{
6462306a36Sopenharmony_ci		/* There is a problem with the GET_CONTROL_BYTE
6562306a36Sopenharmony_ci		macro; defining the extra variable
6662306a36Sopenharmony_ci		gets around it.
6762306a36Sopenharmony_ci		*/
6862306a36Sopenharmony_ci		int c;
6962306a36Sopenharmony_ci		GET_CONTROL_BYTE(SUN3_IDPROM_BASE + i, c);
7062306a36Sopenharmony_ci		idbuf[i] = c;
7162306a36Sopenharmony_ci	}
7262306a36Sopenharmony_ci	SET_SFC(oldsfc);
7362306a36Sopenharmony_ci	return idbuf[0];
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Get the major prom version number. */
7762306a36Sopenharmony_ciint
7862306a36Sopenharmony_ciprom_version(void)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	return romvec->pv_romvers;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Get the prom plugin-revision. */
8462306a36Sopenharmony_ciint
8562306a36Sopenharmony_ciprom_getrev(void)
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	return prom_rev;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* Get the prom firmware print revision. */
9162306a36Sopenharmony_ciint
9262306a36Sopenharmony_ciprom_getprev(void)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	return prom_prev;
9562306a36Sopenharmony_ci}
96