|  | #ifndef FIRMWARE_ABI_H | 
|  | #define FIRMWARE_ABI_H | 
|  |  | 
|  | /* OpenBIOS NVRAM partition */ | 
|  | struct OpenBIOS_nvpart_v1 { | 
|  | uint8_t signature; | 
|  | uint8_t checksum; | 
|  | uint16_t len; // BE, length divided by 16 | 
|  | char name[12]; | 
|  | }; | 
|  |  | 
|  | #define OPENBIOS_PART_SYSTEM 0x70 | 
|  | #define OPENBIOS_PART_FREE 0x7f | 
|  |  | 
|  | static inline void | 
|  | OpenBIOS_finish_partition(struct OpenBIOS_nvpart_v1 *header, uint32_t size) | 
|  | { | 
|  | unsigned int i, sum; | 
|  | uint8_t *tmpptr; | 
|  |  | 
|  | // Length divided by 16 | 
|  | header->len = cpu_to_be16(size >> 4); | 
|  |  | 
|  | // Checksum | 
|  | tmpptr = (uint8_t *)header; | 
|  | sum = *tmpptr; | 
|  | for (i = 0; i < 14; i++) { | 
|  | sum += tmpptr[2 + i]; | 
|  | sum = (sum + ((sum & 0xff00) >> 8)) & 0xff; | 
|  | } | 
|  | header->checksum = sum & 0xff; | 
|  | } | 
|  |  | 
|  | static inline uint32_t | 
|  | OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const char *str) | 
|  | { | 
|  | uint32_t len; | 
|  |  | 
|  | len = strlen(str) + 1; | 
|  | memcpy(&nvram[addr], str, len); | 
|  |  | 
|  | return addr + len; | 
|  | } | 
|  |  | 
|  | /* Sun IDPROM structure at the end of NVRAM */ | 
|  | /* from http://www.squirrel.com/squirrel/sun-nvram-hostid.faq.html */ | 
|  | struct Sun_nvram { | 
|  | uint8_t type;       /* always 01 */ | 
|  | uint8_t machine_id; /* first byte of host id (machine type) */ | 
|  | uint8_t macaddr[6]; /* 6 byte ethernet address (first 3 bytes 08, 00, 20) */ | 
|  | uint8_t date[4];    /* date of manufacture */ | 
|  | uint8_t hostid[3];  /* remaining 3 bytes of host id (serial number) */ | 
|  | uint8_t checksum;   /* bitwise xor of previous bytes */ | 
|  | }; | 
|  |  | 
|  | static inline void | 
|  | Sun_init_header(struct Sun_nvram *header, const uint8_t *macaddr, int machine_id) | 
|  | { | 
|  | uint8_t tmp, *tmpptr; | 
|  | unsigned int i; | 
|  |  | 
|  | header->type = 1; | 
|  | header->machine_id = machine_id & 0xff; | 
|  | memcpy(&header->macaddr, macaddr, 6); | 
|  | /* Calculate checksum */ | 
|  | tmp = 0; | 
|  | tmpptr = (uint8_t *)header; | 
|  | for (i = 0; i < 15; i++) | 
|  | tmp ^= tmpptr[i]; | 
|  |  | 
|  | header->checksum = tmp; | 
|  | } | 
|  | #endif /* FIRMWARE_ABI_H */ |