Browse Source
Currently the SCMI driver supports MHUv1, but Arm platforms may have varied versions of MHU driver, with MHUv2 controllers being in the latest Arm platforms. This patch updates the SCMI driver to support MHUv2, specifically that the sender must send the wake-up to the receiver before initiating any data transfer. Also, the existing mhu driver files, css_mhu.c and css_mhu.h, have been moved from the scpi directory to a new directory, css/drivers/mhu. Change-Id: I9b46b492a3e1d9e26db12d83a9773958a8c8402f Signed-off-by: Samarth Parikh <samarth.parikh@arm.com>pull/1346/head
Samarth Parikh
7 years ago
12 changed files with 105 additions and 24 deletions
@ -1,5 +1,5 @@ |
|||
/*
|
|||
* Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. |
|||
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
@ -1,5 +1,5 @@ |
|||
/*
|
|||
* Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. |
|||
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
@ -0,0 +1,37 @@ |
|||
/*
|
|||
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
|||
|
|||
#include <arch_helpers.h> |
|||
#include <platform_def.h> |
|||
#include "css_mhu_doorbell.h" |
|||
#include "../scmi/scmi.h" |
|||
|
|||
void mhu_ring_doorbell(scmi_channel_plat_info_t *plat_info) |
|||
{ |
|||
MHU_RING_DOORBELL(plat_info->db_reg_addr, |
|||
plat_info->db_modify_mask, |
|||
plat_info->db_preserve_mask); |
|||
return; |
|||
} |
|||
|
|||
void mhuv2_ring_doorbell(scmi_channel_plat_info_t *plat_info) |
|||
{ |
|||
/* wake receiver */ |
|||
MHU_V2_ACCESS_REQUEST(MHUV2_BASE_ADDR); |
|||
|
|||
/* wait for receiver to acknowledge its ready */ |
|||
while (MHU_V2_IS_ACCESS_READY(MHUV2_BASE_ADDR) == 0) |
|||
; |
|||
|
|||
MHU_RING_DOORBELL(plat_info->db_reg_addr, |
|||
plat_info->db_modify_mask, |
|||
plat_info->db_preserve_mask); |
|||
|
|||
/* clear the access request for the recevier */ |
|||
MHU_V2_CLEAR_REQUEST(MHUV2_BASE_ADDR); |
|||
|
|||
return; |
|||
} |
@ -0,0 +1,43 @@ |
|||
/*
|
|||
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. |
|||
* |
|||
* SPDX-License-Identifier: BSD-3-Clause |
|||
*/ |
|||
|
|||
#ifndef CSS_MHU_DOORBELL_H |
|||
#define CSS_MHU_DOORBELL_H |
|||
|
|||
#include <mmio.h> |
|||
#include <stdint.h> |
|||
|
|||
/* MHUv2 Base Address */ |
|||
#define MHUV2_BASE_ADDR PLAT_CSS_MHU_BASE |
|||
|
|||
/* MHUv2 Control Registers Offsets */ |
|||
#define MHU_V2_MSG_NO_CAP_OFFSET 0xF80 |
|||
#define MHU_V2_ACCESS_REQ_OFFSET 0xF88 |
|||
#define MHU_V2_ACCESS_READY_OFFSET 0xF8C |
|||
|
|||
#define SENDER_REG_STAT(CHANNEL) (0x20 * (CHANNEL)) |
|||
#define SENDER_REG_SET(CHANNEL) (0x20 * (CHANNEL)) + 0xC |
|||
|
|||
/* Helper macro to ring doorbell */ |
|||
#define MHU_RING_DOORBELL(addr, modify_mask, preserve_mask) do { \ |
|||
uint32_t db = mmio_read_32(addr) & (preserve_mask); \ |
|||
mmio_write_32(addr, db | (modify_mask)); \ |
|||
} while (0) |
|||
|
|||
#define MHU_V2_ACCESS_REQUEST(addr) \ |
|||
mmio_write_32((addr) + MHU_V2_ACCESS_REQ_OFFSET, 0x1) |
|||
|
|||
#define MHU_V2_CLEAR_REQUEST(addr) \ |
|||
mmio_write_32((addr) + MHU_V2_ACCESS_REQ_OFFSET, 0x0) |
|||
|
|||
#define MHU_V2_IS_ACCESS_READY(addr) \ |
|||
(mmio_read_32((addr) + MHU_V2_ACCESS_READY_OFFSET) & 0x1) |
|||
|
|||
struct scmi_channel_plat_info; |
|||
void mhu_ring_doorbell(struct scmi_channel_plat_info *plat_info); |
|||
void mhuv2_ring_doorbell(struct scmi_channel_plat_info *plat_info); |
|||
|
|||
#endif /* CSS_MHU_DOORBELL_H */ |
Loading…
Reference in new issue