summaryrefslogtreecommitdiff
path: root/sys/arch/alpha/include/prom.h
blob: 680d8908b886d0e6f32f8db3fbc7557ee20c8d3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* $NetBSD: prom.h,v 1.16 2020/10/03 17:31:46 thorpej Exp $ */

/*
 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
 * All rights reserved.
 *
 * Author: Keith Bostic, Chris G. Demetriou
 *
 * Permission to use, copy, modify and distribute this software and
 * its documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie the
 * rights to redistribute these changes.
 */

#ifndef	ASSEMBLER
struct prom_vec {
	uint64_t	routine;
	void		*routine_arg;
};

/* The return value from a prom call. */
typedef union {
	struct {
		uint64_t
			retval	: 32,		/* return value. */
			unit	: 8,
			mbz	: 8,
			error	: 13,
			status	: 3;
	} u;
	uint64_t bits;
} prom_return_t;

/* Linux kernel parameter block filled out by Qemu. */
struct linux_kernel_params {
	char		kernel_cmdline[256];
	uint64_t	initrd_base;
	uint64_t	initrd_size;
};

#ifdef _STANDALONE
int	getchar(void);
void	putchar(int);
#endif

void	prom_halt(int) __attribute__((__noreturn__));
int	prom_getenv(int, char *, int);
bool	prom_qemu_getenv(const char *, char *, size_t);

void	hwrpb_primary_init(void);
void	hwrpb_restart_setup(void);
#endif

/* Prom operation values. */
#define	PROM_R_CLOSE		0x11
#define	PROM_R_GETC		0x01
#define	PROM_R_GETENV		0x22
#define	PROM_R_OPEN		0x10
#define	PROM_R_PUTS		0x02
#define	PROM_R_READ		0x13
#define	PROM_R_WRITE		0x14
#define	PROM_R_IOCTL		0x12

/* Prom IOCTL operation subcodes */
#define	PROM_I_SKIP2IRG		1
#define	PROM_I_SKIP2MARK	2
#define	PROM_I_REWIND		3
#define	PROM_I_WRITEMARK	4

/* Environment variable values. */
#define	PROM_E_BOOTED_DEV	0x4
#define	PROM_E_BOOTED_FILE	0x6
#define	PROM_E_BOOTED_OSFLAGS	0x8
#define	PROM_E_TTY_DEV		0xf
#define	PROM_E_SCSIID		0x42
#define	PROM_E_SCSIFAST		0x43

#if defined(_STANDALONE) || defined(ENABLEPROM)
/*
 * These can't be called from the kernel without great care.
 *
 * There have to be stub routines to do the copying that ensures that the
 * PROM doesn't get called with an address larger than 32 bits.  Calls that
 * either don't need to copy anything, or don't need the copy because it's
 * already being done elsewhere, are defined here.
 */
#define	prom_open(dev, len)						\
	prom_dispatch(PROM_R_OPEN, (dev), (len), 0, 0)
#define	prom_close(chan)						\
	prom_dispatch(PROM_R_CLOSE, chan, 0, 0, 0)
#define	prom_read(chan, len, buf, blkno)				\
	prom_dispatch(PROM_R_READ, chan, len, (uint64_t)buf, blkno)
#define	prom_write(chan, len, buf, blkno)				\
	prom_dispatch(PROM_R_WRITE, chan, len, (uint64_t)buf, blkno)
#define	prom_ioctl(chan, op, count)					\
	prom_dispatch(PROM_R_IOCTL, chan, op, (int64_t)count, 0, 0)
#define	prom_putstr(chan, str, len)					\
	prom_dispatch(PROM_R_PUTS, chan, (uint64_t)str, len, 0)
#define	prom_getc(chan)							\
	prom_dispatch(PROM_R_GETC, chan, 0, 0, 0)
#define prom_getenv_disp(id, buf, len)					\
	prom_dispatch(PROM_R_GETENV, id, (uint64_t)buf, len, 0)
#endif

#ifndef ASSEMBLER
#ifdef _KERNEL

#ifdef _KERNEL_OPT
#include "opt_dec_kn8ae.h"

#if defined(DEC_KN8AE)
#define _PROM_MAY_USE_PROM_CONSOLE
#endif /* DEC_KN8AE */
#endif /* _KERNEL_OPT */

extern bool prom_interface_initialized;

bool	prom_uses_prom_console(void);

void	prom_enter(void);
void	prom_leave(void);

void	promcnputc(dev_t, int);
int	promcngetc(dev_t);
int	promcnlookc(dev_t, char *);

uint64_t	prom_dispatch(uint64_t, uint64_t, uint64_t, uint64_t,
		    uint64_t);
#endif /* _KERNEL */
#endif /* ASSEMBLER */