Commit ae551a13 authored by Roberto Vargas's avatar Roberto Vargas
Browse files

cci: Wait before reading status register



The functions cci_enable_snoop_dvm_reqs and cci_disable_snoop_dvm_reqs write
in the SNOOP_CTRL_REGISTER of the slave interface and it polls the status
register to be sure that the operation is finished before leaving the
functions. If the write in SNOOP_CTRL_REGISTER is reordered after the first
read in the status register then these functions can finish before
enabling/disabling snoops and DVM messages.

The CCI500 TRM specifies:

	Wait for the completion of the write to the Snoop Control Register
	before testing the change_pending bit.

Change-Id: Idc7685963f412be1c16bcd3c6e3cca826e2fdf38
Signed-off-by: default avatarRoberto Vargas <roberto.vargas@arm.com>
parent f790cc0a
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
#include <arch.h> #include <arch.h>
#include <arch_helpers.h>
#include <assert.h> #include <assert.h>
#include <cci.h> #include <cci.h>
#include <debug.h> #include <debug.h>
...@@ -142,6 +143,12 @@ void cci_enable_snoop_dvm_reqs(unsigned int master_id) ...@@ -142,6 +143,12 @@ void cci_enable_snoop_dvm_reqs(unsigned int master_id)
SLAVE_IFACE_OFFSET(slave_if_id) + SNOOP_CTRL_REG, SLAVE_IFACE_OFFSET(slave_if_id) + SNOOP_CTRL_REG,
DVM_EN_BIT | SNOOP_EN_BIT); DVM_EN_BIT | SNOOP_EN_BIT);
/*
* Wait for the completion of the write to the Snoop Control Register
* before testing the change_pending bit
*/
dmbish();
/* Wait for the dust to settle down */ /* Wait for the dust to settle down */
while (mmio_read_32(cci_base + STATUS_REG) & CHANGE_PENDING_BIT) while (mmio_read_32(cci_base + STATUS_REG) & CHANGE_PENDING_BIT)
; ;
...@@ -163,6 +170,12 @@ void cci_disable_snoop_dvm_reqs(unsigned int master_id) ...@@ -163,6 +170,12 @@ void cci_disable_snoop_dvm_reqs(unsigned int master_id)
SLAVE_IFACE_OFFSET(slave_if_id) + SNOOP_CTRL_REG, SLAVE_IFACE_OFFSET(slave_if_id) + SNOOP_CTRL_REG,
~(DVM_EN_BIT | SNOOP_EN_BIT)); ~(DVM_EN_BIT | SNOOP_EN_BIT));
/*
* Wait for the completion of the write to the Snoop Control Register
* before testing the change_pending bit
*/
dmbish();
/* Wait for the dust to settle down */ /* Wait for the dust to settle down */
while (mmio_read_32(cci_base + STATUS_REG) & CHANGE_PENDING_BIT) while (mmio_read_32(cci_base + STATUS_REG) & CHANGE_PENDING_BIT)
; ;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment