]>
Commit | Line | Data |
---|---|---|
d2c63fc1 BS |
1 | #ifndef FIRMWARE_ABI_H |
2 | #define FIRMWARE_ABI_H | |
3 | ||
d2c63fc1 BS |
4 | /* OpenBIOS NVRAM partition */ |
5 | struct OpenBIOS_nvpart_v1 { | |
6 | uint8_t signature; | |
7 | uint8_t checksum; | |
8 | uint16_t len; // BE, length divided by 16 | |
9 | char name[12]; | |
10 | }; | |
11 | ||
12 | #define OPENBIOS_PART_SYSTEM 0x70 | |
13 | #define OPENBIOS_PART_FREE 0x7f | |
14 | ||
15 | static inline void | |
16 | OpenBIOS_finish_partition(struct OpenBIOS_nvpart_v1 *header, uint32_t size) | |
17 | { | |
18 | unsigned int i, sum; | |
19 | uint8_t *tmpptr; | |
20 | ||
21 | // Length divided by 16 | |
22 | header->len = cpu_to_be16(size >> 4); | |
23 | ||
24 | // Checksum | |
25 | tmpptr = (uint8_t *)header; | |
26 | sum = *tmpptr; | |
27 | for (i = 0; i < 14; i++) { | |
28 | sum += tmpptr[2 + i]; | |
29 | sum = (sum + ((sum & 0xff00) >> 8)) & 0xff; | |
30 | } | |
31 | header->checksum = sum & 0xff; | |
32 | } | |
33 | ||
34 | static inline uint32_t | |
e7fb1406 | 35 | OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const char *str) |
d2c63fc1 BS |
36 | { |
37 | uint32_t len; | |
38 | ||
39 | len = strlen(str) + 1; | |
40 | memcpy(&nvram[addr], str, len); | |
41 | ||
42 | return addr + len; | |
43 | } | |
44 | ||
45 | /* Sun IDPROM structure at the end of NVRAM */ | |
64a7fde8 | 46 | /* from http://www.squirrel.com/squirrel/sun-nvram-hostid.faq.html */ |
d2c63fc1 | 47 | struct Sun_nvram { |
64a7fde8 BS |
48 | uint8_t type; /* always 01 */ |
49 | uint8_t machine_id; /* first byte of host id (machine type) */ | |
50 | uint8_t macaddr[6]; /* 6 byte ethernet address (first 3 bytes 08, 00, 20) */ | |
51 | uint8_t date[4]; /* date of manufacture */ | |
52 | uint8_t hostid[3]; /* remaining 3 bytes of host id (serial number) */ | |
53 | uint8_t checksum; /* bitwise xor of previous bytes */ | |
d2c63fc1 BS |
54 | }; |
55 | ||
56 | static inline void | |
57 | Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id) | |
58 | { | |
59 | uint8_t tmp, *tmpptr; | |
60 | unsigned int i; | |
61 | ||
62 | header->type = 1; | |
63 | header->machine_id = machine_id & 0xff; | |
64 | memcpy(&header->macaddr, macaddr, 6); | |
65 | /* Calculate checksum */ | |
66 | tmp = 0; | |
67 | tmpptr = (uint8_t *)header; | |
68 | for (i = 0; i < 15; i++) | |
69 | tmp ^= tmpptr[i]; | |
70 | ||
71 | header->checksum = tmp; | |
72 | } | |
d2c63fc1 | 73 | #endif /* FIRMWARE_ABI_H */ |