diff --git a/plat/juno/bl31_plat_setup.c b/plat/juno/bl31_plat_setup.c
index ffdfdd4546f70075e262c4be63e543dda4c85b4b..c2c7ff88ec8e8380a8f9e72f35d9bd00aa3df707 100644
--- a/plat/juno/bl31_plat_setup.c
+++ b/plat/juno/bl31_plat_setup.c
@@ -29,6 +29,8 @@
  */
 
 #include <platform.h>
+#include <assert.h>
+#include <arch_helpers.h>
 
 /*******************************************************************************
  * Declarations of linker defined symbols which will help us find the layout
@@ -120,9 +122,19 @@ void bl31_early_platform_setup(bl31_args *from_bl2,
  ******************************************************************************/
 void bl31_platform_setup()
 {
+	unsigned int counter_base_frequency;
 	/* Initialize the gic cpu and distributor interfaces */
 	gic_setup();
 
+	/* Read the frequency from Frequency modes table */
+	counter_base_frequency = mmio_read_32(SYS_CNTCTL_BASE + CNTFID_OFF);
+
+	/* The first entry of the frequency modes table must not be 0 */
+	assert(counter_base_frequency != 0);
+
+	/* Program the counter frequency */
+	write_cntfrq_el0(counter_base_frequency);
+
 	/* Topologies are best known to the platform. */
 	plat_setup_topology();
 }