diff --git a/.gitignore b/.gitignore index 5dfc71c..7592fed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,9 @@ +.vs .vscode -build -output -research +build/* +output/* +research/* +loader/payload_00.h +loader/payload_01.h +tools/bin2c/bin2c +tools/lz/lz77 diff --git a/Makefile b/Makefile index a7efda8..94d81f3 100644 --- a/Makefile +++ b/Makefile @@ -8,10 +8,8 @@ include $(DEVKITARM)/base_rules ################################################################################ -IPL_LOAD_ADDR := 0x40003000 -LPVERSION_MAJOR := 1 -LPVERSION_MINOR := 9 -LPVERSION_BUGFX := 1 +IPL_LOAD_ADDR := 0x40008000 +include ./Versions.inc ################################################################################ @@ -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 += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC) -# 0: UART_A, 1: UART_B. -#CUSTOMDEFINES += -DDEBUG_UART_PORT=0 - #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. WARNINGS := -Wall -Wno-array-bounds -Wno-stringop-overread -Wno-stringop-overflow 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) +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 - @echo -n "Payload size is " +all: $(OUTPUTDIR)/$(TARGET).bin $(LDRDIR) + @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)) - @echo $(BIN_SIZE) - @echo "Max size is 126296 Bytes." + @echo $(BIN_SIZE)" Bytes" + @echo "Payload Max: 126296 Bytes" @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 $(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)" $(OBJCOPY) -S -O binary $< $@ $(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 @mkdir -p "$(@D)" - $(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ + @echo Building $@ + @$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ $(BUILDDIR)/$(TARGET)/%.o: $(SOURCEDIR)/%.S @mkdir -p "$(@D)" - $(CC) $(CFLAGS) -c $< -o $@ + @echo Building $@ + @$(CC) $(CFLAGS) -c $< -o $@ $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.c @mkdir -p "$(@D)" - $(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ + @echo Building $@ + @$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@ $(BUILDDIR)/$(TARGET)/%.o: $(BDKDIR)/%.S @mkdir -p "$(@D)" - $(CC) $(CFLAGS) -c $< -o $@ + @echo Building $@ + @$(CC) $(CFLAGS) -c $< -o $@ diff --git a/Versions.inc b/Versions.inc new file mode 100644 index 0000000..4f56f2c --- /dev/null +++ b/Versions.inc @@ -0,0 +1,4 @@ +# LP Version. +LPVERSION_MAJOR := 1 +LPVERSION_MINOR := 9 +LPVERSION_BUGFX := 1 diff --git a/bdk/mem/mc.c b/bdk/mem/mc.c index 4db3a30..c695987 100644 --- a/bdk/mem/mc.c +++ b/bdk/mem/mc.c @@ -20,7 +20,7 @@ #include #include -#define CONFIG_ENABLE_AHB_REDIRECT +//#define CONFIG_ENABLE_AHB_REDIRECT void mc_config_tsec_carveout(u32 bom, u32 size1mb, bool lock) { diff --git a/bdk/memory_map.h b/bdk/memory_map.h index d0bfd7b..70f1354 100644 --- a/bdk/memory_map.h +++ b/bdk/memory_map.h @@ -19,10 +19,10 @@ //#define IPL_STACK_TOP 0x4003FF00 /* --- BIT/BCT: 0x40000000 - 0x40003000 --- */ -/* --- IPL: 0x40003000 - 0x40028000 --- */ +/* --- IPL: 0x40008000 - 0x40028000 --- */ #define LDR_LOAD_ADDR 0x40007000 -#define IPL_LOAD_ADDR 0x40003000 +#define IPL_LOAD_ADDR 0x40008000 #define IPL_SZ_MAX 0x20000 // 128KB. /* --- XUSB EP context and TRB ring buffers --- */ diff --git a/loader/Makefile b/loader/Makefile new file mode 100644 index 0000000..d59ed08 --- /dev/null +++ b/loader/Makefile @@ -0,0 +1,65 @@ +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=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)" diff --git a/loader/link.ld b/loader/link.ld new file mode 100644 index 0000000..1196fd4 --- /dev/null +++ b/loader/link.ld @@ -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 = .; +} diff --git a/loader/loader.c b/loader/loader.c new file mode 100644 index 0000000..5ec2060 --- /dev/null +++ b/loader/loader.c @@ -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 . + */ + +#include +#include + +#include "payload_00.h" +#include "payload_01.h" + +#include +#include +#include +#include + +// 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) + ; +} diff --git a/loader/start.S b/loader/start.S new file mode 100644 index 0000000..1d7a661 --- /dev/null +++ b/loader/start.S @@ -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 . +*/ + +.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 diff --git a/source/keys/keys.c b/source/keys/keys.c index e634f57..7b8fa8b 100644 --- a/source/keys/keys.c +++ b/source/keys/keys.c @@ -202,7 +202,7 @@ static bool _derive_tsec_keys(tsec_ctxt_t *tsec_ctxt, u32 kb, key_derivation_ctx int res = 0; u32 retries = 0; - mc_disable_ahb_redirect(); + // mc_disable_ahb_redirect(); while (tsec_query(keys->tsec_keys, kb, tsec_ctxt) < 0) { 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) { EPRINTFARGS("ERROR %x dumping TSEC.\n", res); diff --git a/tools/bin2c/Makefile b/tools/bin2c/Makefile new file mode 100644 index 0000000..e870ac8 --- /dev/null +++ b/tools/bin2c/Makefile @@ -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=") +endif + +.PHONY: all clean + +all: bin2c + @echo > /dev/null + +clean: + @rm -f bin2c + +bin2c: bin2c.c + @$(NATIVE_CC) -o $@ bin2c.c diff --git a/tools/bin2c/bin2c.c b/tools/bin2c/bin2c.c new file mode 100644 index 0000000..0d820fc --- /dev/null +++ b/tools/bin2c/bin2c.c @@ -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 +#include +#include +#include +#include + +/* 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; +} diff --git a/tools/emc.def b/tools/emc.def new file mode 100644 index 0000000..ddcb5af --- /dev/null +++ b/tools/emc.def @@ -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 diff --git a/tools/fix_regs.py b/tools/fix_regs.py new file mode 100644 index 0000000..954a287 --- /dev/null +++ b/tools/fix_regs.py @@ -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() diff --git a/tools/lz/Makefile b/tools/lz/Makefile new file mode 100644 index 0000000..3d6fec8 --- /dev/null +++ b/tools/lz/Makefile @@ -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=") +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 diff --git a/tools/lz/lz.c b/tools/lz/lz.c new file mode 100644 index 0000000..01a3e69 --- /dev/null +++ b/tools/lz/lz.c @@ -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; +} diff --git a/tools/lz/lz.h b/tools/lz/lz.h new file mode 100644 index 0000000..7f7b22a --- /dev/null +++ b/tools/lz/lz.h @@ -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_ */ diff --git a/tools/lz/lz77.c b/tools/lz/lz77.c new file mode 100644 index 0000000..75b90a6 --- /dev/null +++ b/tools/lz/lz77.c @@ -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 . + */ + +#include +#include +#include +#include +#include +#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); +} diff --git a/tools/mc.def b/tools/mc.def new file mode 100644 index 0000000..62f3835 --- /dev/null +++ b/tools/mc.def @@ -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 diff --git a/tools/smmu_payload.py b/tools/smmu_payload.py new file mode 100644 index 0000000..8961b25 --- /dev/null +++ b/tools/smmu_payload.py @@ -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 . +''' + +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) \ No newline at end of file