Skip to content

Commit

Permalink
hdata: Fix DIMM size property
Browse files Browse the repository at this point in the history
Today we parse vpd blob to get DIMM size information. This is limited
to FSP based system. HDAT provides DIMM size value. Lets use that to
populate device tree. So that we can get size information on BMC based
system as well.

Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
CC: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
  • Loading branch information
Vasant Hegde authored and stewartsmith committed Apr 23, 2018
1 parent bdd925a commit c4a094a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 36 deletions.
41 changes: 11 additions & 30 deletions hdata/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,32 +234,19 @@ static void add_bus_freq_to_ram_area(struct dt_node *ram_node, u32 chip_id)
}

static void add_size_to_ram_area(struct dt_node *ram_node,
const struct HDIF_common_hdr *hdr,
int indx_vpd)
const struct HDIF_common_hdr *ramarea)
{
const void *fruvpd;
unsigned int fruvpd_sz;
const void *kw;
char *str;
uint8_t kwsz;

fruvpd = HDIF_get_idata(hdr, indx_vpd, &fruvpd_sz);
if (!CHECK_SPPTR(fruvpd))
return;
char str[16];
const struct HDIF_ram_area_size *ram_area_sz;

/* DIMM Size */
kw = vpd_find(fruvpd, fruvpd_sz, "VINI", "SZ", &kwsz);
if (!kw)
/* DIMM size */
ram_area_sz = HDIF_get_idata(ramarea, 3, NULL);
if (!CHECK_SPPTR(ram_area_sz))
return;

str = zalloc(kwsz + 1);
if (!str){
prerror("Allocation failed\n");
return;
}
memcpy(str, kw, kwsz);
memset(str, 0, 16);
snprintf(str, 16, "%d", be32_to_cpu(ram_area_sz->mb));
dt_add_property_string(ram_node, "size", str);
free(str);
}

static void vpd_add_ram_area(const struct HDIF_common_hdr *msarea)
Expand Down Expand Up @@ -301,21 +288,15 @@ static void vpd_add_ram_area(const struct HDIF_common_hdr *msarea)

vpd_blob = HDIF_get_idata(ramarea, 1, &ram_sz);

/* DIMM size */
add_size_to_ram_area(ram_node, ramarea);
/*
* For direct-attached memory we have a DDR "Serial
* Presence Detection" blob rather than an IBM keyword
* blob.
*/
if (vpd_valid(vpd_blob, ram_sz)) {
/* the ibm,vpd blob was added in dt_add_vpd_node() */
add_size_to_ram_area(ram_node, ramarea, 1);
} else {
/*
* FIXME: There's probably a way to calculate the
* size of the DIMM from the SPD info.
*/
if (!vpd_valid(vpd_blob, ram_sz))
dt_add_property(ram_node, "spd", vpd_blob, ram_sz);
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions hdata/test/p8-840-spira.dts
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@
description = "16GB CDIMM";
ibm,chip-id = <0x0>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0016384";
size = "16384";
};

ms-dimm@d002 {
Expand All @@ -768,7 +768,7 @@
description = "16GB CDIMM";
ibm,chip-id = <0x0>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0016384";
size = "16384";
};

processor@1000 {
Expand Down
8 changes: 4 additions & 4 deletions hdata/test/p81-811.spira.dts
Original file line number Diff line number Diff line change
Expand Up @@ -1899,7 +1899,7 @@
description = "32GB CDIMM";
ibm,chip-id = <0x0>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0032768";
size = "32768";
};

ms-dimm@d002 {
Expand All @@ -1921,7 +1921,7 @@
description = "32GB CDIMM";
ibm,chip-id = <0x0>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0032768";
size = "32768";
};

ms-dimm@d008 {
Expand All @@ -1943,7 +1943,7 @@
description = "32GB CDIMM";
ibm,chip-id = <0x10>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0032768";
size = "32768";
};

ms-dimm@d00a {
Expand All @@ -1965,7 +1965,7 @@
description = "32GB CDIMM";
ibm,chip-id = <0x10>;
ibm,memory-bus-frequency = <0x0 0x0>;
size = "0032768";
size = "32768";
};

processor@1000 {
Expand Down

0 comments on commit c4a094a

Please sign in to comment.