Commit 02051ead authored by Dietmar Eggemann's avatar Dietmar Eggemann Committed by Will Deacon

ARM: coresight: common definition for (OS) Lock Access Register key value

Coresight components and debug are using a common lock control mechansim.
Writing 0xC5ACCE55 to the Lock Access Register (LAR) in case of a coresight
components enables further access to the coresight device registers. Writing
any other value to it removes the write access.
Writing 0xC5ACCE55 to the OS Lock Access Register (OSLAR) in case of debug
locks the debug register for further access to the debug registers. Writing
any other value to it unlocks the debug registers.

Unfortunately, the existing coresight code uses the terms lock and unlock the
other way around. Unlocking stands for enabling write access and locking for
removing write access.

That is why the definition of the LAR and OSLAR key value has been changed to
CS_LAR_KEY.
Signed-off-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 9931faca
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define __ASMARM_CTI_H #define __ASMARM_CTI_H
#include <asm/io.h> #include <asm/io.h>
#include <asm/hardware/coresight.h>
/* The registers' definition is from section 3.2 of /* The registers' definition is from section 3.2 of
* Embedded Cross Trigger Revision: r0p0 * Embedded Cross Trigger Revision: r0p0
...@@ -35,11 +36,6 @@ ...@@ -35,11 +36,6 @@
#define LOCKACCESS 0xFB0 #define LOCKACCESS 0xFB0
#define LOCKSTATUS 0xFB4 #define LOCKSTATUS 0xFB4
/* write this value to LOCKACCESS will unlock the module, and
* other value will lock the module
*/
#define LOCKCODE 0xC5ACCE55
/** /**
* struct cti - cross trigger interface struct * struct cti - cross trigger interface struct
* @base: mapped virtual address for the cti base * @base: mapped virtual address for the cti base
...@@ -146,7 +142,7 @@ static inline void cti_irq_ack(struct cti *cti) ...@@ -146,7 +142,7 @@ static inline void cti_irq_ack(struct cti *cti)
*/ */
static inline void cti_unlock(struct cti *cti) static inline void cti_unlock(struct cti *cti)
{ {
__raw_writel(LOCKCODE, cti->base + LOCKACCESS); __raw_writel(CS_LAR_KEY, cti->base + LOCKACCESS);
} }
/** /**
...@@ -158,6 +154,6 @@ static inline void cti_unlock(struct cti *cti) ...@@ -158,6 +154,6 @@ static inline void cti_unlock(struct cti *cti)
*/ */
static inline void cti_lock(struct cti *cti) static inline void cti_lock(struct cti *cti)
{ {
__raw_writel(~LOCKCODE, cti->base + LOCKACCESS); __raw_writel(~CS_LAR_KEY, cti->base + LOCKACCESS);
} }
#endif #endif
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
/* CoreSight Component Registers */ /* CoreSight Component Registers */
#define CSCR_CLASS 0xff4 #define CSCR_CLASS 0xff4
#define UNLOCK_MAGIC 0xc5acce55 #define CS_LAR_KEY 0xc5acce55
/* ETM control register, "ETM Architecture", 3.3.1 */ /* ETM control register, "ETM Architecture", 3.3.1 */
#define ETMR_CTRL 0 #define ETMR_CTRL 0
...@@ -147,11 +147,11 @@ ...@@ -147,11 +147,11 @@
#define etm_lock(t) do { etm_writel((t), 0, CSMR_LOCKACCESS); } while (0) #define etm_lock(t) do { etm_writel((t), 0, CSMR_LOCKACCESS); } while (0)
#define etm_unlock(t) \ #define etm_unlock(t) \
do { etm_writel((t), UNLOCK_MAGIC, CSMR_LOCKACCESS); } while (0) do { etm_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0)
#define etb_lock(t) do { etb_writel((t), 0, CSMR_LOCKACCESS); } while (0) #define etb_lock(t) do { etb_writel((t), 0, CSMR_LOCKACCESS); } while (0)
#define etb_unlock(t) \ #define etb_unlock(t) \
do { etb_writel((t), UNLOCK_MAGIC, CSMR_LOCKACCESS); } while (0) do { etb_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0)
#endif /* __ASM_HARDWARE_CORESIGHT_H */ #endif /* __ASM_HARDWARE_CORESIGHT_H */
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <asm/hw_breakpoint.h> #include <asm/hw_breakpoint.h>
#include <asm/kdebug.h> #include <asm/kdebug.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/hardware/coresight.h>
/* Breakpoint currently in use for each BRP. */ /* Breakpoint currently in use for each BRP. */
static DEFINE_PER_CPU(struct perf_event *, bp_on_reg[ARM_MAX_BRP]); static DEFINE_PER_CPU(struct perf_event *, bp_on_reg[ARM_MAX_BRP]);
...@@ -955,9 +956,9 @@ static void reset_ctrl_regs(void *unused) ...@@ -955,9 +956,9 @@ static void reset_ctrl_regs(void *unused)
/* /*
* Unconditionally clear the OS lock by writing a value * Unconditionally clear the OS lock by writing a value
* other than 0xC5ACCE55 to the access register. * other than CS_LAR_KEY to the access register.
*/ */
ARM_DBG_WRITE(c1, c0, 4, 0); ARM_DBG_WRITE(c1, c0, 4, ~CS_LAR_KEY);
isb(); isb();
/* /*
......
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