diff --git a/plat/arm/css/common/css_common.mk b/plat/arm/css/common/css_common.mk
index 65e125e..86ba6df 100644
--- a/plat/arm/css/common/css_common.mk
+++ b/plat/arm/css/common/css_common.mk
@@ -41,18 +41,18 @@
 BL1_SOURCES		+=	plat/arm/css/common/css_bl1_setup.c
 
 BL2_SOURCES		+=	plat/arm/css/common/css_bl2_setup.c		\
-				plat/arm/css/common/css_mhu.c			\
-				plat/arm/css/common/css_scpi.c
+				plat/arm/css/drivers/scpi/css_mhu.c		\
+				plat/arm/css/drivers/scpi/css_scpi.c
 
 BL2U_SOURCES		+=	plat/arm/css/common/css_bl2u_setup.c		\
-				plat/arm/css/common/css_mhu.c			\
-				plat/arm/css/common/css_scpi.c
+				plat/arm/css/drivers/scpi/css_mhu.c		\
+				plat/arm/css/drivers/scpi/css_scpi.c
 
-BL31_SOURCES		+=	plat/arm/css/common/css_mhu.c			\
-				plat/arm/css/common/css_pm.c			\
-				plat/arm/css/common/css_scpi.c			\
-				plat/arm/css/common/css_topology.c
-
+BL31_SOURCES		+=	plat/arm/css/common/css_pm.c			\
+				plat/arm/css/common/css_topology.c		\
+				plat/arm/css/drivers/scp/css_pm_scpi.c		\
+				plat/arm/css/drivers/scpi/css_mhu.c		\
+				plat/arm/css/drivers/scpi/css_scpi.c
 
 ifneq (${RESET_TO_BL31},0)
   $(error "Using BL31 as the reset vector is not supported on CSS platforms. \
diff --git a/plat/arm/css/common/css_mhu.c b/plat/arm/css/common/css_mhu.c
deleted file mode 100644
index 265d6c2..0000000
--- a/plat/arm/css/common/css_mhu.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arch_helpers.h>
-#include <assert.h>
-#include <bakery_lock.h>
-#include <css_def.h>
-#include <mmio.h>
-#include <platform_def.h>
-#include <plat_arm.h>
-#include "css_mhu.h"
-
-/* SCP MHU secure channel registers */
-#define SCP_INTR_S_STAT		0x200
-#define SCP_INTR_S_SET		0x208
-#define SCP_INTR_S_CLEAR	0x210
-
-/* CPU MHU secure channel registers */
-#define CPU_INTR_S_STAT		0x300
-#define CPU_INTR_S_SET		0x308
-#define CPU_INTR_S_CLEAR	0x310
-
-ARM_INSTANTIATE_LOCK
-
-/* Weak definition may be overridden in specific CSS based platform */
-#pragma weak plat_arm_pwrc_setup
-
-
-/*
- * Slot 31 is reserved because the MHU hardware uses this register bit to
- * indicate a non-secure access attempt. The total number of available slots is
- * therefore 31 [30:0].
- */
-#define MHU_MAX_SLOT_ID		30
-
-void mhu_secure_message_start(unsigned int slot_id)
-{
-	assert(slot_id <= MHU_MAX_SLOT_ID);
-
-	arm_lock_get();
-
-	/* Make sure any previous command has finished */
-	while (mmio_read_32(PLAT_CSS_MHU_BASE + CPU_INTR_S_STAT) &
-							(1 << slot_id))
-		;
-}
-
-void mhu_secure_message_send(unsigned int slot_id)
-{
-	assert(slot_id <= MHU_MAX_SLOT_ID);
-	assert(!(mmio_read_32(PLAT_CSS_MHU_BASE + CPU_INTR_S_STAT) &
-							(1 << slot_id)));
-
-	/* Send command to SCP */
-	mmio_write_32(PLAT_CSS_MHU_BASE + CPU_INTR_S_SET, 1 << slot_id);
-}
-
-uint32_t mhu_secure_message_wait(void)
-{
-	/* Wait for response from SCP */
-	uint32_t response;
-	while (!(response = mmio_read_32(PLAT_CSS_MHU_BASE + SCP_INTR_S_STAT)))
-		;
-
-	return response;
-}
-
-void mhu_secure_message_end(unsigned int slot_id)
-{
-	assert(slot_id <= MHU_MAX_SLOT_ID);
-
-	/*
-	 * Clear any response we got by writing one in the relevant slot bit to
-	 * the CLEAR register
-	 */
-	mmio_write_32(PLAT_CSS_MHU_BASE + SCP_INTR_S_CLEAR, 1 << slot_id);
-
-	arm_lock_release();
-}
-
-void mhu_secure_init(void)
-{
-	arm_lock_init();
-
-	/*
-	 * The STAT register resets to zero. Ensure it is in the expected state,
-	 * as a stale or garbage value would make us think it's a message we've
-	 * already sent.
-	 */
-	assert(mmio_read_32(PLAT_CSS_MHU_BASE + CPU_INTR_S_STAT) == 0);
-}
-
-void plat_arm_pwrc_setup(void)
-{
-	mhu_secure_init();
-}
diff --git a/plat/arm/css/common/css_mhu.h b/plat/arm/css/common/css_mhu.h
deleted file mode 100644
index 2175cdf..0000000
--- a/plat/arm/css/common/css_mhu.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2014-2015, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CSS_MHU_H__
-#define __CSS_MHU_H__
-
-#include <stdint.h>
-
-void mhu_secure_message_start(unsigned int slot_id);
-void mhu_secure_message_send(unsigned int slot_id);
-uint32_t mhu_secure_message_wait(void);
-void mhu_secure_message_end(unsigned int slot_id);
-
-void mhu_secure_init(void);
-
-#endif	/* __CSS_MHU_H__ */
diff --git a/plat/arm/css/common/css_pm.c b/plat/arm/css/common/css_pm.c
index 7607f61..65d2733 100644
--- a/plat/arm/css/common/css_pm.c
+++ b/plat/arm/css/common/css_pm.c
@@ -37,13 +37,7 @@
 #include <plat_arm.h>
 #include <platform.h>
 #include <platform_def.h>
-#include "css_scpi.h"
-
-/* Macros to read the CSS power domain state */
-#define CSS_CORE_PWR_STATE(state)	(state)->pwr_domain_state[ARM_PWR_LVL0]
-#define CSS_CLUSTER_PWR_STATE(state)	(state)->pwr_domain_state[ARM_PWR_LVL1]
-#define CSS_SYSTEM_PWR_STATE(state)	((PLAT_MAX_PWR_LVL > ARM_PWR_LVL1) ?\
-				(state)->pwr_domain_state[ARM_PWR_LVL2] : 0)
+#include "../drivers/scp/css_scp.h"
 
 /* Allow CSS platforms to override `plat_arm_psci_pm_ops` */
 #pragma weak plat_arm_psci_pm_ops
