| #ifndef __ROMFILE_LOADER_H |
| #define __ROMFILE_LOADER_H |
| |
| #include "types.h" // u8 |
| #include "util.h" // romfile_s |
| |
| #define ROMFILE_LOADER_FILESZ 56 |
| |
| /* ROM file linker/loader interface. Linker uses little endian format */ |
| struct romfile_loader_entry_s { |
| u32 command; |
| union { |
| /* |
| * COMMAND_ALLOCATE - allocate a table from @alloc.file |
| * subject to @alloc.align alignment (must be power of 2) |
| * and @alloc.zone (can be HIGH or FSEG) requirements. |
| * |
| * Must appear exactly once for each file, and before |
| * this file is referenced by any other command. |
| */ |
| struct { |
| char file[ROMFILE_LOADER_FILESZ]; |
| u32 align; |
| u8 zone; |
| } alloc; |
| |
| /* |
| * COMMAND_ADD_POINTER - patch the table (originating from |
| * @dest_file) at @pointer.offset, by adding a pointer to the table |
| * originating from @src_file. 1,2,4 or 8 byte unsigned |
| * addition is used depending on @pointer.size. |
| */ |
| struct { |
| char dest_file[ROMFILE_LOADER_FILESZ]; |
| char src_file[ROMFILE_LOADER_FILESZ]; |
| u32 offset; |
| u8 size; |
| } pointer; |
| |
| /* |
| * COMMAND_ADD_CHECKSUM - calculate checksum of the range specified by |
| * @cksum.start and @cksum.length fields, |
| * and then add the value at @cksum_offset. |
| * Checksum simply sums -X for each byte X in the range |
| * using 8-bit math. |
| */ |
| struct { |
| char file[ROMFILE_LOADER_FILESZ]; |
| u32 offset; |
| u32 start; |
| u32 length; |
| } cksum; |
| |
| /* |
| * COMMAND_WRITE_POINTER - Write back to a host file via DMA, |
| * @wr_pointer.dest_file at offset @wr_pointer.dst_offset, a pointer |
| * to the table originating from @wr_pointer.src_file at offset |
| * @wr_pointer.src_offset. |
| * 1,2,4 or 8 byte unsigned addition is used depending on |
| * @wr_pointer.size. |
| */ |
| struct { |
| char dest_file[ROMFILE_LOADER_FILESZ]; |
| char src_file[ROMFILE_LOADER_FILESZ]; |
| u32 dst_offset; |
| u32 src_offset; |
| u8 size; |
| } wr_pointer; |
| |
| /* padding */ |
| char pad[124]; |
| }; |
| }; |
| |
| enum { |
| ROMFILE_LOADER_COMMAND_ALLOCATE = 0x1, |
| ROMFILE_LOADER_COMMAND_ADD_POINTER = 0x2, |
| ROMFILE_LOADER_COMMAND_ADD_CHECKSUM = 0x3, |
| ROMFILE_LOADER_COMMAND_WRITE_POINTER = 0x4, |
| }; |
| |
| enum { |
| ROMFILE_LOADER_ALLOC_ZONE_HIGH = 0x1, |
| ROMFILE_LOADER_ALLOC_ZONE_FSEG = 0x2, |
| }; |
| |
| int romfile_loader_execute(const char *name); |
| |
| void romfile_fw_cfg_resume(void); |
| |
| #endif |