summaryrefslogtreecommitdiff
path: root/src/soc
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc')
-rw-r--r--src/soc/mediatek/common/emi.c3
-rw-r--r--src/soc/mediatek/common/memory.c37
-rw-r--r--src/soc/qualcomm/common/qclib.c16
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);