// --------------------------------------
// CoreABC SERDES Initialization Sequence
// --------------------------------------

// SYSTEM_DEBUG_MODE_KEY
APBWRT DAT 0 0xa0a8 0xA5
// SYSTEM_CONFIG_PHY_MODE_1
APBWRT DAT 0 0xa028 0x1F0
// LANE0_RXIDLE_MAX_ERRCNT_THR
APBWRT DAT 0 0x9008 0xF8
// LANE0_TX_PST_RATIO_DEEMP0_FULL
APBWRT DAT 0 0x9050 0x20
// LANE0_TX_PST_RATIO_DEEMP1_FULL
APBWRT DAT 0 0x9058 0x15
// LANE0_TX_PST_RATIO_DEEMP0_HALF
APBWRT DAT 0 0x9090 0x20
// LANE0_TX_PST_RATIO_DEEMP1_HALF
APBWRT DAT 0 0x9098 0x15
// LANE0_UPDATE_SETTINGS
APBWRT DAT 0 0x9200 0x1
// SYSTEM_CONFIG_PHY_MODE_1
APBWRT DAT 0 0xa028 0x2F0
// LANE1_RXIDLE_MAX_ERRCNT_THR
APBWRT DAT 0 0x9408 0xF8
// LANE1_TX_PST_RATIO_DEEMP0_FULL
APBWRT DAT 0 0x9450 0x20
// LANE1_TX_PST_RATIO_DEEMP1_FULL
APBWRT DAT 0 0x9458 0x15
// LANE1_TX_PST_RATIO_DEEMP0_HALF
APBWRT DAT 0 0x9490 0x20
// LANE1_TX_PST_RATIO_DEEMP1_HALF
APBWRT DAT 0 0x9498 0x15
// LANE1_UPDATE_SETTINGS
APBWRT DAT 0 0x9600 0x1
// SYSTEM_CONFIG_PHY_MODE_1
APBWRT DAT 0 0xa028 0x4F0
// LANE2_RXIDLE_MAX_ERRCNT_THR
APBWRT DAT 0 0x9808 0xF8
// LANE2_TX_PST_RATIO_DEEMP0_FULL
APBWRT DAT 0 0x9850 0x20
// LANE2_TX_PST_RATIO_DEEMP1_FULL
APBWRT DAT 0 0x9858 0x15
// LANE2_TX_PST_RATIO_DEEMP0_HALF
APBWRT DAT 0 0x9890 0x20
// LANE2_TX_PST_RATIO_DEEMP1_HALF
APBWRT DAT 0 0x9898 0x15
// LANE2_UPDATE_SETTINGS
APBWRT DAT 0 0x9a00 0x1
// SYSTEM_CONFIG_PHY_MODE_1
APBWRT DAT 0 0xa028 0x8F0
// LANE3_RXIDLE_MAX_ERRCNT_THR
APBWRT DAT 0 0x9c08 0xF8
// LANE3_TX_PST_RATIO_DEEMP0_FULL
APBWRT DAT 0 0x9c50 0x20
// LANE3_TX_PST_RATIO_DEEMP1_FULL
APBWRT DAT 0 0x9c58 0x15
// LANE3_TX_PST_RATIO_DEEMP0_HALF
APBWRT DAT 0 0x9c90 0x20
// LANE3_TX_PST_RATIO_DEEMP1_HALF
APBWRT DAT 0 0x9c98 0x15
// LANE3_UPDATE_SETTINGS
APBWRT DAT 0 0x9e00 0x1
// SYSTEM_CONFIG_PHY_MODE_1
APBWRT DAT 0 0xa028 0xFF0

// Set CONFIG1_DONE to '1'
APBWRT DAT 0 0x2000 0x1

// Wait for SDIF_RELEASE assertion
$WaitSdifRelease
APBREAD 0 0x2004
AND 0x02
JUMP IF ZERO $WaitSdifRelease

// Lane selection before PCIE_0 PMA STATUS polling
APBREAD 0 0xa028
AND 0xFFFFF0FF
OR 0x100
APBWRT ACC 0 0xa028

// Wait for PCIE_0 PMA READY
$WaitPcie0PmaReady
APBREAD 0 0x90c0
AND 0x80
JUMP IF ZERO $WaitPcie0PmaReady

// PCIE_VID_DEVID
APBWRT DAT 0 0x8000 0x110A1556
// PCIE_POWER_MGT_CAPABILITY
APBWRT DAT 0 0x8048 0x48018001
// PCIE_AXI_SLAVE_WINDOW0_0
APBWRT DAT 0 0x80c0 0xA0000000
// PCIE_AXI_SLAVE_WINDOW0_1
APBWRT DAT 0 0x80c4 0xFFF00001
// PCIE_AXI_MASTER_WINDOW0_0
APBWRT DAT 0 0x8100 0x40000000
// PCIE_AXI_MASTER_WINDOW0_1
APBWRT DAT 0 0x8104 0xFFF00001
// PCIE_AXI_MASTER_WINDOW0_2
APBWRT DAT 0 0x8108 0x1
// PCIE_AXI_MASTER_WINDOW1_0
APBWRT DAT 0 0x8110 0x20000000
// PCIE_AXI_MASTER_WINDOW1_1
APBWRT DAT 0 0x8114 0xFFFF0001
// PCIE_AXI_MASTER_WINDOW1_2
APBWRT DAT 0 0x8118 0x2
// PCIE_MSI_0
APBWRT DAT 0 0x8080 0x00000800
// PCIE_MSI_CTRL_STATUS
APBWRT DAT 0 0x8040 0x30000

// Issue Soft Reset on PCIE_0 controler
APBREAD 0 0xa008
AND 0xFFFFFFFE
APBWRT ACC 0 0xa008
OR 0x00000001
APBWRT ACC 0 0xa008

// Set CONFIG2_DONE to '1'
APBWRT DAT 0 0x2000 0x3

HALT
