Implement payload compression

This commit is contained in:
shchmue 2021-05-12 16:47:06 -06:00
parent a7712b173c
commit 918b00ce07
20 changed files with 2305 additions and 28 deletions

11
.gitignore vendored
View File

@ -1,4 +1,9 @@
.vs
.vscode .vscode
build build/*
output output/*
research research/*
loader/payload_00.h
loader/payload_01.h
tools/bin2c/bin2c
tools/lz/lz77

View File

@ -8,10 +8,8 @@ include $(DEVKITARM)/base_rules
################################################################################ ################################################################################
IPL_LOAD_ADDR := 0x40003000 IPL_LOAD_ADDR := 0x40008000
LPVERSION_MAJOR := 1 include ./Versions.inc
LPVERSION_MINOR := 9
LPVERSION_BUGFX := 1
################################################################################ ################################################################################
@ -40,52 +38,84 @@ CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
CUSTOMDEFINES += -DLP_VER_MJ=$(LPVERSION_MAJOR) -DLP_VER_MN=$(LPVERSION_MINOR) -DLP_VER_BF=$(LPVERSION_BUGFX) CUSTOMDEFINES += -DLP_VER_MJ=$(LPVERSION_MAJOR) -DLP_VER_MN=$(LPVERSION_MINOR) -DLP_VER_BF=$(LPVERSION_BUGFX)
CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC) CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
# 0: UART_A, 1: UART_B.
#CUSTOMDEFINES += -DDEBUG_UART_PORT=0
#CUSTOMDEFINES += -DDEBUG #CUSTOMDEFINES += -DDEBUG
# UART Logging: Max baudrate 12.5M.
# DEBUG_UART_PORT - 0: UART_A, 1: UART_B, 2: UART_C.
#CUSTOMDEFINES += -DDEBUG_UART_BAUDRATE=115200 -DDEBUG_UART_INVERT=0 -DDEBUG_UART_PORT=0
#TODO: Considering reinstating some of these when pointer warnings have been fixed. #TODO: Considering reinstating some of these when pointer warnings have been fixed.
WARNINGS := -Wall -Wno-array-bounds -Wno-stringop-overread -Wno-stringop-overflow WARNINGS := -Wall -Wno-array-bounds -Wno-stringop-overread -Wno-stringop-overflow
ARCH := -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork ARCH := -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork
CFLAGS = $(ARCH) -Os -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11 $(WARNINGS) $(CUSTOMDEFINES) CFLAGS = $(ARCH) -O2 -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11 $(WARNINGS) $(CUSTOMDEFINES)
LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defsym=IPL_LOAD_ADDR=$(IPL_LOAD_ADDR) LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defsym=IPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
LDRDIR := $(wildcard loader)
TOOLSLZ := $(wildcard tools/lz)
TOOLSB2C := $(wildcard tools/bin2c)
TOOLS := $(TOOLSLZ) $(TOOLSB2C)
################################################################################ ################################################################################
.PHONY: all clean .PHONY: all clean $(LDRDIR) $(TOOLS)
all: $(OUTPUTDIR)/$(TARGET).bin all: $(OUTPUTDIR)/$(TARGET).bin $(LDRDIR)
@echo -n "Payload size is " @echo "--------------------------------------"
@echo -n "Uncompr size: "
$(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET)_unc.bin))
@echo $(BIN_SIZE)" Bytes"
@echo "Uncompr Max: 140288 Bytes + 3 KiB BSS"
@if [ ${BIN_SIZE} -gt 140288 ]; then echo "\e[1;33mUncompr size exceeds limit!\e[0m"; fi
@echo -n "Payload size: "
$(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET).bin)) $(eval BIN_SIZE = $(shell wc -c < $(OUTPUTDIR)/$(TARGET).bin))
@echo $(BIN_SIZE) @echo $(BIN_SIZE)" Bytes"
@echo "Max size is 126296 Bytes." @echo "Payload Max: 126296 Bytes"
@if [ ${BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mPayload size exceeds limit!\e[0m"; fi @if [ ${BIN_SIZE} -gt 126296 ]; then echo "\e[1;33mPayload size exceeds limit!\e[0m"; fi
@echo "--------------------------------------"
clean: clean: $(TOOLS)
@rm -rf $(BUILDDIR) @rm -rf $(BUILDDIR)
@rm -rf $(OUTPUTDIR) @rm -rf $(OUTPUTDIR)
$(OUTPUTDIR)/$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf $(LDRDIR): $(OUTPUTDIR)/$(TARGET).bin
@$(TOOLSLZ)/lz77 $(OUTPUTDIR)/$(TARGET).bin
mv $(OUTPUTDIR)/$(TARGET).bin $(OUTPUTDIR)/$(TARGET)_unc.bin
@mv $(OUTPUTDIR)/$(TARGET).bin.00.lz payload_00
@mv $(OUTPUTDIR)/$(TARGET).bin.01.lz payload_01
@$(TOOLSB2C)/bin2c payload_00 > $(LDRDIR)/payload_00.h
@$(TOOLSB2C)/bin2c payload_01 > $(LDRDIR)/payload_01.h
@rm payload_00
@rm payload_01
@$(MAKE) --no-print-directory -C $@ $(MAKECMDGOALS) -$(MAKEFLAGS) PAYLOAD_NAME=$(TARGET)
$(TOOLS):
@$(MAKE) --no-print-directory -C $@ $(MAKECMDGOALS) -$(MAKEFLAGS)
$(OUTPUTDIR)/$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf $(TOOLS)
@mkdir -p "$(@D)" @mkdir -p "$(@D)"
$(OBJCOPY) -S -O binary $< $@ $(OBJCOPY) -S -O binary $< $@
$(BUILDDIR)/$(TARGET)/$(TARGET).elf: $(OBJS) $(BUILDDIR)/$(TARGET)/$(TARGET).elf: $(OBJS)
$(CC) $(LDFLAGS) -T $(SOURCEDIR)/link.ld $^ -o $@ @$(CC) $(LDFLAGS) -T $(SOURCEDIR)/link.ld $^ -o $@
@echo "Lockpick_RCM was built with the following flags:\nCFLAGS: "$(CFLAGS)"\nLDFLAGS: "$(LDFLAGS)
$(BUILDDIR)/$(TARGET)/%.o: $(SOURCEDIR)/%.c $(BUILDDIR)/$(TARGET)/%.o: $(SOURCEDIR)/%.c
@mkdir -p "$(@D)" @mkdir -p "$(@D)"
$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ @echo Building $@
@$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
$(BUILDDIR)/$(TARGET)/%.o: $(SOURCEDIR)/%.S $(BUILDDIR)/$(TARGET)/%.o: $(SOURCEDIR)/%.S
@mkdir -p "$(@D)" @mkdir -p "$(@D)"
$(CC) $(CFLAGS) -c $< -o $@ @echo Building $@
@$(CC) $(CFLAGS) -c $< -o $@
$(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.c $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.c
@mkdir -p "$(@D)" @mkdir -p "$(@D)"
$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ @echo Building $@
@$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
$(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S
@mkdir -p "$(@D)" @mkdir -p "$(@D)"
$(CC) $(CFLAGS) -c $< -o $@ @echo Building $@
@$(CC) $(CFLAGS) -c $< -o $@

4
Versions.inc Normal file
View File

@ -0,0 +1,4 @@
# LP Version.
LPVERSION_MAJOR := 1
LPVERSION_MINOR := 9
LPVERSION_BUGFX := 1

View File

@ -20,7 +20,7 @@
#include <soc/clock.h> #include <soc/clock.h>
#include <utils/util.h> #include <utils/util.h>
#define CONFIG_ENABLE_AHB_REDIRECT //#define CONFIG_ENABLE_AHB_REDIRECT
void mc_config_tsec_carveout(u32 bom, u32 size1mb, bool lock) void mc_config_tsec_carveout(u32 bom, u32 size1mb, bool lock)
{ {

View File

@ -19,10 +19,10 @@
//#define IPL_STACK_TOP 0x4003FF00 //#define IPL_STACK_TOP 0x4003FF00
/* --- BIT/BCT: 0x40000000 - 0x40003000 --- */ /* --- BIT/BCT: 0x40000000 - 0x40003000 --- */
/* --- IPL: 0x40003000 - 0x40028000 --- */ /* --- IPL: 0x40008000 - 0x40028000 --- */
#define LDR_LOAD_ADDR 0x40007000 #define LDR_LOAD_ADDR 0x40007000
#define IPL_LOAD_ADDR 0x40003000 #define IPL_LOAD_ADDR 0x40008000
#define IPL_SZ_MAX 0x20000 // 128KB. #define IPL_SZ_MAX 0x20000 // 128KB.
/* --- XUSB EP context and TRB ring buffers --- */ /* --- XUSB EP context and TRB ring buffers --- */

65
loader/Makefile Normal file
View File

@ -0,0 +1,65 @@
ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif
include $(DEVKITARM)/base_rules
################################################################################
LDR_LOAD_ADDR := 0x40007000
IPL_MAGIC := 0x43544349 #"ICTC"
include ../Versions.inc
################################################################################
TARGET := loader
BUILDDIR := ../build
OUTPUTDIR := ../output
BDKDIR := bdk
BDKINC := -I../$(BDKDIR)
VPATH += $(dir $(wildcard ../$(BDKDIR)/*/)) $(dir $(wildcard ../$(BDKDIR)/*/*/))
# Main and graphics.
OBJS = $(addprefix $(BUILDDIR)/$(TARGET)/, \
start.o loader.o lz.o \
)
################################################################################
CUSTOMDEFINES := -DBL_MAGIC=$(IPL_MAGIC)
CUSTOMDEFINES += -DBL_VER_MJ=$(BLVERSION_MAJOR) -DBL_VER_MN=$(BLVERSION_MINOR) -DBL_VER_HF=$(BLVERSION_HOTFX) -DBL_RESERVED=$(BLVERSION_RSVD)
#TODO: Considering reinstating some of these when pointer warnings have been fixed.
WARNINGS := -Wall -Wno-array-bounds -Wno-stringop-overflow
ARCH := -march=armv4t -mtune=arm7tdmi -mthumb-interwork
CFLAGS = $(ARCH) -O2 -g -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -std=gnu11 $(WARNINGS) $(CUSTOMDEFINES)
LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defsym=LDR_LOAD_ADDR=$(LDR_LOAD_ADDR)
################################################################################
.PHONY: all clean
all: $(TARGET).bin $(TOOLSLZ) $(TOOLSB2C)
clean:
@rm -rf $(OBJS)
$(TARGET).bin: $(BUILDDIR)/$(TARGET)/$(TARGET).elf
$(OBJCOPY) -S -O binary $< $(OUTPUTDIR)/$(PAYLOAD_NAME).bin
$(BUILDDIR)/$(TARGET)/$(TARGET).elf: $(OBJS)
@$(CC) $(LDFLAGS) -T link.ld $^ -o $@
$(BUILDDIR)/$(TARGET)/%.o: %.c
@$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
$(BUILDDIR)/$(TARGET)/%.o: %.S
@$(CC) $(CFLAGS) -c $< -o $@
$(OBJS): $(BUILDDIR)/$(TARGET)
$(BUILDDIR)/$(TARGET):
@mkdir -p "$(BUILDDIR)"
@mkdir -p "$(BUILDDIR)/$(TARGET)"
@mkdir -p "$(OUTPUTDIR)"

21
loader/link.ld Normal file
View File

