diff options
Diffstat (limited to 'src/soc')
-rw-r--r-- | src/soc/mediatek/common/emi.c | 3 | ||||
-rw-r--r-- | src/soc/mediatek/common/memory.c | 37 | ||||
-rw-r--r-- | src/soc/qualcomm/common/qclib.c | 16 |
3 files changed, 32 insertions, 24 deletions
diff --git a/src/soc/mediatek/common/emi.c b/src/soc/mediatek/common/emi.c index d5470d2fd3..a8163cb14d 100644 --- a/src/soc/mediatek/common/emi.c +++ b/src/soc/mediatek/common/emi.c @@ -19,8 +19,7 @@ size_t sdram_size(void) mc = cbmem_find(CBMEM_ID_MEM_CHIP_INFO); assert(mc); - for (unsigned int i = 0; i < mc->num_channels; ++i) - size += mc->channel[i].density; + size = mem_chip_info_total_density_bytes(mc); printk(BIOS_INFO, "dram size: %#lx\n", size); return size; diff --git a/src/soc/mediatek/common/memory.c b/src/soc/mediatek/common/memory.c index e4207222b0..0a8f58f41f 100644 --- a/src/soc/mediatek/common/memory.c +++ b/src/soc/mediatek/common/memory.c @@ -112,20 +112,26 @@ size_t mtk_dram_size(void) static void fill_dram_info(struct mem_chip_info *mc, const struct ddr_base_info *ddr) { - unsigned int i; - size_t size; - - mc->type = MEM_CHIP_LPDDR4X; - mc->num_channels = CHANNEL_MAX; - size = mtk_dram_size(); - assert(size); - - for (i = 0; i < mc->num_channels; ++i) { - mc->channel[i].density = size / mc->num_channels; - mc->channel[i].io_width = DQ_DATA_WIDTH_LP4; - mc->channel[i].manufacturer_id = ddr->mrr_info.mr5_vendor_id; - mc->channel[i].revision_id[0] = ddr->mrr_info.mr6_revision_id; - mc->channel[i].revision_id[1] = ddr->mrr_info.mr7_revision_id; + unsigned int c, r; + + mc->num_entries = CHANNEL_MAX * ddr->mrr_info.rank_nums; + mc->struct_version = MEM_CHIP_STRUCT_VERSION; + + struct mem_chip_entry *entry = mc->entries; + for (c = 0; c < CHANNEL_MAX; c++) { + for (r = 0; r < ddr->mrr_info.rank_nums; r++) { + entry->channel = c; + entry->rank = r; + entry->type = MEM_CHIP_LPDDR4X; + entry->channel_io_width = DQ_DATA_WIDTH_LP4; + entry->density_mbits = ddr->mrr_info.mr8_density[r] / CHANNEL_MAX / + (MiB / 8); + entry->io_width = DQ_DATA_WIDTH_LP4; + entry->manufacturer_id = ddr->mrr_info.mr5_vendor_id; + entry->revision_id[0] = ddr->mrr_info.mr6_revision_id; + entry->revision_id[1] = ddr->mrr_info.mr7_revision_id; + entry++; + } } } @@ -140,9 +146,10 @@ static void add_mem_chip_info(int unused) return; } - size = sizeof(*mc) + sizeof(struct mem_chip_channel) * CHANNEL_MAX; + size = mem_chip_info_size(CHANNEL_MAX * curr_ddr_info->mrr_info.rank_nums); mc = cbmem_add(CBMEM_ID_MEM_CHIP_INFO, size); assert(mc); + memset(mc, 0, size); fill_dram_info(mc, curr_ddr_info); } diff --git a/src/soc/qualcomm/common/qclib.c b/src/soc/qualcomm/common/qclib.c index 4d005e53af..2769dede2f 100644 --- a/src/soc/qualcomm/common/qclib.c +++ b/src/soc/qualcomm/common/qclib.c @@ -21,14 +21,15 @@ #define QCLIB_VERSION 0 /* store QcLib return data until CBMEM_CREATION_HOOK runs */ -static void *mem_chip_addr; +static struct mem_chip_info *mem_chip_info; static void write_mem_chip_information(struct qclib_cb_if_table_entry *te) { + struct mem_chip_info *info = (void *)te->blob_address; if (te->size > sizeof(struct mem_chip_info) && - te->size == mem_chip_info_size((void *)te->blob_address)) { - /* Save mem_chip_addr in global variable ahead of hook running */ - mem_chip_addr = (void *)te->blob_address; + te->size == mem_chip_info_size(info->num_entries)) { + /* Save mem_chip_info in global variable ahead of hook running */ + mem_chip_info = info; } } @@ -37,19 +38,20 @@ static void add_mem_chip_info(int unused) void *mem_region_base = NULL; size_t size; - if (!mem_chip_addr) { + if (!mem_chip_info || !mem_chip_info->num_entries || + mem_chip_info->struct_version != MEM_CHIP_STRUCT_VERSION) { printk(BIOS_ERR, "Did not receive valid mem_chip_info from QcLib!"); return; } - size = mem_chip_info_size(mem_chip_addr); + size = mem_chip_info_size(mem_chip_info->num_entries); /* Add cbmem table */ mem_region_base = cbmem_add(CBMEM_ID_MEM_CHIP_INFO, size); ASSERT(mem_region_base != NULL); /* Migrate the data into CBMEM */ - memcpy(mem_region_base, mem_chip_addr, size); + memcpy(mem_region_base, mem_chip_info, size); } CBMEM_CREATION_HOOK(add_mem_chip_info); |