Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | // SPDX-License-Identifier: (GPL-2.0+ OR MIT) /* * (C) Copyright 2019 Rockchip Electronics Co., Ltd * (C) Copyright 2019 Amarula Solutions. * Author: Jagan Teki <jagan@amarulasolutions.com> */ #include <common.h> #include <debug_uart.h> #include <asm/arch-rockchip/sdram_common.h> void sdram_print_dram_type(unsigned char dramtype) { switch (dramtype) { case DDR3: printascii("DDR3"); break; case DDR4: printascii("DDR4"); break; case LPDDR2: printascii("LPDDR2"); break; case LPDDR3: printascii("LPDDR3"); break; case LPDDR4: printascii("LPDDR4"); break; default: printascii("Unknown Device"); break; } } /** * cs = 0, cs0 * cs = 1, cs1 * cs => 2, cs0+cs1 * note: it didn't consider about row_3_4 */ u64 sdram_get_cs_cap(struct sdram_cap_info *cap_info, u32 cs, u32 dram_type) { u32 bg; u64 cap[2]; if (dram_type == DDR4) /* DDR4 8bit dram BG = 2(4bank groups), * 16bit dram BG = 1 (2 bank groups) */ bg = (cap_info->dbw == 0) ? 2 : 1; else bg = 0; cap[0] = 1llu << (cap_info->bw + cap_info->col + bg + cap_info->bk + cap_info->cs0_row); if (cap_info->rank == 2) cap[1] = 1llu << (cap_info->bw + cap_info->col + bg + cap_info->bk + cap_info->cs1_row); else cap[1] = 0; if (cs == 0) return cap[0]; else if (cs == 1) return cap[1]; else return (cap[0] + cap[1]); } void sdram_print_ddr_info(struct sdram_cap_info *cap_info, struct sdram_base_params *base) { u32 bg, cap; bg = (cap_info->dbw == 0) ? 2 : 1; sdram_print_dram_type(base->dramtype); printascii(", "); printdec(base->ddr_freq); printascii("MHz\n"); printascii("BW="); printdec(8 << cap_info->bw); printascii(" Col="); printdec(cap_info->col); printascii(" Bk="); printdec(0x1 << cap_info->bk); if (base->dramtype == DDR4) { printascii(" BG="); printdec(1 << bg); } printascii(" CS0 Row="); printdec(cap_info->cs0_row); if (cap_info->rank > 1) { printascii(" CS1 Row="); printdec(cap_info->cs1_row); } printascii(" CS="); printdec(cap_info->rank); printascii(" Die BW="); printdec(8 << cap_info->dbw); cap = sdram_get_cs_cap(cap_info, 3, base->dramtype); if (cap_info->row_3_4) cap = cap * 3 / 4; printascii(" Size="); printdec(cap >> 20); printascii("MB\n"); } void sdram_print_stride(unsigned int stride) { switch (stride) { case 0xc: printf("128B stride\n"); break; case 5: case 9: case 0xd: case 0x11: case 0x19: printf("256B stride\n"); break; case 0xa: case 0xe: case 0x12: printf("512B stride\n"); break; case 0xf: printf("4K stride\n"); break; case 0x1f: printf("32MB + 256B stride\n"); break; default: printf("no stride\n"); } } |