/** @file
|
|
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
System Control and Management Interface V1.0
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
|
Juno ARM Development Platform SoC
|
https://www.arm.com/files/pdf/
|
DDI0515D1a_juno_arm_development_platform_soc_trm.pdf
|
**/
|
|
#ifndef ARM_JUNO_MTL_PRIVATE_LIB_H_
|
#define ARM_JUNO_MTL_PRIVATE_LIB_H_
|
|
// Mailbox transport layer.
|
#define MTL_DOORBELL_MODIFY_MASK (0x00000001U)
|
#define MTL_DOORBELL_PRESERVE_MASK (~MTL_DOORBELL_MODIFY_MASK)
|
|
#define MTL_DOORBELL_BASE (FixedPcdGet64 (PcdArmMtlDoorBell))
|
#define MTL_MAILBOX_BASE (FixedPcdGet64 (PcdArmMtlMailBoxBase))
|
#define MTL_MAILBOX_SIZE (FixedPcdGet32 (PcdArmMtlMailBoxSize))
|
|
#define MTL_POLL 0
|
#define MTL_INTR 1
|
|
/* For Juno, the mailbox for high priority is non-trusted SRAM + 256.
|
|
NOTE: Below is not documented anywhere (yet)
|
|
The payload sizes are 128 bytes.
|
|
There are two channels:
|
|
Channel 0
|
- Agent (OS) to Platform (SCP) memory base: non-trusted SRAM + 0
|
- Platform (SCP) to Agent (OS) memory base: non-trusted SRAM + 128
|
- Doorbell (both directions): MHU, bit 0
|
|
Channel 1
|
- Agent (OS) to Platform (SCP) memory base: non-trusted SRAM + 256
|
- Platform (SCP) to Agent (OS) memory base: non-trusted SRAM + 384
|
- Doorbell (both directions): MHU, bit 0
|
*/
|
#define MTL_MAILBOX_HIGH_PRIORITY_OFFSET (MTL_MAILBOX_SIZE * 2)
|
|
// ARM MHU interrupt registers.
|
#define CPU_INTR_L_SET 0x108
|
#define CPU_INTR_H_SET 0x128
|
|
// MTL uses MHU interrupt registers for communication with the SCP.
|
#define MTL_DOORBELL_REGISTER_LOW (MTL_DOORBELL_BASE + CPU_INTR_L_SET)
|
#define MTL_DOORBELL_REGISTER_HIGH (MTL_DOORBELL_BASE + CPU_INTR_H_SET)
|
|
#define MTL_CHANNEL_BUSY 0
|
#define MTL_CHANNEL_FREE 1
|
|
// Response time out value on a MHU channel 20ms.
|
#define RESPONSE_TIMEOUT 20000
|
|
/* As per SCMI spec. as a agent UEFI(or OS) can access only two channels
|
(low or high priority) secure channel is only accessible
|
to ARM Trusted firmware. */
|
#define NUM_CHANNELS 2
|
|
/* Each channel must use a doorbell register to interrupt the SCP firmware.
|
on Juno these are MHU interrupt registers for low and high priority
|
channels. */
|
#define DOORBELL_LOW { \
|
MTL_DOORBELL_REGISTER_LOW, \
|
MTL_DOORBELL_MODIFY_MASK, \
|
MTL_DOORBELL_PRESERVE_MASK \
|
}
|
|
#define DOORBELL_HIGH { \
|
MTL_DOORBELL_REGISTER_HIGH, \
|
MTL_DOORBELL_MODIFY_MASK, \
|
MTL_DOORBELL_PRESERVE_MASK \
|
}
|
|
// Arbitarary poll time.
|
#define MTL_POLL_WAIT_TIME 100
|
|
#endif /* ARM_JUNO_MTL_PRIVATE_LIB_H_ */
|
|