1/*
2 * Copyright 2006, Marcus Overhagen <marcus@overhagen.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#ifndef _PXE_UNDI_H
7#define _PXE_UNDI_H
8
9extern "C" uint16 call_pxe_bios(void *pxe, uint16 opcode, void *param);
10
11#define UNDI_OPEN				0x0006
12#define UNDI_TRANSMIT			0x0008
13#define UNDI_GET_INFORMATION	0x000C
14#define UNDI_ISR				0x0014
15#define UNDI_GET_STATE			0x0015
16
17#define	TFTP_OPEN				0x0020
18#define	TFTP_CLOSE				0x0021
19#define	TFTP_READ				0x0022
20#define	TFTP_GET_FILE_SIZE		0x0025
21
22#define GET_CACHED_INFO			0x0071
23
24#define SEG(ptr)	((uint16)(((uint32)(ptr)) >> 4))
25#define OFS(ptr)	((uint16)(((uint32)(ptr)) & 15))
26
27#define MAC_ADDR_LEN 16
28typedef uint8 MAC_ADDR[MAC_ADDR_LEN];
29
30struct SEGSEL
31{
32	uint16 a;
33};
34
35struct SEGOFF16
36{
37	uint16 ofs;
38	uint16 seg;
39};
40
41struct SEGDESC
42{
43	uint64 a;
44};
45
46struct PXE_STRUCT
47{
48	uint32	Signature;
49	uint8	StructLength;
50	uint8	StructCksum;
51	uint8	StructRev;
52	uint8	reserved_1;
53  	SEGOFF16 UNDIROMID;
54	SEGOFF16 BaseROMID;
55	SEGOFF16 EntryPointSP;
56	SEGOFF16 EntryPointESP;
57	SEGOFF16 StatusCallout;
58	uint8	reserved_2;
59	uint8	SegDescCnt;
60	SEGSEL	FirstSelector;
61	SEGDESC	Stack;
62	SEGDESC	UNDIData;
63	SEGDESC	UNDICode;
64	SEGDESC	UNDICodeWrite;
65	SEGDESC	BC_Data;
66	SEGDESC	BC_Code;
67	SEGDESC	BC_CodeWrite;
68};
69
70struct PXENV_GET_CACHED_INFO
71{
72	uint16	Status;
73	uint16	PacketType;
74	#define PXENV_PACKET_TYPE_DHCP_DISCOVER 1
75	#define PXENV_PACKET_TYPE_DHCP_ACK      2
76	#define PXENV_PACKET_TYPE_CACHED_REPLY  3
77	uint16	BufferSize;
78	SEGOFF16 Buffer;
79	uint16	BufferLimit;
80};
81
82struct PXENV_UNDI_MCAST_ADDRESS
83{
84	#define MAXNUM_MCADDR       8
85	uint16	MCastAddrCount;
86	MAC_ADDR McastAddr[MAXNUM_MCADDR];
87};
88
89struct PXENV_UNDI_OPEN
90{
91	uint16	Status;
92	uint16	OpenFlag;
93	uint16	PktFilter;
94	#define FLTR_DIRECTED  0x0001
95	#define FLTR_BRDCST    0x0002
96	#define FLTR_PRMSCS    0x0004
97	#define FLTR_SRC_RTG   0x0008
98	PXENV_UNDI_MCAST_ADDRESS R_Mcast_Buf;
99};
100
101struct PXENV_UNDI_GET_STATE
102{
103	#define PXE_UNDI_GET_STATE_STARTED     1
104	#define PXE_UNDI_GET_STATE_INITIALIZED 2
105	#define PXE_UNDI_GET_STATE_OPENED      3
106	uint16	Status;
107	uint8	UNDIstate;
108};
109
110struct PXENV_UNDI_GET_INFORMATION
111{
112	uint16	Status;
113	uint16	BaseIo;
114	uint16	IntNumber;
115	uint16	MaxTranUnit;
116	uint16	HwType;
117	#define ETHER_TYPE      1
118	#define EXP_ETHER_TYPE	2
119	#define IEEE_TYPE       6
120	#define ARCNET_TYPE     7
121	uint16	HwAddrLen;
122	MAC_ADDR CurrentNodeAddress;
123	MAC_ADDR PermNodeAddress;
124	SEGSEL	ROMAddress;
125	uint16	RxBufCt;
126	uint16	TxBufCt;
127};
128
129struct PXENV_UNDI_TRANSMIT
130{
131	uint16	Status;
132	uint8	Protocol;
133	#define P_UNKNOWN	0
134	#define P_IP		1
135	#define P_ARP		2
136	#define P_RARP		3
137	uint8	XmitFlag;
138	#define XMT_DESTADDR   0x0000
139	#define XMT_BROADCAST  0x0001
140	SEGOFF16 DestAddr;
141	SEGOFF16 TBD;
142	uint32 Reserved[2];
143};
144
145#define MAX_DATA_BLKS   8
146struct PXENV_UNDI_TBD
147{
148	uint16	ImmedLength;
149	SEGOFF16 Xmit;
150	uint16	DataBlkCount;
151	struct DataBlk
152	{
153		uint8	TDPtrType;
154		uint8	TDRsvdByte;
155		uint16	TDDataLen;
156    	SEGOFF16 TDDataPtr;
157	} DataBlock[MAX_DATA_BLKS];
158};
159
160struct PXENV_UNDI_ISR
161{
162	uint16	Status;
163	uint16	FuncFlag;
164	uint16	BufferLength;
165	uint16	FrameLength;
166	uint16	FrameHeaderLength;
167	SEGOFF16 Frame;
168	uint8	ProtType;
169	uint8	PktType;
170};
171
172#define PXENV_UNDI_ISR_IN_START		1
173#define PXENV_UNDI_ISR_IN_PROCESS	2
174#define PXENV_UNDI_ISR_IN_GET_NEXT	3
175
176/* One of these will be returned for
177	PXENV_UNDI_ISR_IN_START
178*/
179#define PXENV_UNDI_ISR_OUT_OURS		0
180#define PXENV_UNDI_USR_OUT_NOT_OURS	1
181
182/* One of these will be returned for
183	PXENV_UNDI_ISR_IN_PROCESS and
184	PXENV_UNDI_ISR_IN_GET_NEXT
185*/
186#define PXENV_UNDI_ISR_OUT_DONE      0
187#define PXENV_UNDI_ISR_OUT_TRANSMIT  2
188#define PXENV_UNDI_ISR_OUT_RECEIVE   3
189#define PXENV_UNDI_ISR_OUT_BUSY      4
190
191
192typedef union {
193	uint32	num;
194	uint8	array[4];
195} pxenv_ip4;
196
197struct pxenv_tftp_open {
198	uint16		status;
199	pxenv_ip4	server_ip;
200	pxenv_ip4	gateway_ip;
201	char		file_name[128];
202	uint16		port;
203	uint16		packet_size;
204} __attribute__((packed));
205
206struct pxenv_tftp_close {
207	uint16		status;
208} __attribute__((packed));
209
210struct pxenv_tftp_read {
211	uint16		status;
212	uint16		packet_number;
213	uint16		buffer_size;
214	SEGOFF16	buffer;
215} __attribute__((packed));
216
217struct pxenv_tftp_get_fsize {
218	uint16		status;
219	pxenv_ip4	server_ip;
220	pxenv_ip4	gateway_ip;
221	char		file_name[128];
222	uint32		file_size;
223} __attribute__((packed));
224
225
226PXE_STRUCT * pxe_undi_find_data();
227
228#endif
229