@ -0,0 +1,21 @@
ENTRY(_start)
SECTIONS {
PROVIDE(__ipl_start = LDR_LOAD_ADDR);
. = __ipl_start;
.text : {
*(.text._start);
KEEP(*(._boot_cfg));
KEEP(*(._octopus));
*(.text*);
}
.data : {
*(.data*);
*(.rodata*);
*(._payload_00);
*(._payload_01);
}
__ldr_end = .;
. = ALIGN(0x10);
__ipl_end = .;
}

101
loader/loader.c Normal file
View File

@ -0,0 +1,101 @@
/*
* Copyright (c) 2019 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include <stdlib.h>
#include "payload_00.h"
#include "payload_01.h"
#include <memory_map.h>
#include <libs/compr/lz.h>
#include <soc/clock.h>
#include <soc/t210.h>
// 0x4003D000: Safe for panic preserving, 0x40038000: Safe for debugging needs.
#define IPL_RELOC_TOP 0x40038000
#define IPL_PATCHED_RELOC_SZ 0x94
boot_cfg_t __attribute__((section ("._boot_cfg"))) b_cfg;
const volatile char __attribute__((section ("._octopus"))) octopus[] =
"\n"
" ___\n"
" .-' `'.\n"
" / \\\n"
" | ;\n"
" | | ___.--,\n"
" _.._ |0) = (0) | _.---'`__.-( (_.\n"
" __.--'`_.. '.__.\\ '--. \\_.-' ,.--'` `\"\"`\n"
" ( ,.--'` ',__ /./; ;, '.__.'` __\n"
" _`) ) .---.__.' / | |\\ \\__..--\"\" \"\"\"--.,_\n"
" `---' .'.''-._.-'`_./ /\\ '. \\ _.--''````'''--._`-.__.'\n"
" | | .' _.-' | | \\ \\ '. `----`\n"
" \\ \\/ .' \\ \\ '. '-._)\n"
" \\/ / \\ \\ `=.__`'-.\n"
" / /\\ `) ) / / `\"\".`\\\n"
" , _.-'.'\\ \\ / / ( ( / /\n"
" `--'` ) ) .-'.' '.'. | (\n"
" (/` ( (` ) ) '-; [switchbrew]\n";
void loader_main()
{
// Preliminary BPMP clocks init.
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 0x10; // Set HCLK div to 2 and PCLK div to 1.
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_SYS) = 0; // Set SCLK div to 1.
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20004444; // Set clk source to Run and PLLP_OUT2 (204MHz).
CLOCK(CLK_RST_CONTROLLER_SUPER_SCLK_DIVIDER) = 0x80000000; // Enable SUPER_SDIV to 1.
CLOCK(CLK_RST_CONTROLLER_CLK_SYSTEM_RATE) = 2; // Set HCLK div to 1 and PCLK div to 3.
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = 0x20003333; // Set SCLK to PLLP_OUT (408MHz).
// Get Loader and Payload size.
u32 payload_size = sizeof(payload_00) + sizeof(payload_01); // Actual payload size.
payload_size += (u32)payload_01 - (u32)payload_00 - sizeof(payload_00); // Add array alignment.
u32 *payload_addr = (u32 *)payload_00;
// Relocate payload to a safer place.
u32 bytes = ALIGN(payload_size, 4) >> 2;
u32 *addr = payload_addr + bytes - 1;
u32 *dst = (u32 *)(IPL_RELOC_TOP - 4);
while (bytes)
{
*dst = *addr;
dst--;
addr--;
bytes--;
}
// Set source address of the first part.
u8 *src_addr = (void *)(IPL_RELOC_TOP - ALIGN(payload_size, 4));
// Uncompress first part.
u32 dst_pos = LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR, sizeof(payload_00));
// Set source address of the second part. Includes array alignment.
src_addr += (u32)payload_01 - (u32)payload_00;
// Uncompress second part.
LZ_Uncompress((const u8 *)src_addr, (u8*)IPL_LOAD_ADDR + dst_pos, sizeof(payload_01));
// Copy over boot configuration storage.
memcpy((u8 *)(IPL_LOAD_ADDR + IPL_PATCHED_RELOC_SZ), &b_cfg, sizeof(boot_cfg_t));
// Chainload into uncompressed payload.
void (*ipl_ptr)() = (void *)IPL_LOAD_ADDR;
(*ipl_ptr)();
// Halt if we managed to get out of execution.
while (true)
;
}

73
loader/start.S Normal file
View File

@ -0,0 +1,73 @@
/*
* Copyright (c) 2018 naehrwert
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
.section .text._start
.arm
.extern _reloc_ipl
.type _reloc_ipl, %function
.extern memset
.type memset, %function
.extern loader_main
.type loader_main, %function
.globl _start
.type _start, %function
_start:
ADR R0, _start
LDR R1, =__ipl_start
CMP R0, R1
BEQ _real_start
/* If we are not in the right location already, copy a relocator to upper IRAM. */
ADR R2, _reloc_ipl
LDR R3, =0x4003FF00
MOV R4, #(_real_start - _reloc_ipl)
_copy_loop:
LDMIA R2!, {R5}
STMIA R3!, {R5}
SUBS R4, #4
BNE _copy_loop
/* Use the relocator to copy ourselves into the right place. */
LDR R2, =__ipl_end
SUB R2, R2, R1
LDR R3, =_real_start
LDR R4, =0x4003FF00
BX R4
_reloc_ipl:
LDMIA R0!, {R4-R7}
STMIA R1!, {R4-R7}
SUBS R2, #0x10
BNE _reloc_ipl
/* Jump to the relocated entry. */
BX R3
_real_start:
/* Initially, we place our stack in IRAM but will move it to SDRAM later. */
LDR SP, =0x40007000
LDR R0, =__ldr_end
BL loader_main
B .
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0

View File

