/** @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_ */

