xref: /openbsd-src/sys/dev/microcode/bnx/build.c (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
1 /*	$OpenBSD: build.c,v 1.4 2007/01/10 18:09:25 deraadt Exp $	*/
2 
3 /*
4  * Copyright (c) 2004 Theo de Raadt <deraadt@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 #include <sys/types.h>
19 #include <dev/pci/if_bnxreg.h>
20 #include <fcntl.h>
21 #include <stdlib.h>
22 #include <err.h>
23 #include <unistd.h>
24 #include <string.h>
25 #include <stdio.h>
26 
27 #include "bnxfw.h"
28 
29 int	bnx_rv2p_proc1len;
30 int	bnx_rv2p_proc2len;
31 
32 #define FILENAME "bnx"
33 
34 struct chunks {
35 	void *start;
36 	int *len;
37 } chunks[] = {
38 	{ bnx_COM_b06FwText, &bnx_COM_b06FwTextLen },
39 	{ bnx_COM_b06FwData, &bnx_COM_b06FwDataLen },
40 	{ bnx_COM_b06FwRodata, &bnx_COM_b06FwRodataLen },
41 	{ bnx_COM_b06FwBss, &bnx_COM_b06FwBssLen },
42 	{ bnx_COM_b06FwSbss, &bnx_COM_b06FwSbssLen },
43 
44 	{ bnx_RXP_b06FwText, &bnx_RXP_b06FwTextLen },
45 	{ bnx_RXP_b06FwData, &bnx_RXP_b06FwDataLen },
46 	{ bnx_RXP_b06FwRodata, &bnx_RXP_b06FwRodataLen },
47 	{ bnx_RXP_b06FwBss, &bnx_RXP_b06FwBssLen },
48 	{ bnx_RXP_b06FwSbss, &bnx_RXP_b06FwSbssLen },
49 
50 	{ bnx_TPAT_b06FwText, &bnx_TPAT_b06FwTextLen },
51 	{ bnx_TPAT_b06FwData, &bnx_TPAT_b06FwDataLen },
52 	{ bnx_TPAT_b06FwRodata, &bnx_TPAT_b06FwRodataLen },
53 	{ bnx_TPAT_b06FwBss, &bnx_TPAT_b06FwBssLen },
54 	{ bnx_TPAT_b06FwSbss, &bnx_TPAT_b06FwSbssLen },
55 
56 	{ bnx_TXP_b06FwText, &bnx_TXP_b06FwTextLen },
57 	{ bnx_TXP_b06FwData, &bnx_TXP_b06FwDataLen },
58 	{ bnx_TXP_b06FwRodata, &bnx_TXP_b06FwRodataLen },
59 	{ bnx_TXP_b06FwBss, &bnx_TXP_b06FwBssLen },
60 	{ bnx_TXP_b06FwSbss, &bnx_TXP_b06FwSbssLen },
61 
62 	{ bnx_rv2p_proc1, &bnx_rv2p_proc1len },
63 	{ bnx_rv2p_proc2, &bnx_rv2p_proc2len }
64 };
65 
66 void
67 hswapn(u_int32_t *p, int wcount)
68 {
69 	for (; wcount; wcount -=4) {
70 		*p = htonl(*p);
71 		p++;
72 	}
73 }
74 
75 int
76 main(int argc, char *argv[])
77 {
78 	struct	bnx_firmware_header bfproto, *bf;
79 	int fd, i, total;
80 	ssize_t rlen;
81 
82 	bnx_rv2p_proc1len = sizeof bnx_rv2p_proc1;
83 	bnx_rv2p_proc2len = sizeof bnx_rv2p_proc2;
84 
85 	bf = (struct bnx_firmware_header *)malloc(sizeof *bf);
86 	bzero(bf, sizeof *bf);
87 
88 	/* initialize the file header */
89 	bf->bnx_COM_b06FwReleaseMajor = htonl(bnx_COM_b06FwReleaseMajor);
90 	bf->bnx_COM_b06FwReleaseMinor = htonl(bnx_COM_b06FwReleaseMinor);
91 	bf->bnx_COM_b06FwReleaseFix = htonl(bnx_COM_b06FwReleaseFix);
92 	bf->bnx_COM_b06FwStartAddr = htonl(bnx_COM_b06FwStartAddr);
93 	bf->bnx_COM_b06FwTextAddr = htonl(bnx_COM_b06FwTextAddr);
94 	bf->bnx_COM_b06FwTextLen = htonl(bnx_COM_b06FwTextLen);
95 	bf->bnx_COM_b06FwDataAddr = htonl(bnx_COM_b06FwDataAddr);
96 	bf->bnx_COM_b06FwDataLen = htonl(bnx_COM_b06FwDataLen);
97 	bf->bnx_COM_b06FwRodataAddr = htonl(bnx_COM_b06FwRodataAddr);
98 	bf->bnx_COM_b06FwRodataLen = htonl(bnx_COM_b06FwRodataLen);
99 	bf->bnx_COM_b06FwBssAddr = htonl(bnx_COM_b06FwBssAddr);
100 	bf->bnx_COM_b06FwBssLen = htonl(bnx_COM_b06FwBssLen);
101 	bf->bnx_COM_b06FwSbssAddr = htonl(bnx_COM_b06FwSbssAddr);
102 	bf->bnx_COM_b06FwSbssLen = htonl(bnx_COM_b06FwSbssLen);
103 
104 	bf->bnx_RXP_b06FwReleaseMajor = htonl(bnx_RXP_b06FwReleaseMajor);
105 	bf->bnx_RXP_b06FwReleaseMinor = htonl(bnx_RXP_b06FwReleaseMinor);
106 	bf->bnx_RXP_b06FwReleaseFix = htonl(bnx_RXP_b06FwReleaseFix);
107 	bf->bnx_RXP_b06FwStartAddr = htonl(bnx_RXP_b06FwStartAddr);
108 	bf->bnx_RXP_b06FwTextAddr = htonl(bnx_RXP_b06FwTextAddr);
109 	bf->bnx_RXP_b06FwTextLen = htonl(bnx_RXP_b06FwTextLen);
110 	bf->bnx_RXP_b06FwDataAddr = htonl(bnx_RXP_b06FwDataAddr);
111 	bf->bnx_RXP_b06FwDataLen = htonl(bnx_RXP_b06FwDataLen);
112 	bf->bnx_RXP_b06FwRodataAddr = htonl(bnx_RXP_b06FwRodataAddr);
113 	bf->bnx_RXP_b06FwRodataLen = htonl(bnx_RXP_b06FwRodataLen);
114 	bf->bnx_RXP_b06FwBssAddr = htonl(bnx_RXP_b06FwBssAddr);
115 	bf->bnx_RXP_b06FwBssLen = htonl(bnx_RXP_b06FwBssLen);
116 	bf->bnx_RXP_b06FwSbssAddr = htonl(bnx_RXP_b06FwSbssAddr);
117 	bf->bnx_RXP_b06FwSbssLen = htonl(bnx_RXP_b06FwSbssLen);
118 
119 	bf->bnx_TPAT_b06FwReleaseMajor = htonl(bnx_TPAT_b06FwReleaseMajor);
120 	bf->bnx_TPAT_b06FwReleaseMinor = htonl(bnx_TPAT_b06FwReleaseMinor);
121 	bf->bnx_TPAT_b06FwReleaseFix = htonl(bnx_TPAT_b06FwReleaseFix);
122 	bf->bnx_TPAT_b06FwStartAddr = htonl(bnx_TPAT_b06FwStartAddr);
123 	bf->bnx_TPAT_b06FwTextAddr = htonl(bnx_TPAT_b06FwTextAddr);
124 	bf->bnx_TPAT_b06FwTextLen = htonl(bnx_TPAT_b06FwTextLen);
125 	bf->bnx_TPAT_b06FwDataAddr = htonl(bnx_TPAT_b06FwDataAddr);
126 	bf->bnx_TPAT_b06FwDataLen = htonl(bnx_TPAT_b06FwDataLen);
127 	bf->bnx_TPAT_b06FwRodataAddr = htonl(bnx_TPAT_b06FwRodataAddr);
128 	bf->bnx_TPAT_b06FwRodataLen = htonl(bnx_TPAT_b06FwRodataLen);
129 	bf->bnx_TPAT_b06FwBssAddr = htonl(bnx_TPAT_b06FwBssAddr);
130 	bf->bnx_TPAT_b06FwBssLen = htonl(bnx_TPAT_b06FwBssLen);
131 	bf->bnx_TPAT_b06FwSbssAddr = htonl(bnx_TPAT_b06FwSbssAddr);
132 	bf->bnx_TPAT_b06FwSbssLen = htonl(bnx_TPAT_b06FwSbssLen);
133 
134 	bf->bnx_TXP_b06FwReleaseMajor = htonl(bnx_TXP_b06FwReleaseMajor);
135 	bf->bnx_TXP_b06FwReleaseMinor = htonl(bnx_TXP_b06FwReleaseMinor);
136 	bf->bnx_TXP_b06FwReleaseFix = htonl(bnx_TXP_b06FwReleaseFix);
137 	bf->bnx_TXP_b06FwStartAddr = htonl(bnx_TXP_b06FwStartAddr);
138 	bf->bnx_TXP_b06FwTextAddr = htonl(bnx_TXP_b06FwTextAddr);
139 	bf->bnx_TXP_b06FwTextLen = htonl(bnx_TXP_b06FwTextLen);
140 	bf->bnx_TXP_b06FwDataAddr = htonl(bnx_TXP_b06FwDataAddr);
141 	bf->bnx_TXP_b06FwDataLen = htonl(bnx_TXP_b06FwDataLen);
142 	bf->bnx_TXP_b06FwRodataAddr = htonl(bnx_TXP_b06FwRodataAddr);
143 	bf->bnx_TXP_b06FwRodataLen = htonl(bnx_TXP_b06FwRodataLen);
144 	bf->bnx_TXP_b06FwBssAddr = htonl(bnx_TXP_b06FwBssAddr);
145 	bf->bnx_TXP_b06FwBssLen = htonl(bnx_TXP_b06FwBssLen);
146 	bf->bnx_TXP_b06FwSbssAddr = htonl(bnx_TXP_b06FwSbssAddr);
147 	bf->bnx_TXP_b06FwSbssLen = htonl(bnx_TXP_b06FwSbssLen);
148 
149 	bf->bnx_rv2p_proc1len = htonl(bnx_rv2p_proc1len);
150 	bf->bnx_rv2p_proc2len = htonl(bnx_rv2p_proc2len);
151 
152 	printf("creating %s", FILENAME);
153 	fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, 0644);
154 	if (fd == -1)
155 		err(1, FILENAME);
156 
157 	rlen = write(fd, bf, sizeof *bf);
158 	if (rlen == -1)
159 		err(1, "%s", FILENAME);
160 	if (rlen != sizeof *bf)
161 		errx(1, "%s: short write", FILENAME);
162 	total = rlen;
163 	printf(" [%d", total);
164 	fflush(stdout);
165 
166 	for (i = 0; i < sizeof(chunks) / sizeof(chunks[0]); i++) {
167 		hswapn(chunks[i].start, *chunks[i].len);
168 		rlen = write(fd, chunks[i].start, *chunks[i].len);
169 		if (rlen == -1) {
170 			printf("\n");
171 			err(1, "%s", FILENAME);
172 		}
173 		if (rlen != *chunks[i].len) {
174 			printf("\n");
175 			errx(1, "%s: short write", FILENAME);
176 		}
177 		printf("+%d", rlen);
178 		fflush(stdout);
179 		total += rlen;
180 	}
181 
182 	printf("] total %d\n", total);
183 
184 	free(bf);
185 	close(fd);
186 	return 0;
187 }
188