@ -202,7 +202,7 @@ static bool _derive_tsec_keys(tsec_ctxt_t *tsec_ctxt, u32 kb, key_derivation_ctx
int res = 0; int res = 0;
u32 retries = 0; u32 retries = 0;
mc_disable_ahb_redirect(); // mc_disable_ahb_redirect();
while (tsec_query(keys->tsec_keys, kb, tsec_ctxt) < 0) { while (tsec_query(keys->tsec_keys, kb, tsec_ctxt) < 0) {
memset(keys->tsec_keys, 0, sizeof(keys->tsec_keys)); memset(keys->tsec_keys, 0, sizeof(keys->tsec_keys));
@ -213,7 +213,7 @@ static bool _derive_tsec_keys(tsec_ctxt_t *tsec_ctxt, u32 kb, key_derivation_ctx
} }
} }
mc_enable_ahb_redirect(); // mc_enable_ahb_redirect();
if (res < 0) { if (res < 0) {
EPRINTFARGS("ERROR %x dumping TSEC.\n", res); EPRINTFARGS("ERROR %x dumping TSEC.\n", res);

16
tools/bin2c/Makefile Normal file
View File

@ -0,0 +1,16 @@
NATIVE_CC ?= gcc
ifeq (, $(shell which $(NATIVE_CC) 2>/dev/null))
$(error "Native GCC is missing. Please install it first. If it's path is custom, set it with export NATIVE_CC=<path to native gcc toolchain>")
endif
.PHONY: all clean
all: bin2c
@echo > /dev/null
clean:
@rm -f bin2c
bin2c: bin2c.c
@$(NATIVE_CC) -o $@ bin2c.c

83
tools/bin2c/bin2c.c Normal file
View File

@ -0,0 +1,83 @@
/*
* This is bin2c program, which allows you to convert binary file to
* C language array, for use as embedded resource, for instance you can
* embed graphics or audio file directly into your program.
* This is public domain software, use it on your own risk.
* Contact Serge Fukanchik at fuxx@mail.ru if you have any questions.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
/* Replace . with _ */
char*
make_ident ( char* name )
{
char* ret;
char* p;
ret = strdup ( name );
for ( p = ret; p[0]; p++ )
{
if ( !isalnum ( p[0] ) ) p[0] = '_';
}
return ret;
}
int
main ( int argc, char* argv[] )
{
unsigned char buf[BUFSIZ];
char* ident;
FILE *fd;
size_t size, i, total, blksize = BUFSIZ;
int need_comma = 0;
if ( argc != 2 )
{
fprintf ( stderr, "Usage: %s binary_file > output_file\n", argv[0] );
return -1;
}
fd = fopen ( argv[1], "rb" );
if ( fd == NULL )
{
fprintf ( stderr, "%s: can't open %s for reading\n", argv[0], argv[1] );
return -1;
}
fseek(fd, 0, SEEK_END);
size = ftell(fd);
rewind(fd);
ident = make_ident ( argv[1] );
printf ( "static const unsigned char __attribute__((section (\"._%s\"))) %s[] = {", ident, ident );
for ( total = 0; total < size; )
{
if ( size - total < blksize ) blksize = size - total;
if ( fread ( buf, 1, blksize, fd ) != blksize )
{
fprintf ( stderr, "%s: file read error\n", argv[0] );
return -1;
}
for ( i = 0; i < blksize; i++ )
{
if ( need_comma ) printf ( ", " );
else need_comma = 1;
if ( ( total % 11 ) == 0 ) printf ( "\n\t" );
printf ( "0x%.2x", buf[i] );
total++;
}
}
printf ( "\n};\n" );
fclose ( fd );
free ( ident );
return 0;
}

641
tools/emc.def Normal file
View File

@ -0,0 +1,641 @@
EMC_DBG 8
EMC_CFG C
EMC_CONFIG_SAMPLE_DELAY 5f0
EMC_CFG_UPDATE 5f4
EMC_ADR_CFG 10
EMC_REFCTRL 20
EMC_PIN 24
EMC_TIMING_CONTROL 28
EMC_RC 2c
EMC_RFC 30
EMC_RFCPB 590
EMC_RAS 34
EMC_RP 38
EMC_R2W 3c
EMC_W2R 40
EMC_R2P 44
EMC_W2P 48
EMC_CCDMW 5c0
EMC_RD_RCD 4c
EMC_WR_RCD 50
EMC_RRD 54
EMC_REXT 58
EMC_WDV 5c
EMC_QUSE 60
EMC_QRST 64
EMC_ISSUE_QRST 428
EMC_QSAFE 68
EMC_RDV 6c
EMC_REFRESH 70
EMC_BURST_REFRESH_NUM 74
EMC_PDEX2WR 78
EMC_PDEX2RD 7c
EMC_PDEX2CKE 118
EMC_PCHG2PDEN 80
EMC_ACT2PDEN 84
EMC_AR2PDEN 88
EMC_RW2PDEN 8c
EMC_CKE2PDEN 11c
EMC_TXSR 90
EMC_TCKE 94
EMC_TFAW 98
EMC_TRPAB 9c
EMC_TCLKSTABLE a0
EMC_TCLKSTOP a4
EMC_TREFBW a8
EMC_TPPD ac
EMC_PDEX2MRR b4
EMC_ODT_WRITE b0
EMC_WEXT b8
EMC_RFC_SLR c0
EMC_MRS_WAIT_CNT2 c4
EMC_MRS_WAIT_CNT c8
EMC_MRS cc
EMC_EMRS d0
EMC_REF d4
EMC_PRE d8
EMC_NOP dc
EMC_SELF_REF e0
EMC_DPD e4
EMC_MRW e8
EMC_MRR ec
EMC_CMDQ f0
EMC_MC2EMCQ f4
EMC_FBIO_SPARE 100
EMC_FBIO_CFG5 104
EMC_CFG_RSV 120
EMC_ACPD_CONTROL 124
EMC_MPC 128
EMC_EMRS2 12c
EMC_EMRS3 130
EMC_MRW2 134
EMC_MRW3 138
EMC_MRW4 13c
EMC_MRW5 4a0
EMC_MRW6 4a4
EMC_MRW7 4a8
EMC_MRW8 4ac
EMC_MRW9 4b0
EMC_MRW10 4b4
EMC_MRW11 4b8
EMC_MRW12 4bc
EMC_MRW13 4c0
EMC_MRW14 4c4
EMC_MRW15 4d0
EMC_CFG_SYNC 4d4
EMC_CLKEN_OVERRIDE 140
EMC_R2R 144
EMC_W2W 148
EMC_EINPUT 14c
EMC_EINPUT_DURATION 150
EMC_PUTERM_EXTRA 154
EMC_TCKESR 158
EMC_TPD 15c
EMC_STAT_CONTROL 160
EMC_STAT_STATUS 164
EMC_STAT_DRAM_CLOCK_LIMIT_LO 19c
EMC_STAT_DRAM_CLOCK_LIMIT_HI 1a0
EMC_STAT_DRAM_CLOCKS_LO 1a4
EMC_STAT_DRAM_CLOCKS_HI 1a8
EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_LO 1ac
EMC_STAT_DRAM_DEV0_ACTIVATE_CNT_HI 1b0
EMC_STAT_DRAM_DEV0_READ_CNT_LO 1b4
EMC_STAT_DRAM_DEV0_READ_CNT_HI 1b8
EMC_STAT_DRAM_DEV0_READ8_CNT_LO 1bc
EMC_STAT_DRAM_DEV0_READ8_CNT_HI 1c0
EMC_STAT_DRAM_DEV0_WRITE_CNT_LO 1c4
EMC_STAT_DRAM_DEV0_WRITE_CNT_HI 1c8
EMC_STAT_DRAM_DEV0_WRITE8_CNT_LO 1cc
EMC_STAT_DRAM_DEV0_WRITE8_CNT_HI 1d0
EMC_STAT_DRAM_DEV0_REF_CNT_LO 1d4
EMC_STAT_DRAM_DEV0_REF_CNT_HI 1d8
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 1dc
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 1e0
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 1e4
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 1e8
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 1ec
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 1f0
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 1f4
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 1f8
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 1fc
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 200
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 204
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 208
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 20c
EMC_STAT_DRAM_DEV0_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 210
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 214
EMC_STAT_DRAM_DEV0_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 218
EMC_STAT_DRAM_DEV0_SR_CKE_EQ0_CLKS_LO 21c
EMC_STAT_DRAM_DEV0_SR_CKE_EQ0_CLKS_HI 220
EMC_STAT_DRAM_DEV0_DSR 224
EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_LO 228
EMC_STAT_DRAM_DEV1_ACTIVATE_CNT_HI 22c
EMC_STAT_DRAM_DEV1_READ_CNT_LO 230
EMC_STAT_DRAM_DEV1_READ_CNT_HI 234
EMC_STAT_DRAM_DEV1_READ8_CNT_LO 238
EMC_STAT_DRAM_DEV1_READ8_CNT_HI 23c
EMC_STAT_DRAM_DEV1_WRITE_CNT_LO 240
EMC_STAT_DRAM_DEV1_WRITE_CNT_HI 244
EMC_STAT_DRAM_DEV1_WRITE8_CNT_LO 248
EMC_STAT_DRAM_DEV1_WRITE8_CNT_HI 24c
EMC_STAT_DRAM_DEV1_REF_CNT_LO 250
EMC_STAT_DRAM_DEV1_REF_CNT_HI 254
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 258
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 25c
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO 260
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI 264
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 268
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 26c
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO 270
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI 274
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 278
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 27c
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO 280
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI 284
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 288
EMC_STAT_DRAM_DEV1_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 28c
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO 290
EMC_STAT_DRAM_DEV1_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI 294
EMC_STAT_DRAM_DEV1_SR_CKE_EQ0_CLKS_LO 298
EMC_STAT_DRAM_DEV1_SR_CKE_EQ0_CLKS_HI 29c
EMC_STAT_DRAM_DEV1_DSR 2a0
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO c8c
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI c90
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_LO c94
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_NO_BANKS_ACTIVE_CLKS_HI c98
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO c9c
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI ca0
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_LO ca4
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_NO_BANKS_ACTIVE_CLKS_HI ca8
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO cac
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI cb0
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_LO cb4
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ0_SOME_BANKS_ACTIVE_CLKS_HI cb8
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO cbc
EMC_STAT_DRAM_IO_EXTCLKS_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI cc0
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_LO cc4
EMC_STAT_DRAM_IO_CLKSTOP_CKE_EQ1_SOME_BANKS_ACTIVE_CLKS_HI cc8
EMC_STAT_DRAM_IO_SR_CKE_EQ0_CLKS_LO ccc
EMC_STAT_DRAM_IO_SR_CKE_EQ0_CLKS_HI cd0
EMC_STAT_DRAM_IO_DSR cd4
EMC_AUTO_CAL_CONFIG 2a4
EMC_AUTO_CAL_CONFIG2 458
EMC_AUTO_CAL_CONFIG3 45c
EMC_AUTO_CAL_CONFIG4 5b0
EMC_AUTO_CAL_CONFIG5 5b4
EMC_AUTO_CAL_CONFIG6 5cc
EMC_AUTO_CAL_CONFIG7 574
EMC_AUTO_CAL_CONFIG8 2dc
EMC_AUTO_CAL_VREF_SEL_0 2f8
EMC_AUTO_CAL_VREF_SEL_1 300
EMC_AUTO_CAL_INTERVAL 2a8
EMC_AUTO_CAL_STATUS 2ac
EMC_AUTO_CAL_STATUS2 3d4
EMC_AUTO_CAL_CHANNEL 464
EMC_PMACRO_RX_TERM c48
EMC_PMACRO_DQ_TX_DRV c70
EMC_PMACRO_CA_TX_DRV c74
EMC_PMACRO_CMD_TX_DRV c4c
EMC_PMACRO_AUTOCAL_CFG_0 700
EMC_PMACRO_AUTOCAL_CFG_1 704
EMC_PMACRO_AUTOCAL_CFG_2 708
EMC_PMACRO_AUTOCAL_CFG_COMMON c78
EMC_PMACRO_ZCTRL c44
EMC_XM2COMPPADCTRL 30c
EMC_XM2COMPPADCTRL2 578
EMC_XM2COMPPADCTRL3 2f4
EMC_COMP_PAD_SW_CTRL 57c
EMC_REQ_CTRL 2b0
EMC_EMC_STATUS 2b4
EMC_CFG_2 2b8
EMC_CFG_DIG_DLL 2bc
EMC_CFG_DIG_DLL_PERIOD 2c0
EMC_DIG_DLL_STATUS 2c4
EMC_CFG_DIG_DLL_1 2c8
EMC_RDV_MASK 2cc
EMC_WDV_MASK 2d0
EMC_RDV_EARLY_MASK 2d4
EMC_RDV_EARLY 2d8
EMC_WDV_CHK 4e0
EMC_ZCAL_INTERVAL 2e0
EMC_ZCAL_WAIT_CNT 2e4
EMC_ZCAL_MRW_CMD 2e8
EMC_ZQ_CAL 2ec
EMC_SCRATCH0 324
EMC_STALL_THEN_EXE_BEFORE_CLKCHANGE 3c8
EMC_STALL_THEN_EXE_AFTER_CLKCHANGE 3cc
EMC_UNSTALL_RW_AFTER_CLKCHANGE 3d0
EMC_FDPD_CTRL_CMD_NO_RAMP 4d8
EMC_SEL_DPD_CTRL 3d8
EMC_FDPD_CTRL_DQ 310
EMC_FDPD_CTRL_CMD 314
EMC_PRE_REFRESH_REQ_CNT 3dc
EMC_REFCTRL2 580
EMC_FBIO_CFG7 584
EMC_DATA_BRLSHFT_0 588
EMC_DATA_BRLSHFT_1 58c
EMC_DQS_BRLSHFT_0 594
EMC_DQS_BRLSHFT_1 598
EMC_CMD_BRLSHFT_0 59c
EMC_CMD_BRLSHFT_1 5a0
EMC_CMD_BRLSHFT_2 5a4
EMC_CMD_BRLSHFT_3 5a8
EMC_QUSE_BRLSHFT_0 5ac
EMC_QUSE_BRLSHFT_1 5b8
EMC_QUSE_BRLSHFT_2 5bc
EMC_QUSE_BRLSHFT_3 5c4
EMC_FBIO_CFG8 5c8
EMC_CMD_MAPPING_CMD0_0 380
EMC_CMD_MAPPING_CMD0_1 384
EMC_CMD_MAPPING_CMD0_2 388
EMC_CMD_MAPPING_CMD1_0 38c
EMC_CMD_MAPPING_CMD1_1 390
EMC_CMD_MAPPING_CMD1_2 394
EMC_CMD_MAPPING_CMD2_0 398
EMC_CMD_MAPPING_CMD2_1 39c
EMC_CMD_MAPPING_CMD2_2 3a0
EMC_CMD_MAPPING_CMD3_0 3a4
EMC_CMD_MAPPING_CMD3_1 3a8
EMC_CMD_MAPPING_CMD3_2 3ac
EMC_CMD_MAPPING_BYTE 3b0
EMC_DYN_SELF_REF_CONTROL 3e0
EMC_TXSRDLL 3e4
EMC_CCFIFO_ADDR 3e8
EMC_CCFIFO_DATA 3ec
EMC_CCFIFO_STATUS 3f0
EMC_SWIZZLE_RANK0_BYTE0 404
EMC_SWIZZLE_RANK0_BYTE1 408
EMC_SWIZZLE_RANK0_BYTE2 40c
EMC_SWIZZLE_RANK0_BYTE3 410
EMC_SWIZZLE_RANK1_BYTE0 418
EMC_SWIZZLE_RANK1_BYTE1 41c
EMC_SWIZZLE_RANK1_BYTE2 420
EMC_SWIZZLE_RANK1_BYTE3 424
EMC_TR_TIMING_0 3b4
EMC_TR_CTRL_0 3b8
EMC_TR_CTRL_1 3bc
EMC_TR_DVFS 460
EMC_SWITCH_BACK_CTRL 3c0
EMC_TR_RDV 3c4
EMC_TR_QPOP 3f4
EMC_TR_RDV_MASK 3f8
EMC_TR_QSAFE 3fc
EMC_TR_QRST 400
EMC_IBDLY 468
EMC_OBDLY 46c
EMC_TXDSRVTTGEN 480
EMC_WE_DURATION 48c
EMC_WS_DURATION 490
EMC_WEV 494
EMC_WSV 498
EMC_CFG_3 49c
EMC_CFG_PIPE_2 554
EMC_CFG_PIPE_CLK 558
EMC_CFG_PIPE_1 55c
EMC_CFG_PIPE 560
EMC_QPOP 564
EMC_QUSE_WIDTH 568
EMC_PUTERM_WIDTH 56c
EMC_PROTOBIST_CONFIG_ADR_1 5d0
EMC_PROTOBIST_CONFIG_ADR_2 5d4
EMC_PROTOBIST_MISC 5d8
EMC_PROTOBIST_WDATA_LOWER 5dc
EMC_PROTOBIST_WDATA_UPPER 5e0
EMC_PROTOBIST_RDATA 5ec
EMC_DLL_CFG_0 5e4
EMC_DLL_CFG_1 5e8
EMC_TRAINING_CMD e00
EMC_TRAINING_CTRL e04
EMC_TRAINING_STATUS e08
EMC_TRAINING_QUSE_CORS_CTRL e0c
EMC_TRAINING_QUSE_FINE_CTRL e10
EMC_TRAINING_QUSE_CTRL_MISC e14
EMC_TRAINING_WRITE_FINE_CTRL e18
EMC_TRAINING_WRITE_CTRL_MISC e1c
EMC_TRAINING_WRITE_VREF_CTRL e20
EMC_TRAINING_READ_FINE_CTRL e24
EMC_TRAINING_READ_CTRL_MISC e28
EMC_TRAINING_READ_VREF_CTRL e2c
EMC_TRAINING_CA_FINE_CTRL e30
EMC_TRAINING_CA_CTRL_MISC e34
EMC_TRAINING_CA_CTRL_MISC1 e38
EMC_TRAINING_CA_VREF_CTRL e3c
EMC_TRAINING_CA_TADR_CTRL e40
EMC_TRAINING_SETTLE e44
EMC_TRAINING_DEBUG_CTRL e48
EMC_TRAINING_DEBUG_DQ0 e4c
EMC_TRAINING_DEBUG_DQ1 e50
EMC_TRAINING_DEBUG_DQ2 e54
EMC_TRAINING_DEBUG_DQ3 e58
EMC_TRAINING_MPC e5c
EMC_TRAINING_PATRAM_CTRL e60
EMC_TRAINING_PATRAM_DQ e64
EMC_TRAINING_PATRAM_DMI e68
EMC_TRAINING_VREF_SETTLE e6c
EMC_TRAINING_RW_EYE_CENTER_IB_BYTE0 e70
EMC_TRAINING_RW_EYE_CENTER_IB_BYTE1 e74
EMC_TRAINING_RW_EYE_CENTER_IB_BYTE2 e78
EMC_TRAINING_RW_EYE_CENTER_IB_BYTE3 e7c
EMC_TRAINING_RW_EYE_CENTER_IB_MISC e80
EMC_TRAINING_RW_EYE_CENTER_OB_BYTE0 e84
EMC_TRAINING_RW_EYE_CENTER_OB_BYTE1 e88
EMC_TRAINING_RW_EYE_CENTER_OB_BYTE2 e8c
EMC_TRAINING_RW_EYE_CENTER_OB_BYTE3 e90
EMC_TRAINING_RW_EYE_CENTER_OB_MISC e94
EMC_TRAINING_RW_OFFSET_IB_BYTE0 e98
EMC_TRAINING_RW_OFFSET_IB_BYTE1 e9c
EMC_TRAINING_RW_OFFSET_IB_BYTE2 ea0
EMC_TRAINING_RW_OFFSET_IB_BYTE3 ea4
EMC_TRAINING_RW_OFFSET_IB_MISC ea8
EMC_TRAINING_RW_OFFSET_OB_BYTE0 eac
EMC_TRAINING_RW_OFFSET_OB_BYTE1 eb0
EMC_TRAINING_RW_OFFSET_OB_BYTE2 eb4
EMC_TRAINING_RW_OFFSET_OB_BYTE3 eb8
EMC_TRAINING_RW_OFFSET_OB_MISC ebc
EMC_TRAINING_OPT_CA_VREF ec0
EMC_TRAINING_OPT_DQ_OB_VREF ec4
EMC_TRAINING_OPT_DQ_IB_VREF_RANK0 ec8
EMC_TRAINING_OPT_DQ_IB_VREF_RANK1 ecc
EMC_TRAINING_QUSE_VREF_CTRL ed0
EMC_TRAINING_OPT_DQS_IB_VREF_RANK0 ed4
EMC_TRAINING_OPT_DQS_IB_VREF_RANK1 ed8
EMC_TRAINING_DRAMC_TIMING edc
EMC_PMACRO_QUSE_DDLL_RANK0_0 600
EMC_PMACRO_QUSE_DDLL_RANK0_1 604
EMC_PMACRO_QUSE_DDLL_RANK0_2 608
EMC_PMACRO_QUSE_DDLL_RANK0_3 60c
EMC_PMACRO_QUSE_DDLL_RANK0_4 610
EMC_PMACRO_QUSE_DDLL_RANK0_5 614
EMC_PMACRO_QUSE_DDLL_RANK1_0 620
EMC_PMACRO_QUSE_DDLL_RANK1_1 624
EMC_PMACRO_QUSE_DDLL_RANK1_2 628
EMC_PMACRO_QUSE_DDLL_RANK1_3 62c
EMC_PMACRO_QUSE_DDLL_RANK1_4 630
EMC_PMACRO_QUSE_DDLL_RANK1_5 634
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0 640
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1 644
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2 648
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3 64c
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4 650
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5 654
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0 660
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1 664
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2 668
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3 66c
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4 670
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5 674
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0 680
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1 684
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2 688
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3 68c
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4 690
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5 694
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0 6a0
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1 6a4
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2 6a8
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3 6ac
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4 6b0
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5 6b4
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0 6c0
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1 6c4
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2 6c8
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3 6cc
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_4 6d0
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_5 6d4
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0 6e0
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1 6e4
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2 6e8
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3 6ec
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_4 6f0
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_5 6f4
EMC_PMACRO_TX_PWRD_0 720
EMC_PMACRO_TX_PWRD_1 724
EMC_PMACRO_TX_PWRD_2 728
EMC_PMACRO_TX_PWRD_3 72c
EMC_PMACRO_TX_PWRD_4 730
EMC_PMACRO_TX_PWRD_5 734
EMC_PMACRO_TX_SEL_CLK_SRC_0 740
EMC_PMACRO_TX_SEL_CLK_SRC_1 744
EMC_PMACRO_TX_SEL_CLK_SRC_3 74c
EMC_PMACRO_TX_SEL_CLK_SRC_2 748
EMC_PMACRO_TX_SEL_CLK_SRC_4 750
EMC_PMACRO_TX_SEL_CLK_SRC_5 754
EMC_PMACRO_DDLL_BYPASS 760
EMC_PMACRO_DDLL_PWRD_0 770
EMC_PMACRO_DDLL_PWRD_1 774
EMC_PMACRO_DDLL_PWRD_2 778
EMC_PMACRO_CMD_CTRL_0 780
EMC_PMACRO_CMD_CTRL_1 784
EMC_PMACRO_CMD_CTRL_2 788
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0 800
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1 804
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2 808
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3 80c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0 810
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1 814
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2 818
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3 81c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0 820
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1 824
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2 828
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3 82c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0 830
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1 834
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2 838
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3 83c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0 840
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1 844
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2 848
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3 84c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0 850
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1 854
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2 858
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3 85c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0 860
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1 864
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2 868
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3 86c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0 870
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1 874
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2 878
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3 87c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0 880
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1 884
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2 888
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3 88c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0 890
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1 894
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2 898
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3 89c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0 8a0
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1 8a4
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2 8a8
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3 8ac
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0 8b0
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1 8b4
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2 8b8
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3 8bc
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0 900
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1 904
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2 908
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3 90c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0 910
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1 914
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2 918
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3 91c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0 920
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1 924
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2 928
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3 92c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0 930
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1 934
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2 938
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3 93c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0 940
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1 944
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2 948
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3 94c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0 950
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1 954
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2 958
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3 95c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0 960
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1 964
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2 968
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3 96c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0 970
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1 974
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2 978
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3 97c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0 980
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1 984
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2 988
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3 98c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0 990
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1 994
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2 998
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3 99c
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0 9a0
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1 9a4
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2 9a8
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3 9ac
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0 9b0
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1 9b4
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2 9b8
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3 9bc
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0 a00
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1 a04
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2 a08
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0 a10
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1 a14
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2 a18
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0 a20
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1 a24
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2 a28
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0 a30
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1 a34
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2 a38
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0 a40
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1 a44
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2 a48
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0 a50
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1 a54
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2 a58
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0 a60
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1 a64
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2 a68
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0 a70
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1 a74
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2 a78
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_0 a80
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_1 a84
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD0_2 a88
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_0 a90
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_1 a94
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD1_2 a98
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_0 aa0
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_1 aa4
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD2_2 aa8
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_0 ab0
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_1 ab4
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_CMD3_2 ab8
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0 b00
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1 b04
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2 b08
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0 b10
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1 b14
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2 b18
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0 b20
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1 b24
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2 b28
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0 b30
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1 b34
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2 b38
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0 b40
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1 b44
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2 b48
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0 b50
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1 b54
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2 b58
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0 b60
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1 b64
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2 b68
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0 b70
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1 b74
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2 b78
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_0 b80
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_1 b84
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD0_2 b88
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_0 b90
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_1 b94
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD1_2 b98
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_0 ba0
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_1 ba4
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD2_2 ba8
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_0 bb0
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_1 bb4
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_CMD3_2 bb8
EMC_PMACRO_IB_VREF_DQ_0 be0
EMC_PMACRO_IB_VREF_DQ_1 be4
EMC_PMACRO_IB_VREF_DQ_2 be8
EMC_PMACRO_IB_VREF_DQS_0 bf0
EMC_PMACRO_IB_VREF_DQS_1 bf4
EMC_PMACRO_IB_VREF_DQS_2 bf8
EMC_PMACRO_IB_RXRT cf4
EMC_PMACRO_DDLL_LONG_CMD_0 c00
EMC_PMACRO_DDLL_LONG_CMD_1 c04
EMC_PMACRO_DDLL_LONG_CMD_2 c08
EMC_PMACRO_DDLL_LONG_CMD_3 c0c
EMC_PMACRO_DDLL_LONG_CMD_4 c10
EMC_PMACRO_DDLL_LONG_CMD_5 c14
EMC_PMACRO_DDLL_SHORT_CMD_0 c20
EMC_PMACRO_DDLL_SHORT_CMD_1 c24
EMC_PMACRO_DDLL_SHORT_CMD_2 c28
EMC_PMACRO_CFG_PM_GLOBAL_0 c30
EMC_PMACRO_VTTGEN_CTRL_0 c34
EMC_PMACRO_VTTGEN_CTRL_1 c38
EMC_PMACRO_VTTGEN_CTRL_2 cf0
EMC_PMACRO_BG_BIAS_CTRL_0 c3c
EMC_PMACRO_PAD_CFG_CTRL c40
EMC_PMACRO_CMD_PAD_RX_CTRL c50
EMC_PMACRO_DATA_PAD_RX_CTRL c54
EMC_PMACRO_CMD_RX_TERM_MODE c58
EMC_PMACRO_DATA_RX_TERM_MODE c5c
EMC_PMACRO_CMD_PAD_TX_CTRL c60
EMC_PMACRO_DATA_PAD_TX_CTRL c64
EMC_PMACRO_COMMON_PAD_TX_CTRL c68
EMC_PMACRO_BRICK_MAPPING_0 c80
EMC_PMACRO_BRICK_MAPPING_1 c84
EMC_PMACRO_BRICK_MAPPING_2 c88
EMC_PMACRO_DDLLCAL_CAL ce0
EMC_PMACRO_DDLL_OFFSET ce4
EMC_PMACRO_DDLL_PERIODIC_OFFSET ce8
EMC_PMACRO_BRICK_CTRL_RFU1 330
EMC_PMACRO_BRICK_CTRL_RFU2 334
EMC_PMACRO_CMD_BRICK_CTRL_FDPD 318
EMC_PMACRO_DATA_BRICK_CTRL_FDPD 31c
EMC_PMACRO_TRAINING_CTRL_0 cf8
EMC_PMACRO_TRAINING_CTRL_1 cfc
EMC_PMC_SCRATCH1 440
EMC_PMC_SCRATCH2 444
EMC_PMC_SCRATCH3 448

36
tools/fix_regs.py Normal file
View File

@ -0,0 +1,36 @@
import re
import sys
def parse_defs(fname):
f = open(fname, "r")
lines = f.readlines()
f.close()
res = {}
for l in lines:
p = [str(_.strip()) for _ in l.strip().split(" ", 1)]
res[int(p[1], 16)] = p[0]
return res
mc = parse_defs("mc.def")
emc = parse_defs("emc.def")
f = open(sys.argv[1], "r")
buf = f.read()
f.close()
def fix(m):
what = m.groups()[0]
off = int(m.groups()[1], 16)
if what == "MC":
if off in mc:
return "MC({0})".format(mc[off])
elif what == "EMC":
if off in emc:
return "EMC({0})".format(emc[off])
return "{0}(0x{1:X})".format(what, off)
buf = re.sub(r'([A-Z]+)\(0x([0-9a-fA-F]+)\)', fix, buf)
f = open(sys.argv[2], "w")
f.write(buf)
f.close()

16
tools/lz/Makefile Normal file
View File

@ -0,0 +1,16 @@
NATIVE_CC ?= gcc
ifeq (, $(shell which $(NATIVE_CC) 2>/dev/null))
$(error "Native GCC is missing. Please install it first. If it's path is custom, set it with export NATIVE_CC=<path to native gcc toolchain>")
endif
.PHONY: all clean
all: lz77
@echo > /dev/null
clean:
@rm -f lz77
lz77: lz.c lz77.c
@$(NATIVE_CC) -o $@ lz.c lz77.c

546
tools/lz/lz.c Normal file
View File

@ -0,0 +1,546 @@
//
// Name: lz.c
// Author: Marcus Geelnard
// Description: LZ77 coder/decoder implementation.
// Reentrant: Yes
// $ATH_LICENSE_NULL$
//
// The LZ77 compression scheme is a substitutional compression scheme
// proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in
// its design, and uses no fancy bit level compression.
//
// This is my first attempt at an implementation of a LZ77 code/decoder.
//
// The principle of the LZ77 compression algorithm is to store repeated
// occurrences of strings as references to previous occurrences of the same
// string. The point is that the reference consumes less space than the
// string itself, provided that the string is long enough (in this
// implementation, the string has to be at least 4 bytes long, since the
// minimum coded reference is 3 bytes long). Also note that the term
// "string" refers to any kind of byte sequence (it does not have to be
// an ASCII string, for instance).
//
// The coder uses a brute force approach to finding string matches in the
// history buffer (or "sliding window", if you wish), which is very, very
// slow. I recon the complexity is somewhere between O(n^2) and O(n^3),
// depending on the input data.
//
// There is also a faster implementation that uses a large working buffer
// in which a "jump table" is stored, which is used to quickly find
// possible string matches (see the source code for LZ_CompressFast() for
// more information). The faster method is an order of magnitude faster,
// but still quite slow compared to other compression methods.
//
// The upside is that decompression is very fast, and the compression ratio
// is often very good.
//
// The reference to a string is coded as a (length,offset) pair, where the
// length indicates the length of the string, and the offset gives the
// offset from the current data position. To distinguish between string
// references and literal strings (uncompressed bytes), a string reference
// is preceded by a marker byte, which is chosen as the least common byte
// symbol in the input data stream (this marker byte is stored in the
// output stream as the first byte).
//
// Occurrences of the marker byte in the stream are encoded as the marker
// byte followed by a zero byte, which means that occurrences of the marker
// byte have to be coded with two bytes.
//
// The lengths and offsets are coded in a variable length fashion, allowing
// values of any magnitude (up to 4294967295 in this implementation).
//
// With this compression scheme, the worst case compression result is
// (257/256)*insize + 1.
//
//------------------------------------------------------------------------
// Copyright (c) 2003-2006 Marcus Geelnard
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
// Marcus Geelnard
// marcus.geelnard at home.se
//
//
// This file has been altered from the original version.
//
/*************************************************************************
* Constants used for LZ77 coding
*************************************************************************/
/* Maximum offset (can be any size < 2^31). Lower values give faster
compression, while higher values gives better compression. The default
value of 100000 is quite high. Experiment to see what works best for
you. */
#define LZ_MAX_OFFSET 100000
/*************************************************************************
* INTERNAL FUNCTIONS *
*************************************************************************/
/*************************************************************************
* _LZ_StringCompare() - Return maximum length string match.
*************************************************************************/
static unsigned int _LZ_StringCompare( unsigned char * str1,
unsigned char * str2, unsigned int minlen, unsigned int maxlen )
{
unsigned int len;
for( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len );
return len;
}
/*************************************************************************
* _LZ_WriteVarSize() - Write unsigned integer with variable number of
* bytes depending on value.
*************************************************************************/
static int _LZ_WriteVarSize( unsigned int x, unsigned char * buf )
{
unsigned int y;
int num_bytes, i, b;
/* Determine number of bytes needed to store the number x */
y = x >> 3;
for( num_bytes = 5; num_bytes >= 2; -- num_bytes )
{
if( y & 0xfe000000 ) break;
y <<= 7;
}
/* Write all bytes, seven bits in each, with 8:th bit set for all */
/* but the last byte. */
for( i = num_bytes-1; i >= 0; -- i )
{
b = (x >> (i*7)) & 0x0000007f;
if( i > 0 )
{
b |= 0x00000080;
}
*buf ++ = (unsigned char) b;
}
/* Return number of bytes written */
return num_bytes;
}
/*************************************************************************
* _LZ_ReadVarSize() - Read unsigned integer with variable number of
* bytes depending on value.
*************************************************************************/
static int _LZ_ReadVarSize( unsigned int * x, unsigned char * buf )
{
unsigned int y, b, num_bytes;
/* Read complete value (stop when byte contains zero in 8:th bit) */
y = 0;
num_bytes = 0;
do
{
b = (unsigned int) (*buf ++);
y = (y << 7) | (b & 0x0000007f);
++ num_bytes;
}
while( b & 0x00000080 );
/* Store value in x */
*x = y;
/* Return number of bytes read */
return num_bytes;
}
/*************************************************************************
* PUBLIC FUNCTIONS *
*************************************************************************/
/*************************************************************************
* LZ_Compress() - Compress a block of data using an LZ77 coder.
* in - Input (uncompressed) buffer.
* out - Output (compressed) buffer. This buffer must be 0.4% larger
* than the input buffer, plus one byte.
* insize - Number of input bytes.
* The function returns the size of the compressed data.
*************************************************************************/
int LZ_Compress( unsigned char *in, unsigned char *out,
unsigned int insize )
{
unsigned char marker, symbol;
unsigned int inpos, outpos, bytesleft, i;
unsigned int maxoffset, offset, bestoffset;
unsigned int maxlength, length, bestlength;
unsigned int histogram[ 256 ];
unsigned char *ptr1, *ptr2;
/* Do we have anything to compress? */
if( insize < 1 )
{
return 0;
}
/* Create histogram */
for( i = 0; i < 256; ++ i )
{
histogram[ i ] = 0;
}
for( i = 0; i < insize; ++ i )
{
++ histogram[ in[ i ] ];
}
/* Find the least common byte, and use it as the marker symbol */
marker = 0;
for( i = 1; i < 256; ++ i )
{
if( histogram[ i ] < histogram[ marker ] )
{
marker = i;
}
}
/* Remember the marker symbol for the decoder */
out[ 0 ] = marker;
/* Start of compression */
inpos = 0;
outpos = 1;
/* Main compression loop */
bytesleft = insize;
do
{
/* Determine most distant position */
if( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET;
else maxoffset = inpos;
/* Get pointer to current position */
ptr1 = &in[ inpos ];
/* Search history window for maximum length string match */
bestlength = 3;
bestoffset = 0;
for( offset = 3; offset <= maxoffset; ++ offset )
{
/* Get pointer to candidate string */
ptr2 = &ptr1[ -(int)offset ];
/* Quickly determine if this is a candidate (for speed) */
if( (ptr1[ 0 ] == ptr2[ 0 ]) &&
(ptr1[ bestlength ] == ptr2[ bestlength ]) )
{
/* Determine maximum length for this offset */
maxlength = (bytesleft < offset ? bytesleft : offset);
/* Count maximum length match at this offset */
length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength );
/* Better match than any previous match? */
if( length > bestlength )
{
bestlength = length;
bestoffset = offset;
}
}
}
/* Was there a good enough match? */
if( (bestlength >= 8) ||
((bestlength == 4) && (bestoffset <= 0x0000007f)) ||
((bestlength == 5) && (bestoffset <= 0x00003fff)) ||
((bestlength == 6) && (bestoffset <= 0x001fffff)) ||
((bestlength == 7) && (bestoffset <= 0x0fffffff)) )
{
out[ outpos ++ ] = (unsigned char) marker;
outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] );
outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] );
inpos += bestlength;
bytesleft -= bestlength;
}
else
{
/* Output single byte (or two bytes if marker byte) */
symbol = in[ inpos ++ ];
out[ outpos ++ ] = symbol;
if( symbol == marker )
{
out[ outpos ++ ] = 0;
}
-- bytesleft;
}
}
while( bytesleft > 3 );
/* Dump remaining bytes, if any */
while( inpos < insize )
{
if( in[ inpos ] == marker )
{
out[ outpos ++ ] = marker;
out[ outpos ++ ] = 0;
}
else
{
out[ outpos ++ ] = in[ inpos ];
}
++ inpos;
}
return outpos;
}
/*************************************************************************
* LZ_CompressFast() - Compress a block of data using an LZ77 coder.
* in - Input (uncompressed) buffer.
* out - Output (compressed) buffer. This buffer must be 0.4% larger
* than the input buffer, plus one byte.
* insize - Number of input bytes.
* work - Pointer to a temporary buffer (internal working buffer), which
* must be able to hold (insize+65536) unsigned integers.
* The function returns the size of the compressed data.
*************************************************************************/
int LZ_CompressFast( unsigned char *in, unsigned char *out,
unsigned int insize, unsigned int *work )
{
unsigned char marker, symbol;
unsigned int inpos, outpos, bytesleft, i, index, symbols;
unsigned int offset, bestoffset;
unsigned int maxlength, length, bestlength;
unsigned int histogram[ 256 ], *lastindex, *jumptable;
unsigned char *ptr1, *ptr2;
/* Do we have anything to compress? */
if( insize < 1 )
{
return 0;
}
/* Assign arrays to the working area */
lastindex = work;
jumptable = &work[ 65536 ];
/* Build a "jump table". Here is how the jump table works:
jumptable[i] points to the nearest previous occurrence of the same
symbol pair as in[i]:in[i+1], so in[i] == in[jumptable[i]] and
in[i+1] == in[jumptable[i]+1], and so on... Following the jump table
gives a dramatic boost for the string search'n'match loop compared
to doing a brute force search. The jump table is built in O(n) time,
so it is a cheap operation in terms of time, but it is expensice in
terms of memory consumption. */
for( i = 0; i < 65536; ++ i )
{
lastindex[ i ] = 0xffffffff;
}
for( i = 0; i < insize-1; ++ i )
{
symbols = (((unsigned int)in[i]) << 8) | ((unsigned int)in[i+1]);
index = lastindex[ symbols ];
lastindex[ symbols ] = i;
jumptable[ i ] = index;
}
jumptable[ insize-1 ] = 0xffffffff;
/* Create histogram */
for( i = 0; i < 256; ++ i )
{
histogram[ i ] = 0;
}
for( i = 0; i < insize; ++ i )
{
++ histogram[ in[ i ] ];
}
/* Find the least common byte, and use it as the marker symbol */
marker = 0;
for( i = 1; i < 256; ++ i )
{
if( histogram[ i ] < histogram[ marker ] )
{
marker = i;
}
}
/* Remember the marker symbol for the decoder */
out[ 0 ] = marker;
/* Start of compression */
inpos = 0;
outpos = 1;
/* Main compression loop */
bytesleft = insize;
do
{
/* Get pointer to current position */
ptr1 = &in[ inpos ];
/* Search history window for maximum length string match */
bestlength = 3;
bestoffset = 0;
index = jumptable[ inpos ];
while( (index != 0xffffffff) && ((inpos - index) < LZ_MAX_OFFSET) )
{
/* Get pointer to candidate string */
ptr2 = &in[ index ];
/* Quickly determine if this is a candidate (for speed) */
if( ptr2[ bestlength ] == ptr1[ bestlength ] )
{
/* Determine maximum length for this offset */
offset = inpos - index;
maxlength = (bytesleft < offset ? bytesleft : offset);
/* Count maximum length match at this offset */
length = _LZ_StringCompare( ptr1, ptr2, 2, maxlength );
/* Better match than any previous match? */
if( length > bestlength )
{
bestlength = length;
bestoffset = offset;
}
}
/* Get next possible index from jump table */
index = jumptable[ index ];
}
/* Was there a good enough match? */
if( (bestlength >= 8) ||
((bestlength == 4) && (bestoffset <= 0x0000007f)) ||
((bestlength == 5) && (bestoffset <= 0x00003fff)) ||
((bestlength == 6) && (bestoffset <= 0x001fffff)) ||
((bestlength == 7) && (bestoffset <= 0x0fffffff)) )
{
out[ outpos ++ ] = (unsigned char) marker;
outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] );
outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] );
inpos += bestlength;
bytesleft -= bestlength;
}
else
{
/* Output single byte (or two bytes if marker byte) */
symbol = in[ inpos ++ ];
out[ outpos ++ ] = symbol;
if( symbol == marker )
{
out[ outpos ++ ] = 0;
}
-- bytesleft;
}
}
while( bytesleft > 3 );
/* Dump remaining bytes, if any */
while( inpos < insize )
{
if( in[ inpos ] == marker )
{
out[ outpos ++ ] = marker;
out[ outpos ++ ] = 0;
}
else
{
out[ outpos ++ ] = in[ inpos ];
}
++ inpos;
}
return outpos;
}
/*************************************************************************
* LZ_Uncompress() - Uncompress a block of data using an LZ77 decoder.
* in - Input (compressed) buffer.
* out - Output (uncompressed) buffer. This buffer must be large
* enough to hold the uncompressed data.
* insize - Number of input bytes.
*************************************************************************/
int LZ_Uncompress( unsigned char *in, unsigned char *out,
unsigned int insize )
{
unsigned char marker, symbol;
unsigned int i, inpos, outpos, length, offset;
/* Do we have anything to uncompress? */
if( insize < 1 )
{
return 0;
}
/* Get marker symbol from input stream */
marker = in[ 0 ];
inpos = 1;
/* Main decompression loop */
outpos = 0;
do
{
symbol = in[ inpos ++ ];
if( symbol == marker )
{
/* We had a marker byte */
if( in[ inpos ] == 0 )
{
/* It was a single occurrence of the marker byte */
out[ outpos ++ ] = marker;
++ inpos;
}
else
{
/* Extract true length and offset */
inpos += _LZ_ReadVarSize( &length, &in[ inpos ] );
inpos += _LZ_ReadVarSize( &offset, &in[ inpos ] );
/* Copy corresponding data from history window */
for( i = 0; i < length; ++ i )
{
out[ outpos ] = out[ outpos - offset ];
++ outpos;
}
}
}
else
{
/* No marker, plain copy */
out[ outpos ++ ] = symbol;
}
}
while( inpos < insize );
return outpos;
}

