// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2022-2023 StarFive Technology Co., Ltd. * Author: yanhong * */ #include #include #include "starfive_ddr.h" static u32 ddr4_train_data[] = { 0xa00, 0x101, 0x640000, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x10000, 0x10003, 0x1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x280d0000, 0x0, 0x1, 0x32000003, 0x0, 0x0, 0x60602, 0x1, 0x0, 0x0, 0x0, 0x55, 0xaa, 0xad, 0x52, 0x6a, 0x95, 0x95, 0xad, 0x1000000, 0x1000000, 0x0, 0x3030000, 0x14, 0x7d0, 0x300, 0x0, 0x0, 0x1000000, 0x10101, 0x0, 0x30000, 0x10100, 0x1703, 0x0, 0x0, 0x0, 0xa140a01, 0x204010a, 0x2080510, 0x40400, 0x101, 0x10100, 0x2040300, 0x34000000, 0x0, 0x0, 0x1000000, 0x0, 0x0, 0x0, 0x6, 0x100, 0x40000, 0x2000200, 0x1000100, 0x1000000, 0x2000200, 0x200, 0x0, 0x0, 0x0, 0xe000003, 0xc0d100f, 0xa09080b, 0x2010000, 0x80103, 0x10200, 0x0, 0x3000000, 0xd6, 0x216, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30100, 0x1010001, 0x10200, 0x4000103, 0x1050001, 0x10600, 0x107, 0x0, 0x0, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x10000, 0x4, 0x0, 0x0, 0x0, 0xa000a0, 0x1a1a00a0, 0x1a, 0x35, 0x35, 0x40035, 0x4000400, 0xca04000b, 0x4000b20, 0xb20ca, 0x20ca04, 0x24b, 0x207b, 0x24b, 0x207b, 0x24b, 0x400207b, 0x1010404, 0x1801, 0x180018, 0x10e010e, 0x10e, 0x0, 0x5000000, 0x1010505, 0x1010101, 0x191919, 0x0, 0x0, 0x11000000, 0xc0c1111, 0x303030c, 0xc0034, 0xc0034, 0xc0034, 0x0, 0x0, 0xa, 0xa, 0x100000a, 0x0, 0x100, 0x1000000, 0x0, 0x1e1a1e1a, 0x1011e1a, 0x100b0801, 0x100b080f, 0x100b080f, 0xc00f, 0xc01000, 0xc01000, 0x191000, 0x19010b, 0x19010b, 0x101010b, 0x1f01, 0x1e1a0055, 0x7000001, 0x1f0c11, 0x1e1a0055, 0x7000001, 0x1f0c11, 0x1e1a0055, 0x7000001, 0xc11, 0xf0f0800, 0x100806, 0x2301071c, 0x8002000, 0x1d1d190b, 0x60f0f08, 0x1008, 0x2301071c, 0x8002000, 0x1d1d190b, 0x60f0f08, 0x1008, 0x2301071c, 0x8002000, 0x1d1d190b, 0x40f6, 0x2899c, 0x40f6, 0x2899c, 0x40f6, 0x2899c, 0x3000300, 0x3030300, 0x30003, 0x3000300, 0xb, 0x0, 0x0, 0x0, 0x256, 0xb, 0x0, 0x0, 0x0, 0x256, 0xb, 0x0, 0x0, 0x0, 0x2000256, 0x80, 0x20000, 0x80, 0x20000, 0x80, 0x0, 0x0, 0x2020202, 0x2040108, 0x8010402, 0x67676767, 0x67676767, 0x67676767, 0x67676767, 0x1010101, 0x0, 0x0, 0x0, 0x0, 0x5500, 0x5a00, 0x55003c, 0x0, 0x3c00005a, 0x5500, 0x5a00, 0x55003c, 0x0, 0x3c00005a, 0x18171615, 0x14131211, 0x7060504, 0x3020100, 0x0, 0x0, 0x0, 0x1000000, 0x4020201, 0x80804, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, 0x634, 0x201, 0x10, 0x200, 0x0, 0x481, 0x800, 0x4d4d, }; static u32 lpddr4_train_data[] = { 0xb00, 0x101, 0x640000, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x10002, 0x300080f, 0x1, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1010000, 0x280a0000, 0x0, 0x1, 0x3200000f, 0x0, 0x0, 0x10102, 0x1, 0x0, 0x0, 0x0, 0xaa, 0x55, 0xb5, 0x4a, 0x56, 0xa9, 0xa9, 0xb5, 0x1000000, 0x1000000, 0x0, 0xf0f0000, 0x14, 0x7d0, 0x300, 0x0, 0x0, 0x1000000, 0x10101, 0x0, 0x30000, 0x100, 0x170f, 0x0, 0x0, 0x0, 0xa140a01, 0x204010a, 0x2080510, 0x40400, 0x1000101, 0x10100, 0x2040f00, 0x34000000, 0x0, 0x0, 0x1000000, 0x0, 0x0, 0x0, 0x0, 0x10100, 0x80101, 0x2000200, 0x1000100, 0x1000000, 0x2000200, 0x200, 0x0, 0x0, 0x0, 0xe000004, 0xc0d100f, 0xa09080b, 0x2010000, 0x80103, 0x200, 0x0, 0xf000000, 0x4, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30100, 0x1010001, 0x10200, 0x4000103, 0x1050001, 0x10600, 0x107, 0x0, 0x0, 0x10001, 0x0, 0x0, 0x0, 0x0, 0x10000, 0x4, 0x0, 0x10000, 0x0, 0x3c0003, 0x80100a0, 0x16, 0x2c, 0x33, 0x20043, 0x2000200, 0x4, 0x60c, 0xa1400, 0x280000, 0x6, 0x46, 0x70, 0x610, 0x12b, 0x4001035, 0x1010404, 0x1e01, 0x1e001e, 0x1000100, 0x100, 0x0, 0x5060403, 0x1011108, 0x1010101, 0xf0a0a, 0x0, 0x0, 0x4000000, 0x4021008, 0x4020206, 0xc0034, 0x100038, 0x17003f, 0x10001, 0x10001, 0x10005, 0x20064, 0x100010b, 0x60006, 0x650100, 0x1000065, 0x10c010c, 0x1e1a1e1a, 0x1011e1a, 0xa070601, 0xa07060d, 0x100b080d, 0xc00f, 0xc01000, 0xc01000, 0x21000, 0x120005, 0x190064, 0x10b, 0x1100, 0x1e1a0056, 0x6000101, 0x130204, 0x1e1a0058, 0x1000101, 0x230408, 0x1e1a005e, 0x9000101, 0x610, 0x4040800, 0x40100, 0x3000277, 0xa032001, 0xa0a, 0x80908, 0x901, 0x1100315c, 0xa062002, 0xa0a, 0x141708, 0x150d, 0x2d00838e, 0xf102004, 0xf0b, 0x8c, 0x578, 0xc20, 0x7940, 0x206a, 0x14424, 0x730006, 0x3030133, 0x4, 0x0, 0x4, 0x1, 0x5, 0x2, 0x6, 0x50, 0x1, 0x5, 0x28, 0x73, 0xd6, 0x1, 0x5, 0x6b, 0x1000133, 0x140040, 0x10001, 0x1900040, 0x1000c, 0x42b0040, 0x320, 0x360014, 0x1010101, 0x2020101, 0x8080404, 0x67676767, 0x67676767, 0x67676767, 0x67676767, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5500, 0x5a00, 0x55003c, 0x0, 0x3c00005a, 0x5500, 0x5a00, 0x55003c, 0x0, 0x3c00005a, 0x18171615, 0x14131211, 0x7060504, 0x3020100, 0x0, 0x0, 0x0, 0x1000000, 0x4020201, 0x80804, 0x0, 0x4, 0x0, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x14, 0x9, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x34, 0x1b, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x4, 0x0, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x14, 0x9, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x34, 0x1b, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x4, 0x0, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x14, 0x9, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x34, 0x1b, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x4, 0x0, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x14, 0x9, 0x31, 0x31, 0x0, 0x0, 0x4d4d, 0x0, 0x34, 0x1b, 0x31, 0x31, 0x0, 0x0, 0x4d4d, }; void ddr_phy_train(u32 *phyreg) { u32 i, len; u32 *data; switch (starfive_ddr_type) { case DDR_TYPE_DDR4: len = sizeof(ddr4_train_data) / sizeof(u32); data = ddr4_train_data; break; case DDR_TYPE_LPDDR4: len = sizeof(lpddr4_train_data) / sizeof(u32); data = lpddr4_train_data; break; case DDR_TYPE_LPDDR3: case DDR_TYPE_DDR3: default: return; } for (i = 0; i < len; i++) out_le32(phyreg + i, data[i]); }