@@ -411,6 +411,20 @@ static void disable_unavailable_units(struct dt_node *dev)
return;
}
+static void disable_imc_type_from_dt(struct dt_node *dev, int imc_type)
+{
+ struct dt_node *node;
+
+ dt_for_each_compatible(dev, node, "ibm,imc-counters") {
+ if (get_imc_device_type(node) == imc_type) {
+ dt_free(node);
+ node = NULL;
+ }
+ }
+
+ return;
+}
+
/*
* Function to queue the loading of imc catalog data
* from the IMC pnor partition.
@@ -606,8 +620,8 @@ imc_mambo:
* undesirable values. Hence pause the ucode if it is already running.
*/
if (pause_microcode_at_boot()) {
- prerror("IMC: Pausing ucode failed\n");
- goto err;
+ prerror("IMC: Pausing ucode failed, disabling nest imc\n");
+ disable_imc_type_from_dt(dev, IMC_COUNTER_CHIP);
}
/*
During opal boot, in imc_init(), 24x7/IMC microcode state is checked and if it is not in running or pause state, currently all the imc devices are removed from device tree. Instead, remove only the nest imc devices. Core/Thread/Trace imc devices are not related to 24x7 microcode. Patch adds a function to remove specific imc device type and the same is used, when pause_microcode() fails, to remove nest imc device types from the device tree. Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com> --- hw/imc.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)