lib: sbi: Add error prints in sbi_domain_finalize()

We add error prints in sbi_domain_finalize() and sanitize_domain()
to help debug domain configuration issues.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Anup Patel
2020-11-15 15:11:21 +05:30
committed by Anup Patel
parent 62ea4f4e2a
commit 555e73778a

View File

@@ -174,19 +174,33 @@ static int sanitize_domain(const struct sbi_platform *plat,
struct sbi_domain_memregion treg, *reg, *reg1; struct sbi_domain_memregion treg, *reg, *reg1;
/* Check possible HARTs */ /* Check possible HARTs */
if (!dom->possible_harts) if (!dom->possible_harts) {
sbi_printf("%s: %s possible HART mask is NULL\n",
__func__, dom->name);
return SBI_EINVAL; return SBI_EINVAL;
}
sbi_hartmask_for_each_hart(i, dom->possible_harts) { sbi_hartmask_for_each_hart(i, dom->possible_harts) {
if (sbi_platform_hart_invalid(plat, i)) if (sbi_platform_hart_invalid(plat, i)) {
sbi_printf("%s: %s possible HART mask has invalid "
"hart %d\n", __func__, dom->name, i);
return SBI_EINVAL; return SBI_EINVAL;
}
}; };
/* Check memory regions */ /* Check memory regions */
if (!dom->regions) if (!dom->regions) {
sbi_printf("%s: %s regions is NULL\n",
__func__, dom->name);
return SBI_EINVAL; return SBI_EINVAL;
}
sbi_domain_for_each_memregion(dom, reg) { sbi_domain_for_each_memregion(dom, reg) {
if (!is_region_valid(reg)) if (!is_region_valid(reg)) {
sbi_printf("%s: %s has invalid region base=0x%lx "
"order=%lu flags=0x%lx\n", __func__,
dom->name, reg->base, reg->order,
reg->flags);
return SBI_EINVAL; return SBI_EINVAL;
}
} }
/* Count memory regions and check presence of firmware region */ /* Count memory regions and check presence of firmware region */
@@ -199,8 +213,11 @@ static int sanitize_domain(const struct sbi_platform *plat,
have_fw_reg = TRUE; have_fw_reg = TRUE;
count++; count++;
} }
if (!have_fw_reg) if (!have_fw_reg) {
sbi_printf("%s: %s does not have firmware region\n",
__func__, dom->name);
return SBI_EINVAL; return SBI_EINVAL;
}
/* Sort the memory regions */ /* Sort the memory regions */
for (i = 0; i < (count - 1); i++) { for (i = 0; i < (count - 1); i++) {
@@ -208,8 +225,15 @@ static int sanitize_domain(const struct sbi_platform *plat,
for (j = i + 1; j < count; j++) { for (j = i + 1; j < count; j++) {
reg1 = &dom->regions[j]; reg1 = &dom->regions[j];
if (is_region_conflict(reg1, reg)) if (is_region_conflict(reg1, reg)) {
sbi_printf("%s: %s conflict between regions "
"(base=0x%lx order=%lu flags=0x%lx) and "
"(base=0x%lx order=%lu flags=0x%lx)\n",
__func__, dom->name,
reg->base, reg->order, reg->flags,
reg1->base, reg1->order, reg1->flags);
return SBI_EINVAL; return SBI_EINVAL;
}
if (!is_region_before(reg1, reg)) if (!is_region_before(reg1, reg))
continue; continue;
@@ -233,13 +257,19 @@ static int sanitize_domain(const struct sbi_platform *plat,
* protect M-mode context and enforce checks on memory accesses. * protect M-mode context and enforce checks on memory accesses.
*/ */
if (dom->next_mode != PRV_S && if (dom->next_mode != PRV_S &&
dom->next_mode != PRV_U) dom->next_mode != PRV_U) {
sbi_printf("%s: %s invalid next booting stage mode 0x%lx\n",
__func__, dom->name, dom->next_mode);
return SBI_EINVAL; return SBI_EINVAL;
}
/* Check next address and next mode*/ /* Check next address and next mode*/
if (!sbi_domain_check_addr(dom, dom->next_addr, dom->next_mode, if (!sbi_domain_check_addr(dom, dom->next_addr, dom->next_mode,
SBI_DOMAIN_EXECUTE)) SBI_DOMAIN_EXECUTE)) {
sbi_printf("%s: %s next booting stage addres 0x%lx can't "
"execute\n", __func__, dom->name, dom->next_addr);
return SBI_EINVAL; return SBI_EINVAL;
}
return 0; return 0;
} }
@@ -371,13 +401,20 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
* Ensure that we have room for Domain Index to * Ensure that we have room for Domain Index to
* HART ID mapping * HART ID mapping
*/ */
if (SBI_DOMAIN_MAX_INDEX <= domain_count) if (SBI_DOMAIN_MAX_INDEX <= domain_count) {
sbi_printf("%s: No room for %s\n",
__func__, dom->name);
return SBI_ENOSPC; return SBI_ENOSPC;
}
/* Sanitize discovered domain */ /* Sanitize discovered domain */
rc = sanitize_domain(plat, dom); rc = sanitize_domain(plat, dom);
if (rc) if (rc) {
sbi_printf("%s: sanity checks failed for"
" %s (error %d)\n", __func__,
dom->name, rc);
return rc; return rc;
}
/* Assign index to domain */ /* Assign index to domain */
dom->index = domain_count++; dom->index = domain_count++;
@@ -437,8 +474,12 @@ int sbi_domain_finalize(struct sbi_scratch *scratch, u32 cold_hartid)
dom->next_addr, dom->next_addr,
dom->next_mode, dom->next_mode,
dom->next_arg1); dom->next_arg1);
if (rc) if (rc) {
sbi_printf("%s: failed to start boot HART %d"
" for %s (error %d)\n", __func__,
dhart, dom->name, rc);
return rc; return rc;
}
} }
} }