powerpc/mm/drmem: Fix unexpected flag value in ibm,dynamic-memory-v2

Memory addtion and removal by count and indexed-count methods
temporarily mark the LMBs that are being added/removed by a special
flag value DRMEM_LMB_RESERVED. Accessing flags value directly at a few
places without proper accessor method is causing two unexpected
side-effects:

- DRMEM_LMB_RESERVED bit is becoming part of the flags word of
  drconf_cell_v2 entries in ibm,dynamic-memory-v2 DT property.
- This results in extra drconf_cell entries in ibm,dynamic-memory-v2.
  For example if 1G memory is added, it leads to one entry for 3 LMBs
  and 1 separate entry for the last LMB. All the 4 LMBs should be
  defined by one entry here.

Fix this by always accessing the flags by its accessor method
drmem_lmb_flags().

Fixes: 2b31e3aec1 ("powerpc/drmem: Add support for ibm, dynamic-memory-v2 property")
Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Bharata B Rao 2018-02-21 16:06:26 +05:30 committed by Michael Ellerman
parent 083b209071
commit 2f7d03e051
1 changed files with 3 additions and 3 deletions

View File

@ -98,7 +98,7 @@ static void init_drconf_v2_cell(struct of_drconf_cell_v2 *dr_cell,
dr_cell->base_addr = cpu_to_be64(lmb->base_addr); dr_cell->base_addr = cpu_to_be64(lmb->base_addr);
dr_cell->drc_index = cpu_to_be32(lmb->drc_index); dr_cell->drc_index = cpu_to_be32(lmb->drc_index);
dr_cell->aa_index = cpu_to_be32(lmb->aa_index); dr_cell->aa_index = cpu_to_be32(lmb->aa_index);
dr_cell->flags = cpu_to_be32(lmb->flags); dr_cell->flags = cpu_to_be32(drmem_lmb_flags(lmb));
} }
static int drmem_update_dt_v2(struct device_node *memory, static int drmem_update_dt_v2(struct device_node *memory,
@ -121,7 +121,7 @@ static int drmem_update_dt_v2(struct device_node *memory,
} }
if (prev_lmb->aa_index != lmb->aa_index || if (prev_lmb->aa_index != lmb->aa_index ||
prev_lmb->flags != lmb->flags) drmem_lmb_flags(prev_lmb) != drmem_lmb_flags(lmb))
lmb_sets++; lmb_sets++;
prev_lmb = lmb; prev_lmb = lmb;
@ -150,7 +150,7 @@ static int drmem_update_dt_v2(struct device_node *memory,
} }
if (prev_lmb->aa_index != lmb->aa_index || if (prev_lmb->aa_index != lmb->aa_index ||
prev_lmb->flags != lmb->flags) { drmem_lmb_flags(prev_lmb) != drmem_lmb_flags(lmb)) {
/* end of one set, start of another */ /* end of one set, start of another */
dr_cell->seq_lmbs = cpu_to_be32(seq_lmbs); dr_cell->seq_lmbs = cpu_to_be32(seq_lmbs);
dr_cell++; dr_cell++;