@@ -87,12 +81,7 @@
  ******************************************************************************/
 int css_pwr_domain_on(u_register_t mpidr)
 {
-	/*
-	 * SCP takes care of powering up parent power domains so we
-	 * only need to care about level 0
-	 */
-	scpi_set_css_power_state(mpidr, scpi_power_on, scpi_power_on,
-				 scpi_power_on);
+	css_scp_on(mpidr);
 
 	return PSCI_E_SUCCESS;
 }
@@ -140,30 +129,12 @@
  ******************************************************************************/
 static void css_power_down_common(const psci_power_state_t *target_state)
 {
-	uint32_t cluster_state = scpi_power_on;
-	uint32_t system_state = scpi_power_on;
-
 	/* Prevent interrupts from spuriously waking up this cpu */
 	plat_arm_gic_cpuif_disable();
 
-	/* Check if power down at system power domain level is requested */
-	if (CSS_SYSTEM_PWR_STATE(target_state) == ARM_LOCAL_STATE_OFF)
-			system_state = scpi_power_retention;
-
 	/* Cluster is to be turned off, so disable coherency */
-	if (CSS_CLUSTER_PWR_STATE(target_state) == ARM_LOCAL_STATE_OFF) {
+	if (CSS_CLUSTER_PWR_STATE(target_state) == ARM_LOCAL_STATE_OFF)
 		plat_arm_interconnect_exit_coherency();
-		cluster_state = scpi_power_off;
-	}
-
-	/*
-	 * Ask the SCP to power down the appropriate components depending upon
-	 * their state.
-	 */
-	scpi_set_css_power_state(read_mpidr_el1(),
-				 scpi_power_off,
-				 cluster_state,
-				 system_state);
 }
 
 /*******************************************************************************
@@ -174,6 +145,7 @@
 {
 	assert(CSS_CORE_PWR_STATE(target_state) == ARM_LOCAL_STATE_OFF);
 	css_power_down_common(target_state);
+	css_scp_off(target_state);
 }
 
 /*******************************************************************************
@@ -191,6 +163,7 @@
 
 	assert(CSS_CORE_PWR_STATE(target_state) == ARM_LOCAL_STATE_OFF);
 	css_power_down_common(target_state);
+	css_scp_suspend(target_state);
 }
 
 /*******************************************************************************
@@ -222,34 +195,12 @@
  ******************************************************************************/
 void __dead2 css_system_off(void)
 {
-	uint32_t response;
-
-	/* Send the power down request to the SCP */
-	response = scpi_sys_power_state(scpi_system_shutdown);
-
-	if (response != SCP_OK) {
-		ERROR("CSS System Off: SCP error %u.\n", response);
-		panic();
-	}
-	wfi();
-	ERROR("CSS System Off: operation not handled.\n");
-	panic();
+	css_scp_sys_shutdown();
 }
 
 void __dead2 css_system_reset(void)
 {
-	uint32_t response;
-
-	/* Send the system reset request to the SCP */
-	response = scpi_sys_power_state(scpi_system_reboot);
-
-	if (response != SCP_OK) {
-		ERROR("CSS System Reset: SCP error %u.\n", response);
-		panic();
-	}
-	wfi();
-	ERROR("CSS System Reset: operation not handled.\n");
-	panic();
+	css_scp_sys_reboot();
 }
 
 /*******************************************************************************
@@ -303,36 +254,7 @@
  ******************************************************************************/
 int css_node_hw_state(u_register_t mpidr, unsigned int power_level)
 {
-	int rc, element;
-	unsigned int cpu_state, cluster_state;
-
-	/*
-	 * The format of 'power_level' is implementation-defined, but 0 must
-	 * mean a CPU. We also allow 1 to denote the cluster
-	 */
-	if (power_level != ARM_PWR_LVL0 && power_level != ARM_PWR_LVL1)
-		return PSCI_E_INVALID_PARAMS;
-
-	/* Query SCP */
-	rc = scpi_get_css_power_state(mpidr, &cpu_state, &cluster_state);
-	if (rc != 0)
-		return PSCI_E_INVALID_PARAMS;
-
-	/* Map power states of CPU and cluster to expected PSCI return codes */
-	if (power_level == ARM_PWR_LVL0) {
-		/*
-		 * The CPU state returned by SCP is an 8-bit bit mask
-		 * corresponding to each CPU in the cluster
-		 */
-		element = mpidr & MPIDR_AFFLVL_MASK;
-		return CSS_CPU_PWR_STATE(cpu_state, element) ==
-			CSS_CPU_PWR_STATE_ON ? HW_ON : HW_OFF;
-	} else {
-		assert(cluster_state == CSS_CLUSTER_PWR_STATE_ON ||
-				cluster_state == CSS_CLUSTER_PWR_STATE_OFF);
-		return cluster_state == CSS_CLUSTER_PWR_STATE_ON ? HW_ON :
-			HW_OFF;
-	}
+	return css_scp_get_power_state(mpidr, power_level);
 }
 
 /*******************************************************************************
diff --git a/plat/arm/css/common/css_scp_bootloader.c b/plat/arm/css/common/css_scp_bootloader.c
index d3f671e..049afe4 100644
--- a/plat/arm/css/common/css_scp_bootloader.c
+++ b/plat/arm/css/common/css_scp_bootloader.c
@@ -34,9 +34,9 @@
 #include <debug.h>
 #include <platform.h>
 #include <stdint.h>
-#include "css_mhu.h"
+#include "../drivers/scpi/css_mhu.h"
+#include "../drivers/scpi/css_scpi.h"
 #include "css_scp_bootloader.h"
-#include "css_scpi.h"
 
 /* ID of the MHU slot used for the BOM protocol */
 #define BOM_MHU_SLOT_ID		0
