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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
|
/* $OpenBSD: pmon.h,v 1.5 2017/05/21 13:00:53 visa Exp $ */
/*
* Copyright (c) 2009, 2012 Miodrag Vallat.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _MACHINE_PMON_H_
#define _MACHINE_PMON_H_
#if defined(_KERNEL) || defined(_STANDALONE)
/*
* PMON2000 callvec definitions
*/
/* 32-bit compatible types */
typedef uint32_t pmon_size_t;
typedef int32_t pmon_ssize_t;
typedef int64_t pmon_off_t;
int pmon_open(const char *, int, ...);
int pmon_close(int);
int pmon_read(int, void *, pmon_size_t);
pmon_ssize_t pmon_write(int, const void *, pmon_size_t);
pmon_off_t pmon_lseek(int, pmon_off_t, int);
int pmon_printf(const char *, ...);
void pmon_cacheflush(void);
char * pmon_gets(char *);
#define PMON_MAXLN 256 /* internal gets() size limit */
extern int32_t pmon_callvec;
const char *pmon_getarg(const int);
void pmon_init(int32_t, int32_t, int32_t, int32_t, uint32_t);
#define PMON_ENVTYPE_ENVP 0
#define PMON_ENVTYPE_EFI 1
int pmon_getenvtype(void);
/*
* The new environment interface is a /salmigondis/ of badly thought-out
* structs put together, pretending to be inspired by EFI but conveniently
* omitting key EFI structs because they are deemed non-applicable to
* MIPS systems.
* Of course, some fields are absolute addresses, while others are relative
* pointers, to add to the confusion.
*/
struct pmon_env_reset {
void (*cold_boot)(void); /* not filled */
void (*warm_boot)(void);
void (*boot)(unsigned int); /* not filled */
void (*poweroff)(void);
};
/* all values are offsets relative to the beginning of the struct */
struct pmon_env_ptr {
uint64_t offs_mem;
uint64_t offs_cpu;
uint64_t offs_sys;
uint64_t offs_irq;
uint64_t offs_iface;
uint64_t offs_special;
uint64_t offs_device;
};
struct pmon_env_smbios {
uint16_t version;
uint64_t vga_bios;
struct pmon_env_ptr ptrs;
};
struct pmon_env_efi {
uint64_t mps; /* not filled */
uint64_t acpi; /* not filled */
uint64_t acpi20; /* not filled */
struct pmon_env_smbios bios;
uint64_t sal_systab; /* not filled */
uint64_t bootinfo; /* not filled */
};
struct pmon_env {
struct pmon_env_efi efi;
struct pmon_env_reset reset;
};
#define PMON_MEM_MAX 128
struct pmon_env_mem_entry {
uint32_t node;
uint32_t type;
#define PMON_MEM_SYSTEM_LOW 1 /* physical memory <= 256 MB */
#define PMON_MEM_SYSTEM_HIGH 2 /* physical memory > 256 MB */
#define PMON_MEM_RESERVED 3
#define PMON_MEM_PCI_IO 4
#define PMON_MEM_PCI_MEM 5
#define PMON_MEM_CPU_REGISTERS 6
#define PMON_MEM_VIDEO_ROM 7
#define PMON_MEM_OTHER_ROM 8
#define PMON_MEM_ACPI_TABLE 9
uint64_t address;
uint32_t size;
};
struct pmon_env_mem {
uint16_t version; /* not filled */
uint32_t nentries;
uint32_t mem_freq;
struct pmon_env_mem_entry mem_map[PMON_MEM_MAX];
} __packed;
struct pmon_env_cpu {
uint16_t version; /* not filled */
uint32_t prid; /* cop0 PrID */
uint32_t cputype;
/* 0 and 1 are supposedly intended for 2E and 2F, which do NOT provide this
interface; moreover Linux and PMON disagree on the values and have 2E and
2F swapped. */
#define PMON_CPUTYPE_LS3A 2
#define PMON_CPUTYPE_LS3B 3
#define PMON_CPUTYPE_LS1A 4
#define PMON_CPUTYPE_LS1B 5
uint32_t node; /* total number of NUMA nodes */
uint16_t coreid; /* boot CPU core id */
uint16_t reserved_cores; /* mask of reserved cores */
uint32_t speed;
uint32_t ncpus;
} __packed;
struct pmon_env_sys {
uint16_t version; /* not filled */
uint32_t ccnuma_smp;
uint32_t double_channel;
} __packed;
struct pmon_env_irq {
uint16_t version; /* not filled */
uint16_t size; /* not filled */
uint16_t rtr_bus; /* not filled */
uint16_t rtr_devfn; /* not filled */
uint32_t vendor; /* not filled */
uint32_t device; /* not filled */
uint32_t pic_type;
#define PMON_IRQ_PIC_HT 0
#define PMON_IRQ_PIC_I8259 1
uint64_t ht_interrupt_bit;
uint64_t ht_enable;
uint32_t node;
uint64_t pci_memory_space_start;
uint64_t pci_memory_space_end;
uint64_t pci_io_space_start; /* not filled */
uint64_t pci_io_space_end; /* not filled */
uint64_t pci_cfg_space; /* not filled */
} __packed;
struct pmon_env_iface {
uint16_t version;
#define PMON_IFACE_VERSION 0x0001
uint16_t size;
uint8_t flag;
char description[64]; /* firmware version */
} __packed;
#define PMON_RESOURCE_MAX 128
struct pmon_env_resource {
uint64_t start;
uint64_t end;
char name[64];
uint32_t flags;
};
struct pmon_env_special {
uint16_t version;
char name[64];
uint32_t type;
struct pmon_env_resource resource[PMON_RESOURCE_MAX];
};
struct pmon_env_device {
char name[64]; /* system description */
uint32_t nentries;
struct pmon_env_resource resource[PMON_RESOURCE_MAX];
};
const char *pmon_getenv(const char *);
const struct pmon_env_reset *pmon_get_env_reset(void);
const struct pmon_env_smbios *pmon_get_env_smbios(void);
const struct pmon_env_mem *pmon_get_env_mem(void);
const struct pmon_env_cpu *pmon_get_env_cpu(void);
const struct pmon_env_sys *pmon_get_env_sys(void);
const struct pmon_env_irq *pmon_get_env_irq(void);
const struct pmon_env_iface *pmon_get_env_iface(void);
const struct pmon_env_special *pmon_get_env_special(void);
const struct pmon_env_device *pmon_get_env_device(void);
#endif /* _KERNEL || _STANDALONE */
#endif /* _MACHINE_PMON_H_ */
|