61
tools/lz/lz.h Normal file
View File

@ -0,0 +1,61 @@
//
// Name: lz.h
// Author: Marcus Geelnard
// Description: LZ77 coder/decoder interface.
// Reentrant: Yes
// ------------------------------------------------------------------------
// $ATH_LICENSE_NULL$
// Copyright (c) 2003-2006 Marcus Geelnard
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would
// be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not
// be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
// Marcus Geelnard
// marcus.geelnard at home.se
//
//
// This file has been altered from the original version.
//
#ifndef _lz_h_
#define _lz_h_
#ifdef __cplusplus
extern "C" {
#endif
/*************************************************************************
* Function prototypes
*************************************************************************/
int LZ_Compress( unsigned char *in, unsigned char *out,
unsigned int insize );
int LZ_CompressFast( unsigned char *in, unsigned char *out,
unsigned int insize, unsigned int *work );
int LZ_Uncompress( unsigned char *in, unsigned char *out,
unsigned int insize );
#ifdef __cplusplus
}
#endif
#endif /* _lz_h_ */

93
tools/lz/lz77.c Normal file
View File

@ -0,0 +1,93 @@
/*
* Copyright (c) 2019 CTCaer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/stat.h>
#include "lz.h"
char filename[1024];
int main(int argc, char *argv[])
{
int nbytes;
int filename_len;
struct stat statbuf;
FILE *in_file, *out_file;
if(stat(argv[1], &statbuf))
goto error;
if((in_file=fopen(argv[1], "rb")) == NULL)
goto error;
strcpy(filename, argv[1]);
filename_len = strlen(filename);
uint32_t in_size = statbuf.st_size;
uint8_t *in_buf = (uint8_t *)malloc(in_size);
uint32_t out_size = statbuf.st_size + 257;
uint8_t *out_buf = (uint8_t *)malloc(out_size);
if(!(in_buf && out_buf))
goto error;
if(fread(in_buf, 1, in_size, in_file) != in_size)
goto error;
fclose(in_file);
uint32_t *work = (uint32_t*)malloc(sizeof(uint32_t) * (in_size + 65536));
for (int i = 0; i < 2; i++)
{
uint32_t in_size_tmp;
if (!i)
{
in_size_tmp = in_size / 2;
strcpy(filename + filename_len, ".00.lz");
}
else
{
in_size_tmp = in_size - (in_size / 2);
strcpy(filename + filename_len, ".01.lz");
}
if (work)
nbytes = LZ_CompressFast(in_buf + (in_size / 2) * i, out_buf, in_size_tmp, work);
else
goto error;
if (nbytes > out_size)
goto error;
if((out_file = fopen(filename,"wb")) == NULL)
goto error;
if (fwrite(out_buf, 1, nbytes, out_file) != nbytes)
goto error;
fclose(out_file);
}
return 0;
error:
fprintf(stderr, "Failed to compress: %s\n", argv[1]);
exit(1);
}

448
tools/mc.def Normal file
View File

@ -0,0 +1,448 @@
MC_INTSTATUS 0
MC_INTMASK 4
MC_ERR_STATUS 8
MC_ERR_ADR c
MC_PCFIFO_CLIENT_CONFIG0 dd0
MC_PCFIFO_CLIENT_CONFIG1 dd4
MC_PCFIFO_CLIENT_CONFIG2 dd8
MC_PCFIFO_CLIENT_CONFIG3 ddc
MC_PCFIFO_CLIENT_CONFIG4 de0
MC_EMEM_CFG 50
MC_EMEM_ADR_CFG 54
MC_EMEM_ADR_CFG_DEV0 58
MC_EMEM_ADR_CFG_DEV1 5c
MC_EMEM_ADR_CFG_CHANNEL_MASK 60
MC_EMEM_ADR_CFG_BANK_MASK_0 64
MC_EMEM_ADR_CFG_BANK_MASK_1 68
MC_EMEM_ADR_CFG_BANK_MASK_2 6c
MC_SECURITY_CFG0 70
MC_SECURITY_CFG1 74
MC_SECURITY_CFG3 9bc
MC_SECURITY_RSV 7c
MC_EMEM_ARB_CFG 90
MC_EMEM_ARB_OUTSTANDING_REQ 94
MC_EMEM_ARB_TIMING_RCD 98
MC_EMEM_ARB_TIMING_RP 9c
MC_EMEM_ARB_TIMING_RC a0
MC_EMEM_ARB_TIMING_RAS a4
MC_EMEM_ARB_TIMING_FAW a8
MC_EMEM_ARB_TIMING_RRD ac
MC_EMEM_ARB_TIMING_RAP2PRE b0
MC_EMEM_ARB_TIMING_WAP2PRE b4
MC_EMEM_ARB_TIMING_R2R b8
MC_EMEM_ARB_TIMING_W2W bc
MC_EMEM_ARB_TIMING_R2W c0
MC_EMEM_ARB_TIMING_W2R c4
MC_EMEM_ARB_TIMING_RFCPB 6c0
MC_EMEM_ARB_TIMING_CCDMW 6c4
MC_EMEM_ARB_REFPB_HP_CTRL 6f0
MC_EMEM_ARB_REFPB_BANK_CTRL 6f4
MC_EMEM_ARB_DA_TURNS d0
MC_EMEM_ARB_DA_COVERS d4
MC_EMEM_ARB_MISC0 d8
MC_EMEM_ARB_MISC1 dc
MC_EMEM_ARB_MISC2 c8
MC_EMEM_ARB_RING1_THROTTLE e0
MC_EMEM_ARB_RING3_THROTTLE e4
MC_EMEM_ARB_NISO_THROTTLE 6b0
MC_EMEM_ARB_OVERRIDE e8
MC_EMEM_ARB_RSV ec
MC_CLKEN_OVERRIDE f4
MC_TIMING_CONTROL_DBG f8
MC_TIMING_CONTROL fc
MC_STAT_CONTROL 100
MC_STAT_STATUS 104
MC_STAT_EMC_CLOCK_LIMIT 108
MC_STAT_EMC_CLOCK_LIMIT_MSBS 10c
MC_STAT_EMC_CLOCKS 110
MC_STAT_EMC_CLOCKS_MSBS 114
MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_LO 118
MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_LO 158
MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_HI 11c
MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_HI 15c
MC_STAT_EMC_FILTER_SET0_ADR_LIMIT_UPPER a20
MC_STAT_EMC_FILTER_SET1_ADR_LIMIT_UPPER a24
MC_STAT_EMC_FILTER_SET0_VIRTUAL_ADR_LIMIT_LO 198
MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_LO 1a8
MC_STAT_EMC_FILTER_SET0_VIRTUAL_ADR_LIMIT_HI 19c
MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_HI 1ac
MC_STAT_EMC_FILTER_SET0_VIRTUAL_ADR_LIMIT_UPPER a28
MC_STAT_EMC_FILTER_SET1_VIRTUAL_ADR_LIMIT_UPPER a2c
MC_STAT_EMC_FILTER_SET0_ASID 1a0
MC_STAT_EMC_FILTER_SET1_ASID 1b0
MC_STAT_EMC_FILTER_SET0_SLACK_LIMIT 120
MC_STAT_EMC_FILTER_SET1_SLACK_LIMIT 160
MC_STAT_EMC_FILTER_SET0_CLIENT_0 128
MC_STAT_EMC_FILTER_SET1_CLIENT_0 168
MC_STAT_EMC_FILTER_SET0_CLIENT_1 12c
MC_STAT_EMC_FILTER_SET1_CLIENT_1 16c
MC_STAT_EMC_FILTER_SET0_CLIENT_2 130
MC_STAT_EMC_FILTER_SET1_CLIENT_2 170
MC_STAT_EMC_FILTER_SET0_CLIENT_3 134
MC_STAT_EMC_FILTER_SET0_CLIENT_4 b88
MC_STAT_EMC_FILTER_SET1_CLIENT_3 174
MC_STAT_EMC_FILTER_SET1_CLIENT_4 b8c
MC_STAT_EMC_SET0_COUNT 138
MC_STAT_EMC_SET0_COUNT_MSBS 13c
MC_STAT_EMC_SET1_COUNT 178
MC_STAT_EMC_SET1_COUNT_MSBS 17c
MC_STAT_EMC_SET0_SLACK_ACCUM 140
MC_STAT_EMC_SET0_SLACK_ACCUM_MSBS 144
MC_STAT_EMC_SET1_SLACK_ACCUM 180
MC_STAT_EMC_SET1_SLACK_ACCUM_MSBS 184
MC_STAT_EMC_SET0_HISTO_COUNT 148
MC_STAT_EMC_SET0_HISTO_COUNT_MSBS 14c
MC_STAT_EMC_SET1_HISTO_COUNT 188
MC_STAT_EMC_SET1_HISTO_COUNT_MSBS 18c
MC_STAT_EMC_SET0_MINIMUM_SLACK_OBSERVED 150
MC_STAT_EMC_SET1_MINIMUM_SLACK_OBSERVED 190
MC_STAT_EMC_SET0_IDLE_CYCLE_COUNT 1b8
MC_STAT_EMC_SET0_IDLE_CYCL_COUNT_MSBS 1bc
MC_STAT_EMC_SET1_IDLE_CYCLE_COUNT 1c8
MC_STAT_EMC_SET1_IDLE_CYCL_COUNT_MSBS 1cc
MC_STAT_EMC_SET0_IDLE_CYCLE_PARTITION_SELECT 1c0
MC_STAT_EMC_SET1_IDLE_CYCLE_PARTITION_SELECT 1d0
MC_CLIENT_HOTRESET_CTRL 200
MC_CLIENT_HOTRESET_CTRL_1 970
MC_CLIENT_HOTRESET_STATUS 204
MC_CLIENT_HOTRESET_STATUS_1 974
MC_EMEM_ARB_ISOCHRONOUS_0 208
MC_EMEM_ARB_ISOCHRONOUS_1 20c
MC_EMEM_ARB_ISOCHRONOUS_2 210
MC_EMEM_ARB_ISOCHRONOUS_3 214
MC_EMEM_ARB_ISOCHRONOUS_4 b94
MC_EMEM_ARB_HYSTERESIS_0 218
MC_EMEM_ARB_HYSTERESIS_1 21c
MC_EMEM_ARB_HYSTERESIS_2 220
MC_EMEM_ARB_HYSTERESIS_3 224
MC_EMEM_ARB_HYSTERESIS_4 b84
MC_EMEM_ARB_DHYSTERESIS_0 bb0
MC_EMEM_ARB_DHYSTERESIS_1 bb4
MC_EMEM_ARB_DHYSTERESIS_2 bb8
MC_EMEM_ARB_DHYSTERESIS_3 bbc
MC_EMEM_ARB_DHYSTERESIS_4 bc0
MC_EMEM_ARB_DHYST_CTRL bcc
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0 bd0
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1 bd4
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2 bd8
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3 bdc
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4 be0
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5 be4
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6 be8
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7 bec
MC_RESERVED_RSV 3fc
MC_DISB_EXTRA_SNAP_LEVELS 408
MC_APB_EXTRA_SNAP_LEVELS 2a4
MC_AHB_EXTRA_SNAP_LEVELS 2a0
MC_USBD_EXTRA_SNAP_LEVELS a18
MC_ISP_EXTRA_SNAP_LEVELS a08
MC_AUD_EXTRA_SNAP_LEVELS a10
MC_MSE_EXTRA_SNAP_LEVELS 40c
MC_GK2_EXTRA_SNAP_LEVELS a40
MC_A9AVPPC_EXTRA_SNAP_LEVELS 414
MC_FTOP_EXTRA_SNAP_LEVELS 2bc
MC_JPG_EXTRA_SNAP_LEVELS a3c
MC_HOST_EXTRA_SNAP_LEVELS a14
MC_SAX_EXTRA_SNAP_LEVELS 2c0
MC_DIS_EXTRA_SNAP_LEVELS 2ac
MC_VICPC_EXTRA_SNAP_LEVELS a1c
MC_HDAPC_EXTRA_SNAP_LEVELS a48
MC_AVP_EXTRA_SNAP_LEVELS 2a8
MC_USBX_EXTRA_SNAP_LEVELS 404
MC_PCX_EXTRA_SNAP_LEVELS 2b8
MC_SD_EXTRA_SNAP_LEVELS a04
MC_DFD_EXTRA_SNAP_LEVELS a4c
MC_VE_EXTRA_SNAP_LEVELS 2d8
MC_GK_EXTRA_SNAP_LEVELS a00
MC_VE2_EXTRA_SNAP_LEVELS 410
MC_SDM_EXTRA_SNAP_LEVELS a44
MC_VIDEO_PROTECT_BOM 648
MC_VIDEO_PROTECT_SIZE_MB 64c
MC_VIDEO_PROTECT_BOM_ADR_HI 978
MC_VIDEO_PROTECT_REG_CTRL 650
MC_ERR_VPR_STATUS 654
MC_ERR_VPR_ADR 658
MC_VIDEO_PROTECT_VPR_OVERRIDE 418
MC_VIDEO_PROTECT_VPR_OVERRIDE1 590
MC_IRAM_BOM 65c
MC_IRAM_TOM 660
MC_IRAM_ADR_HI 980
MC_IRAM_REG_CTRL 964
MC_EMEM_CFG_ACCESS_CTRL 664
MC_TZ_SECURITY_CTRL 668
MC_EMEM_ARB_OUTSTANDING_REQ_RING3 66c
MC_EMEM_ARB_OUTSTANDING_REQ_NISO 6b4
MC_EMEM_ARB_RING0_THROTTLE_MASK 6bc
MC_EMEM_ARB_NISO_THROTTLE_MASK 6b8
MC_EMEM_ARB_NISO_THROTTLE_MASK_1 b80
MC_SEC_CARVEOUT_BOM 670
MC_SEC_CARVEOUT_SIZE_MB 674
MC_SEC_CARVEOUT_ADR_HI 9d4
MC_SEC_CARVEOUT_REG_CTRL 678
MC_ERR_SEC_STATUS 67c
MC_ERR_SEC_ADR 680
MC_PC_IDLE_CLOCK_GATE_CONFIG 684
MC_STUTTER_CONTROL 688
MC_RESERVED_RSV_1 958
MC_DVFS_PIPE_SELECT 95c
MC_AHB_PTSA_MIN 4e0
MC_AUD_PTSA_MIN 54c
MC_MLL_MPCORER_PTSA_RATE 44c
MC_RING2_PTSA_RATE 440
MC_USBD_PTSA_RATE 530
MC_USBX_PTSA_MIN 528
MC_USBD_PTSA_MIN 534
MC_APB_PTSA_MAX 4f0
MC_JPG_PTSA_RATE 584
MC_DIS_PTSA_MIN 420
MC_AVP_PTSA_MAX 4fc
MC_AVP_PTSA_RATE 4f4
MC_RING1_PTSA_MIN 480
MC_DIS_PTSA_MAX 424
MC_SD_PTSA_MAX 4d8
MC_MSE_PTSA_RATE 4c4
MC_VICPC_PTSA_MIN 558
MC_PCX_PTSA_MAX 4b4
MC_ISP_PTSA_RATE 4a0
MC_A9AVPPC_PTSA_MIN 48c
MC_RING2_PTSA_MAX 448
MC_AUD_PTSA_RATE 548
MC_HOST_PTSA_MIN 51c
MC_MLL_MPCORER_PTSA_MAX 454
MC_SD_PTSA_MIN 4d4
MC_RING1_PTSA_RATE 47c
MC_JPG_PTSA_MIN 588
MC_HDAPC_PTSA_MIN 62c
MC_AVP_PTSA_MIN 4f8
MC_JPG_PTSA_MAX 58c
MC_VE_PTSA_MAX 43c
MC_DFD_PTSA_MAX 63c
MC_VICPC_PTSA_RATE 554
MC_GK_PTSA_MAX 544
MC_VICPC_PTSA_MAX 55c
MC_SDM_PTSA_MAX 624
MC_SAX_PTSA_RATE 4b8
MC_PCX_PTSA_MIN 4b0
MC_APB_PTSA_MIN 4ec
MC_GK2_PTSA_MIN 614
MC_PCX_PTSA_RATE 4ac
MC_RING1_PTSA_MAX 484
MC_HDAPC_PTSA_RATE 628
MC_MLL_MPCORER_PTSA_MIN 450
MC_GK2_PTSA_MAX 618
MC_AUD_PTSA_MAX 550
MC_GK2_PTSA_RATE 610
MC_ISP_PTSA_MAX 4a8
MC_DISB_PTSA_RATE 428
MC_VE2_PTSA_MAX 49c
MC_DFD_PTSA_MIN 638
MC_FTOP_PTSA_RATE 50c
MC_A9AVPPC_PTSA_RATE 488
MC_VE2_PTSA_MIN 498
MC_USBX_PTSA_MAX 52c
MC_DIS_PTSA_RATE 41c
MC_USBD_PTSA_MAX 538
MC_A9AVPPC_PTSA_MAX 490
MC_USBX_PTSA_RATE 524
MC_FTOP_PTSA_MAX 514
MC_HDAPC_PTSA_MAX 630
MC_SD_PTSA_RATE 4d0
MC_DFD_PTSA_RATE 634
MC_FTOP_PTSA_MIN 510
MC_SDM_PTSA_RATE 61c
MC_AHB_PTSA_RATE 4dc
MC_SMMU_SMMU_PTSA_MAX 460
MC_RING2_PTSA_MIN 444
MC_SDM_PTSA_MIN 620
MC_APB_PTSA_RATE 4e8
MC_MSE_PTSA_MIN 4c8
MC_HOST_PTSA_RATE 518
MC_VE_PTSA_RATE 434
MC_AHB_PTSA_MAX 4e4
MC_SAX_PTSA_MIN 4bc
MC_SMMU_SMMU_PTSA_MIN 45c
MC_ISP_PTSA_MIN 4a4
MC_HOST_PTSA_MAX 520
MC_SAX_PTSA_MAX 4c0
MC_VE_PTSA_MIN 438
MC_GK_PTSA_MIN 540
MC_MSE_PTSA_MAX 4cc
MC_DISB_PTSA_MAX 430
MC_DISB_PTSA_MIN 42c
MC_SMMU_SMMU_PTSA_RATE 458
MC_VE2_PTSA_RATE 494
MC_GK_PTSA_RATE 53c
MC_PTSA_GRANT_DECREMENT 960
MC_LATENCY_ALLOWANCE_AVPC_0 2e4
MC_LATENCY_ALLOWANCE_AXIAP_0 3a0
MC_LATENCY_ALLOWANCE_XUSB_1 380
MC_LATENCY_ALLOWANCE_ISP2B_0 384
MC_LATENCY_ALLOWANCE_SDMMCAA_0 3bc
MC_LATENCY_ALLOWANCE_SDMMCA_0 3b8
MC_LATENCY_ALLOWANCE_ISP2_0 370
MC_LATENCY_ALLOWANCE_SE_0 3e0
MC_LATENCY_ALLOWANCE_ISP2_1 374
MC_LATENCY_ALLOWANCE_DC_0 2e8
MC_LATENCY_ALLOWANCE_VIC_0 394
MC_LATENCY_ALLOWANCE_DCB_1 2f8
MC_LATENCY_ALLOWANCE_NVDEC_0 3d8
MC_LATENCY_ALLOWANCE_DCB_2 2fc
MC_LATENCY_ALLOWANCE_TSEC_0 390
MC_LATENCY_ALLOWANCE_DC_2 2f0
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB 694
MC_LATENCY_ALLOWANCE_PPCS_1 348
MC_LATENCY_ALLOWANCE_XUSB_0 37c
MC_LATENCY_ALLOWANCE_PPCS_0 344
MC_LATENCY_ALLOWANCE_TSECB_0 3f0
MC_LATENCY_ALLOWANCE_AFI_0 2e0
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B 698
MC_LATENCY_ALLOWANCE_DC_1 2ec
MC_LATENCY_ALLOWANCE_APE_0 3dc
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C 6a0
MC_LATENCY_ALLOWANCE_A9AVP_0 3a4
MC_LATENCY_ALLOWANCE_GPU2_0 3e8
MC_LATENCY_ALLOWANCE_DCB_0 2f4
MC_LATENCY_ALLOWANCE_HC_1 314
MC_LATENCY_ALLOWANCE_SDMMC_0 3c0
MC_LATENCY_ALLOWANCE_NVJPG_0 3e4
MC_LATENCY_ALLOWANCE_PTC_0 34c
MC_LATENCY_ALLOWANCE_ETR_0 3ec
MC_LATENCY_ALLOWANCE_MPCORE_0 320
MC_LATENCY_ALLOWANCE_VI2_0 398
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB 69c
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB 6a4
MC_LATENCY_ALLOWANCE_SATA_0 350
MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A 690
MC_LATENCY_ALLOWANCE_HC_0 310
MC_LATENCY_ALLOWANCE_DC_3 3c8
MC_LATENCY_ALLOWANCE_GPU_0 3ac
MC_LATENCY_ALLOWANCE_SDMMCAB_0 3c4
MC_LATENCY_ALLOWANCE_ISP2B_1 388
MC_LATENCY_ALLOWANCE_NVENC_0 328
MC_LATENCY_ALLOWANCE_HDA_0 318
MC_MIN_LENGTH_APE_0 b34
MC_MIN_LENGTH_DCB_2 8a8
MC_MIN_LENGTH_A9AVP_0 950
MC_MIN_LENGTH_TSEC_0 93c
MC_MIN_LENGTH_DC_1 898
MC_MIN_LENGTH_AXIAP_0 94c
MC_MIN_LENGTH_ISP2B_0 930
MC_MIN_LENGTH_VI2_0 944
MC_MIN_LENGTH_DCB_0 8a0
MC_MIN_LENGTH_DCB_1 8a4
MC_MIN_LENGTH_PPCS_1 8f4
MC_MIN_LENGTH_NVJPG_0 b3c
MC_MIN_LENGTH_HDA_0 8c4
MC_MIN_LENGTH_NVENC_0 8d4
MC_MIN_LENGTH_SDMMC_0 b18
MC_MIN_LENGTH_ISP2B_1 934
MC_MIN_LENGTH_HC_1 8c0
MC_MIN_LENGTH_DC_3 b20
MC_MIN_LENGTH_AVPC_0 890
MC_MIN_LENGTH_VIC_0 940
MC_MIN_LENGTH_ISP2_0 91c
MC_MIN_LENGTH_HC_0 8bc
MC_MIN_LENGTH_SE_0 b38
MC_MIN_LENGTH_NVDEC_0 b30
MC_MIN_LENGTH_SATA_0 8fc
MC_MIN_LENGTH_DC_0 894
MC_MIN_LENGTH_XUSB_1 92c
MC_MIN_LENGTH_DC_2 89c
MC_MIN_LENGTH_SDMMCAA_0 b14
MC_MIN_LENGTH_GPU_0 b04
MC_MIN_LENGTH_ETR_0 b44
MC_MIN_LENGTH_AFI_0 88c
MC_MIN_LENGTH_PPCS_0 8f0
MC_MIN_LENGTH_ISP2_1 920
MC_MIN_LENGTH_XUSB_0 928
MC_MIN_LENGTH_MPCORE_0 8cc
MC_MIN_LENGTH_TSECB_0 b48
MC_MIN_LENGTH_SDMMCA_0 b10
MC_MIN_LENGTH_GPU2_0 b40
MC_MIN_LENGTH_SDMMCAB_0 b1c
MC_MIN_LENGTH_PTC_0 8f8
MC_EMEM_ARB_OVERRIDE_1 968
MC_VIDEO_PROTECT_GPU_OVERRIDE_0 984
MC_VIDEO_PROTECT_GPU_OVERRIDE_1 988
MC_EMEM_ARB_STATS_0 990
MC_EMEM_ARB_STATS_1 994
MC_MTS_CARVEOUT_BOM 9a0
MC_MTS_CARVEOUT_SIZE_MB 9a4
MC_MTS_CARVEOUT_ADR_HI 9a8
MC_MTS_CARVEOUT_REG_CTRL 9ac
MC_ERR_MTS_STATUS 9b0
MC_ERR_MTS_ADR 9b4
MC_ERR_GENERALIZED_CARVEOUT_STATUS c00
MC_ERR_GENERALIZED_CARVEOUT_ADR c04
MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS2 d74
MC_SECURITY_CARVEOUT4_CFG0 cf8
MC_SECURITY_CARVEOUT4_CLIENT_ACCESS2 d10
MC_SECURITY_CARVEOUT4_SIZE_128KB d04
MC_SECURITY_CARVEOUT1_CLIENT_ACCESS4 c28
MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS1 c30
MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS4 c8c
MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS0 d1c
MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS1 d70
MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS0 c2c
MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS4 d7c
MC_SECURITY_CARVEOUT3_SIZE_128KB cb4
MC_SECURITY_CARVEOUT2_CFG0 c58
MC_SECURITY_CARVEOUT1_CFG0 c08
MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS2 c84
MC_SECURITY_CARVEOUT2_CLIENT_ACCESS0 c68
MC_SECURITY_CARVEOUT3_BOM cac
MC_SECURITY_CARVEOUT2_CLIENT_ACCESS2 c70
MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS3 d78
MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS0 c7c
MC_SECURITY_CARVEOUT4_CLIENT_ACCESS4 d18
MC_SECURITY_CARVEOUT3_CLIENT_ACCESS1 cbc
MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS3 c38
MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS2 c34
MC_SECURITY_CARVEOUT3_CLIENT_ACCESS2 cc0
MC_SECURITY_CARVEOUT5_CLIENT_ACCESS2 d60
MC_SECURITY_CARVEOUT3_CFG0 ca8
MC_SECURITY_CARVEOUT3_CLIENT_ACCESS0 cb8
MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS3 c88
MC_SECURITY_CARVEOUT2_SIZE_128KB c64
MC_SECURITY_CARVEOUT5_BOM_HI d50
MC_SECURITY_CARVEOUT1_SIZE_128KB c14
MC_SECURITY_CARVEOUT4_CLIENT_ACCESS3 d14
MC_SECURITY_CARVEOUT1_BOM c0c
MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS4 d2c
MC_SECURITY_CARVEOUT5_CLIENT_ACCESS4 d68
MC_SECURITY_CARVEOUT3_CLIENT_ACCESS4 cc8
MC_SECURITY_CARVEOUT5_CLIENT_ACCESS0 d58
MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS2 d24
MC_SECURITY_CARVEOUT3_CLIENT_ACCESS3 cc4
MC_SECURITY_CARVEOUT2_CLIENT_ACCESS4 c78
MC_SECURITY_CARVEOUT1_CLIENT_ACCESS1 c1c
MC_SECURITY_CARVEOUT1_CLIENT_ACCESS0 c18
MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS3 d28
MC_SECURITY_CARVEOUT5_CLIENT_ACCESS1 d5c
MC_SECURITY_CARVEOUT3_BOM_HI cb0
MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS3 cd8
MC_SECURITY_CARVEOUT2_BOM_HI c60
MC_SECURITY_CARVEOUT4_BOM_HI d00
MC_SECURITY_CARVEOUT5_CLIENT_ACCESS3 d64
MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS4 cdc
MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS1 c80
MC_SECURITY_CARVEOUT5_SIZE_128KB d54
MC_SECURITY_CARVEOUT4_CLIENT_FORCE_INTERNAL_ACCESS1 d20
MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS2 cd4
MC_SECURITY_CARVEOUT4_CLIENT_ACCESS1 d0c
MC_SECURITY_CARVEOUT2_CLIENT_ACCESS3 c74
MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS0 ccc
MC_SECURITY_CARVEOUT4_BOM cfc
MC_SECURITY_CARVEOUT5_CFG0 d48
MC_SECURITY_CARVEOUT2_BOM c5c
MC_SECURITY_CARVEOUT5_BOM d4c
MC_SECURITY_CARVEOUT1_CLIENT_ACCESS3 c24
MC_SECURITY_CARVEOUT5_CLIENT_FORCE_INTERNAL_ACCESS0 d6c
MC_SECURITY_CARVEOUT3_CLIENT_FORCE_INTERNAL_ACCESS1 cd0
MC_SECURITY_CARVEOUT1_BOM_HI c10
MC_SECURITY_CARVEOUT1_CLIENT_ACCESS2 c20
MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS4 c3c
MC_SECURITY_CARVEOUT2_CLIENT_ACCESS1 c6c
MC_SECURITY_CARVEOUT4_CLIENT_ACCESS0 d08
MC_ERR_APB_ASID_UPDATE_STATUS 9d0
MC_DA_CONFIG0 9dc

38
tools/smmu_payload.py Normal file
View File

@ -0,0 +1,38 @@
'''
Copyright (c) 2018 balika011
This program is free software; you can redistribute it and/or modify it
under the terms and conditions of the GNU General Public License,
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''
from keystone import *
CODE = b'''
LDR X1, =0x70019010
MOV X0, #0x1
STR W0, [X1]
loop:
IC IALLUIS
DSB ISH
B loop
MOV X0, #0x0
STR W0, [X1]
LDR X0, =0x4002B000
BR X0
'''
try:
ks = Ks(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN)
encoding, count = ks.asm(CODE, 0x0)
print("%s = %s (number of statements: %u)" %(CODE, ', '.join([('0x%02x' % (x)) for x in encoding]), count))
except KsError as e:
print("ERROR: %s" %e)