| 1 | #ifndef HW_XTENSA_BOOTPARAM_H |
| 2 | #define HW_XTENSA_BOOTPARAM_H |
| 3 | |
| 4 | #include "exec/tswap.h" |
| 5 | #include "system/physmem.h" |
| 6 | |
| 7 | #define BP_TAG_COMMAND_LINE 0x1001 /* command line (0-terminated string)*/ |
| 8 | #define BP_TAG_INITRD 0x1002 /* ramdisk addr and size (bp_meminfo) */ |
| 9 | #define BP_TAG_MEMORY 0x1003 /* memory addr and size (bp_meminfo) */ |
| 10 | #define BP_TAG_SERIAL_BAUDRATE 0x1004 /* baud rate of current console. */ |
| 11 | #define BP_TAG_SERIAL_PORT 0x1005 /* serial device of current console */ |
| 12 | #define BP_TAG_FDT 0x1006 /* flat device tree addr */ |
| 13 | |
| 14 | #define BP_TAG_FIRST 0x7B0B /* first tag with a version number */ |
| 15 | #define BP_TAG_LAST 0x7E0B /* last tag */ |
| 16 | |
| 17 | typedef struct BpTag { |
| 18 | uint16_t tag; |
| 19 | uint16_t size; |
| 20 | } BpTag; |
| 21 | |
| 22 | typedef struct BpMemInfo { |
| 23 | uint32_t type; |
| 24 | uint32_t start; |
| 25 | uint32_t end; |
| 26 | } BpMemInfo; |
| 27 | |
| 28 | #define MEMORY_TYPE_CONVENTIONAL 0x1000 |
| 29 | #define MEMORY_TYPE_NONE 0x2000 |
| 30 | |
| 31 | static inline size_t get_tag_size(size_t data_size) |
| 32 | { |
| 33 | return data_size + sizeof(BpTag) + 4; |
| 34 | } |
| 35 | |
| 36 | static inline ram_addr_t put_tag(ram_addr_t addr, uint16_t tag, |
| 37 | size_t size, const void *data) |
| 38 | { |
| 39 | BpTag bp_tag = { |
| 40 | .tag = tswap16(tag), |
| 41 | .size = tswap16((size + 3) & ~3), |
| 42 | }; |
| 43 | |
| 44 | physical_memory_write(addr, &bp_tag, sizeof(bp_tag)); |
| 45 | addr += sizeof(bp_tag); |
| 46 | physical_memory_write(addr, data, size); |
| 47 | addr += (size + 3) & ~3; |
| 48 | |
| 49 | return addr; |
| 50 | } |
| 51 | |
| 52 | #endif |