diff --git a/plat/arm/css/common/css_scpi.c b/plat/arm/css/common/css_scpi.c
deleted file mode 100644
index 90a8939..0000000
--- a/plat/arm/css/common/css_scpi.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <arch_helpers.h>
-#include <assert.h>
-#include <css_def.h>
-#include <debug.h>
-#include <platform.h>
-#include <string.h>
-#include "css_mhu.h"
-#include "css_scpi.h"
-
-#define SCPI_SHARED_MEM_SCP_TO_AP	PLAT_CSS_SCP_COM_SHARED_MEM_BASE
-#define SCPI_SHARED_MEM_AP_TO_SCP	(PLAT_CSS_SCP_COM_SHARED_MEM_BASE \
-								 + 0x100)
-
-/* Header and payload addresses for commands from AP to SCP */
-#define SCPI_CMD_HEADER_AP_TO_SCP		\
-	((scpi_cmd_t *) SCPI_SHARED_MEM_AP_TO_SCP)
-#define SCPI_CMD_PAYLOAD_AP_TO_SCP		\
-	((void *) (SCPI_SHARED_MEM_AP_TO_SCP + sizeof(scpi_cmd_t)))
-
-/* Header and payload addresses for responses from SCP to AP */
-#define SCPI_RES_HEADER_SCP_TO_AP \
-	((scpi_cmd_t *) SCPI_SHARED_MEM_SCP_TO_AP)
-#define SCPI_RES_PAYLOAD_SCP_TO_AP \
-	((void *) (SCPI_SHARED_MEM_SCP_TO_AP + sizeof(scpi_cmd_t)))
-
-/* ID of the MHU slot used for the SCPI protocol */
-#define SCPI_MHU_SLOT_ID		0
-
-static void scpi_secure_message_start(void)
-{
-	mhu_secure_message_start(SCPI_MHU_SLOT_ID);
-}
-
-static void scpi_secure_message_send(size_t payload_size)
-{
-	/* Ensure that any write to the SCPI payload area is seen by SCP before
-	 * we write to the MHU register. If these 2 writes were reordered by
-	 * the CPU then SCP would read stale payload data */
-	dmbst();
-
-	mhu_secure_message_send(SCPI_MHU_SLOT_ID);
-}
-
-static void scpi_secure_message_receive(scpi_cmd_t *cmd)
-{
-	uint32_t mhu_status;
-
-	assert(cmd != NULL);
-
-	mhu_status = mhu_secure_message_wait();
-
-	/* Expect an SCPI message, reject any other protocol */
-	if (mhu_status != (1 << SCPI_MHU_SLOT_ID)) {
-		ERROR("MHU: Unexpected protocol (MHU status: 0x%x)\n",
-			mhu_status);
-		panic();
-	}
-
-	/* Ensure that any read to the SCPI payload area is done after reading
-	 * the MHU register. If these 2 reads were reordered then the CPU would
-	 * read invalid payload data */
-	dmbld();
-
-	memcpy(cmd, (void *) SCPI_SHARED_MEM_SCP_TO_AP, sizeof(*cmd));
-}
-
-static void scpi_secure_message_end(void)
-{
-	mhu_secure_message_end(SCPI_MHU_SLOT_ID);
-}
-
-int scpi_wait_ready(void)
-{
-	scpi_cmd_t scpi_cmd;
-
-	VERBOSE("Waiting for SCP_READY command...\n");
-
-	/* Get a message from the SCP */
-	scpi_secure_message_start();
-	scpi_secure_message_receive(&scpi_cmd);
-	scpi_secure_message_end();
-
-	/* We are expecting 'SCP Ready', produce correct error if it's not */
-	scpi_status_t status = SCP_OK;
-	if (scpi_cmd.id != SCPI_CMD_SCP_READY) {
-		ERROR("Unexpected SCP command: expected command #%u, got command #%u\n",
-		      SCPI_CMD_SCP_READY, scpi_cmd.id);
-		status = SCP_E_SUPPORT;
-	} else if (scpi_cmd.size != 0) {
-		ERROR("SCP_READY command has incorrect size: expected 0, got %u\n",
-		      scpi_cmd.size);
-		status = SCP_E_SIZE;
-	}
-
-	VERBOSE("Sending response for SCP_READY command\n");
-
-	/*
-	 * Send our response back to SCP.
-	 * We are using the same SCPI header, just update the status field.
-	 */
-	scpi_cmd.status = status;
-	scpi_secure_message_start();
-	memcpy((void *) SCPI_SHARED_MEM_AP_TO_SCP, &scpi_cmd, sizeof(scpi_cmd));
-	scpi_secure_message_send(0);
-	scpi_secure_message_end();
-
-	return status == SCP_OK ? 0 : -1;
-}
-
-void scpi_set_css_power_state(unsigned mpidr, scpi_power_state_t cpu_state,
-		scpi_power_state_t cluster_state, scpi_power_state_t css_state)
-{
-	scpi_cmd_t *cmd;
-	uint32_t state = 0;
-	uint32_t *payload_addr;
-
-	state |= mpidr & 0x0f;	/* CPU ID */
-	state |= (mpidr & 0xf00) >> 4;	/* Cluster ID */
-	state |= cpu_state << 8;
-	state |= cluster_state << 12;
-	state |= css_state << 16;
-
-	scpi_secure_message_start();
-
-	/* Populate the command header */
-	cmd = SCPI_CMD_HEADER_AP_TO_SCP;
-	cmd->id = SCPI_CMD_SET_CSS_POWER_STATE;
-	cmd->set = SCPI_SET_NORMAL;
-	cmd->sender = 0;
-	cmd->size = sizeof(state);
-	/* Populate the command payload */
-	payload_addr = SCPI_CMD_PAYLOAD_AP_TO_SCP;
-	*payload_addr = state;
-	scpi_secure_message_send(sizeof(state));
-	/*
-	 * SCP does not reply to this command in order to avoid MHU interrupts
-	 * from the sender, which could interfere with its power state request.
-	 */
-
-	scpi_secure_message_end();
-}
-
-/*
- * Query and obtain CSS power state from SCP.
- *
- * In response to the query, SCP returns power states of all CPUs in all
- * clusters of the system. The returned response is then filtered based on the
- * supplied MPIDR. Power states of requested cluster and CPUs within are updated
- * via. supplied non-NULL pointer arguments.
- *
- * Returns 0 on success, or -1 on errors.
- */
-int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p,
-		unsigned int *cluster_state_p)
-{
-	scpi_cmd_t *cmd;
-	scpi_cmd_t response;
-	int power_state, cpu, cluster, rc = -1;
-
-	/*
-	 * Extract CPU and cluster membership of the given MPIDR. SCPI caters
-	 * for only up to 0xf clusters, and 8 CPUs per cluster
-	 */
-	cpu = mpidr & MPIDR_AFFLVL_MASK;
-	cluster = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
-	if (cpu >= 8 || cluster >= 0xf)
-		return -1;
-
-	scpi_secure_message_start();
-
-	/* Populate request headers */
-	cmd = memset(SCPI_CMD_HEADER_AP_TO_SCP, 0, sizeof(*cmd));
-	cmd->id = SCPI_CMD_GET_CSS_POWER_STATE;
-
-	/*
-	 * Send message and wait for SCP's response
-	 */
-	scpi_secure_message_send(0);
-	scpi_secure_message_receive(&response);
-
-	if (response.status != SCP_OK)
-		goto exit;
-
-	/* Validate SCP response */
-	if (!CHECK_RESPONSE(response, cluster))
-		goto exit;
-
-	/* Extract power states for required cluster */
-	power_state = *(((uint16_t *) SCPI_RES_PAYLOAD_SCP_TO_AP) + cluster);
-	if (CLUSTER_ID(power_state) != cluster)
-		goto exit;
-
-	/* Update power state via. pointers */
-	if (cluster_state_p)
-		*cluster_state_p = CLUSTER_POWER_STATE(power_state);
-	if (cpu_state_p)
-		*cpu_state_p = CPU_POWER_STATE(power_state);
-	rc = 0;
-
-exit:
-	scpi_secure_message_end();
-	return rc;
-}
-
-uint32_t scpi_sys_power_state(scpi_system_state_t system_state)
-{
-	scpi_cmd_t *cmd;
-	uint8_t *payload_addr;
-	scpi_cmd_t response;
-
-	scpi_secure_message_start();
-
-	/* Populate the command header */
-	cmd = SCPI_CMD_HEADER_AP_TO_SCP;
-	cmd->id = SCPI_CMD_SYS_POWER_STATE;
-	cmd->set = 0;
-	cmd->sender = 0;
-	cmd->size = sizeof(*payload_addr);
-	/* Populate the command payload */
-	payload_addr = SCPI_CMD_PAYLOAD_AP_TO_SCP;
-	*payload_addr = system_state & 0xff;
-	scpi_secure_message_send(sizeof(*payload_addr));
-
-	scpi_secure_message_receive(&response);
-
-	scpi_secure_message_end();
-
-	return response.status;
-}
diff --git a/plat/arm/css/common/css_scpi.h b/plat/arm/css/common/css_scpi.h
deleted file mode 100644
index 1fb55e4..0000000
--- a/plat/arm/css/common/css_scpi.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of ARM nor the names of its contributors may be used
- * to endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __CSS_SCPI_H__
-#define __CSS_SCPI_H__
-
-#include <stddef.h>
-#include <stdint.h>
-
-/*
- * An SCPI command consists of a header and a payload.
- * The following structure describes the header. It is 64-bit long.
- */
-typedef struct {
-	/* Command ID */
-	uint32_t id		: 7;
-	/* Set ID. Identifies whether this is a standard or extended command. */
-	uint32_t set		: 1;
-	/* Sender ID to match a reply. The value is sender specific. */
-	uint32_t sender		: 8;
-	/* Size of the payload in bytes (0 - 511) */
-	uint32_t size		: 9;
-	uint32_t reserved	: 7;
-	/*
-	 * Status indicating the success of a command.
-	 * See the enum below.
-	 */
-	uint32_t status;
-} scpi_cmd_t;
-
-typedef enum {
-	SCPI_SET_NORMAL = 0,	/* Normal SCPI commands */
-	SCPI_SET_EXTENDED	/* Extended SCPI commands */
-} scpi_set_t;
-
-enum {
-	SCP_OK = 0,	/* Success */
-	SCP_E_PARAM,	/* Invalid parameter(s) */
-	SCP_E_ALIGN,	/* Invalid alignment */
-	SCP_E_SIZE,	/* Invalid size */
-	SCP_E_HANDLER,	/* Invalid handler or callback */
-	SCP_E_ACCESS,	/* Invalid access or permission denied */
-	SCP_E_RANGE,	/* Value out of range */
-	SCP_E_TIMEOUT,	/* Time out has ocurred */
-	SCP_E_NOMEM,	/* Invalid memory area or pointer */
-	SCP_E_PWRSTATE,	/* Invalid power state */
-	SCP_E_SUPPORT,	/* Feature not supported or disabled */
-	SCPI_E_DEVICE,	/* Device error */
-	SCPI_E_BUSY,	/* Device is busy */
-};
-
-typedef uint32_t scpi_status_t;
-
-typedef enum {
-	SCPI_CMD_SCP_READY = 0x01,
-	SCPI_CMD_SET_CSS_POWER_STATE = 0x03,
-	SCPI_CMD_GET_CSS_POWER_STATE = 0x04,
-	SCPI_CMD_SYS_POWER_STATE = 0x05
-} scpi_command_t;
-
-/*
- * Macros to parse SCP response to GET_CSS_POWER_STATE command
- *
- *   [3:0] : cluster ID
- *   [7:4] : cluster state: 0 = on; 3 = off; rest are reserved
- *   [15:8]: on/off state for individual CPUs in the cluster
- *
- * Payload is in little-endian
- */
-#define CLUSTER_ID(_resp)		((_resp) & 0xf)
-#define CLUSTER_POWER_STATE(_resp)	(((_resp) >> 4) & 0xf)
-
-/* Result is a bit mask of CPU on/off states in the cluster */
-#define CPU_POWER_STATE(_resp)		(((_resp) >> 8) & 0xff)
-
-/*
- * For GET_CSS_POWER_STATE, SCP returns the power states of every cluster. The
- * size of response depends on the number of clusters in the system. The
- * SCP-to-AP payload contains 2 bytes per cluster. Make sure the response is
- * large enough to contain power states of a given cluster
- */
-#define CHECK_RESPONSE(_resp, _clus) \
-	(_resp.size >= (((_clus) + 1) * 2))
-
-typedef enum {
-	scpi_power_on = 0,
-	scpi_power_retention = 1,
-	scpi_power_off = 3,
-} scpi_power_state_t;
-
-typedef enum {
-	scpi_system_shutdown = 0,
-	scpi_system_reboot = 1,
-	scpi_system_reset = 2
-} scpi_system_state_t;
-
-extern int scpi_wait_ready(void);
-extern void scpi_set_css_power_state(unsigned mpidr,
-					scpi_power_state_t cpu_state,
-					scpi_power_state_t cluster_state,
-					scpi_power_state_t css_state);
-int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p,
-		unsigned int *cluster_state_p);
-uint32_t scpi_sys_power_state(scpi_system_state_t system_state);
-
-
-#endif	/* __CSS_SCPI_H__ */
