1 #ifndef FIRMWARE_ABI_H 2 #define FIRMWARE_ABI_H 3 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 35 OpenBIOS_set_var(uint8_t *nvram, uint32_t addr, const char *str) 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 */ 46 /* from http://www.squirrel.com/squirrel/sun-nvram-hostid.faq.html */ 47 struct Sun_nvram { 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 */ 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 } 73 #endif /* FIRMWARE_ABI_H */ 74