diff --git a/bl31/bl31_main.c b/bl31/bl31_main.c
index 9abc395bf08450b7adb382c44a53c1dcdb7c634a..f22e6121c5cfae4cb054c2f27034757189e6daea 100644
--- a/bl31/bl31_main.c
+++ b/bl31/bl31_main.c
@@ -77,7 +77,7 @@ void bl31_main(void)
 	/* Perform remaining generic architectural setup from EL3 */
 	bl31_arch_setup();
 
-	/* Perform platform setup in BL1 */
+	/* Perform platform setup in BL31 */
 	bl31_platform_setup();
 
 	/* Initialise helper libraries */
@@ -109,6 +109,12 @@ void bl31_main(void)
 	 * corresponding to the desired security state after the next ERET.
 	 */
 	bl31_prepare_next_image_entry();
+
+	/*
+	 * Perform any platform specific runtime setup prior to cold boot exit
+	 * from BL31
+	 */
+	bl31_plat_runtime_setup();
 }
 
 /*******************************************************************************
diff --git a/docs/porting-guide.md b/docs/porting-guide.md
index e5b4a9c789e79a6fac7846cd2634345b3c011e6e..2f71d80a95ac60516e13d536049f3549fe30951a 100644
--- a/docs/porting-guide.md
+++ b/docs/porting-guide.md
@@ -1172,6 +1172,17 @@ In ARM standard platforms, this function does the following:
 *   Detects the system topology.
 
 
+### Function : bl31_plat_runtime_setup() [optional]
+
+    Argument : void
+    Return   : void
+
+The purpose of this function is allow the platform to perform any BL31 runtime
+setup just prior to BL31 exit during cold boot. The default weak
+implementation of this function will invoke `console_uninit()` which will
+suppress any BL31 runtime logs.
+
+
 ### Function : bl31_get_next_image_info() [mandatory]
 
     Argument : unsigned int
diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h
index de9848b7c19f6c0df82c105e5d661ef402ff8f77..956d17f764748c5a2372db41c32c45752a88d7df 100644
--- a/include/plat/common/platform.h
+++ b/include/plat/common/platform.h
@@ -179,6 +179,7 @@ void bl31_early_platform_setup(struct bl31_params *from_bl2,
 				void *plat_params_from_bl2);
 void bl31_plat_arch_setup(void);
 void bl31_platform_setup(void);
+void bl31_plat_runtime_setup(void);
 struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type);
 
 /*******************************************************************************
diff --git a/plat/common/aarch64/plat_common.c b/plat/common/aarch64/plat_common.c
index a6a8476557dc53e3706634a20879368964865953..9070c613cec54f6ad95bebe159bada92367ba4a9 100644
--- a/plat/common/aarch64/plat_common.c
+++ b/plat/common/aarch64/plat_common.c
@@ -28,16 +28,18 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <assert.h>
+#include <console.h>
 #include <platform.h>
 #include <xlat_tables.h>
 
 /*
- * The following 2 platform setup functions are weakly defined. They
+ * The following platform setup functions are weakly defined. They
  * provide typical implementations that may be re-used by multiple
  * platforms but may also be overridden by a platform if required.
  */
 #pragma weak bl31_plat_enable_mmu
 #pragma weak bl32_plat_enable_mmu
+#pragma weak bl31_plat_runtime_setup
 
 void bl31_plat_enable_mmu(uint32_t flags)
 {
@@ -49,6 +51,15 @@ void bl32_plat_enable_mmu(uint32_t flags)
 	enable_mmu_el1(flags);
 }
 
+void bl31_plat_runtime_setup(void)
+{
+	/*
+	 * Finish the use of console driver in BL31 so that any runtime logs
+	 * from BL31 will be suppressed.
+	 */
+	console_uninit();
+}
+
 #if !ENABLE_PLAT_COMPAT
 /*
  * Helper function for platform_get_pos() when platform compatibility is