From: James Liao Date: Tue, 15 Nov 2022 12:33:18 +0000 (+0800) Subject: feat(mediatek): add SPM's SSPM notifier X-Git-Tag: baikal/aarch64/sdk5.10~1^2~262^2~7 X-Git-Url: https://git.baikalelectronics.ru/?a=commitdiff_plain;h=c234ad17d7d7278e1afa0f416982bb0f60a04dcf;p=arm-tf.git feat(mediatek): add SPM's SSPM notifier The notifier is used to notify SSPM to sleep when system suspend or notify SSPM to wakeup when system resume. Change-Id: I027ca356a84ea1e58be54a8a5eb302b3b96c2e22 Signed-off-by: James Liao --- diff --git a/plat/mediatek/drivers/spm/version/notifier/inc/mt_spm_notifier.h b/plat/mediatek/drivers/spm/version/notifier/inc/mt_spm_notifier.h new file mode 100644 index 000000000..4d1262429 --- /dev/null +++ b/plat/mediatek/drivers/spm/version/notifier/inc/mt_spm_notifier.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023, MediaTek Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MT_SPM_NOTIFIER_H +#define MT_SPM_NOTIFIER_H + +enum mt_spm_sspm_notify_id { + MT_SPM_NOTIFY_LP_ENTER = 0, + MT_SPM_NOTIFY_LP_LEAVE, + MT_SPM_NOTIFY_SUSPEND_VCORE_VOLTAGE, +}; + +#ifdef MTK_PLAT_SPM_SSPM_NOTIFIER_UNSUPPORT +static inline int mt_spm_sspm_notify_u32(int type, unsigned int val) +{ + (void)type; + (void)val; + return 0; +} +#else +int mt_spm_sspm_notify_u32(int type, unsigned int val); +#endif + +#endif /* MT_SPM_NOTIFIER_H */ diff --git a/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_intc.h b/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_intc.h new file mode 100644 index 000000000..e57a966b6 --- /dev/null +++ b/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_intc.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2023, MediaTek Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MT_SPM_SSPM_INTC_H +#define MT_SPM_SSPM_INTC_H + +#include + +#define MT_SPM_SSPM_INTC_SEL_0 (0x10) +#define MT_SPM_SSPM_INTC_SEL_1 (0x20) +#define MT_SPM_SSPM_INTC_SEL_2 (0x40) +#define MT_SPM_SSPM_INTC_SEL_3 (0x80) + +#define MT_SPM_SSPM_INTC_TRIGGER(id, sg) (((0x10 << (id)) | (sg << (id))) & 0xFF) + +#define MT_SPM_SSPM_INTC0_HIGH MT_SPM_SSPM_INTC_TRIGGER(0, 1) +#define MT_SPM_SSPM_INTC0_LOW MT_SPM_SSPM_INTC_TRIGGER(0, 0) + +#define MT_SPM_SSPM_INTC1_HIGH MT_SPM_SSPM_INTC_TRIGGER(1, 1) +#define MT_SPM_SSPM_INTC1_LOW MT_SPM_SSPM_INTC_TRIGGER(1, 0) + +#define MT_SPM_SSPM_INTC2_HIGH MT_SPM_SSPM_INTC_TRIGGER(2, 1) +#define MT_SPM_SSPM_INTC2_LOW MT_SPM_SSPM_INTC_TRIGGER(2, 0) + +#define MT_SPM_SSPM_INTC3_HIGH MT_SPM_SSPM_INTC_TRIGGER(3, 1) +#define MT_SPM_SSPM_INTC3_LOW MT_SPM_SSPM_INTC_TRIGGER(3, 0) + +#define DO_SPM_SSPM_LP_SUSPEND() mmio_write_32(SPM_MD32_IRQ, MT_SPM_SSPM_INTC0_HIGH) + +#define DO_SPM_SSPM_LP_RESUME() mmio_write_32(SPM_MD32_IRQ, MT_SPM_SSPM_INTC0_LOW) + +#endif /* MT_SPM_SSPM_INTC_H */ diff --git a/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_notifier.c b/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_notifier.c new file mode 100644 index 000000000..081988fdb --- /dev/null +++ b/plat/mediatek/drivers/spm/version/notifier/v1/mt_spm_sspm_notifier.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023, MediaTek Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include "mt_spm_notifier.h" +#include "mt_spm_sspm_intc.h" +#include + +#define MT_SPM_SSPM_MBOX_OFF(x) (SSPM_MBOX_3_BASE + x) +#define MT_SPM_MBOX(slot) MT_SPM_SSPM_MBOX_OFF((slot << 2UL)) + +/* LOOKUP SSPM_MBOX_SPM_LP1 */ +#define SSPM_MBOX_SPM_LP_LOOKUP1 MT_SPM_MBOX(0) +/* LOOKUP SSPM_MBOX_SPM_LP2 */ +#define SSPM_MBOX_SPM_LP_LOOKUP2 MT_SPM_MBOX(1) + +#define SSPM_MBOX_SPM_LP1 MT_SPM_MBOX(2) +#define SSPM_MBOX_SPM_LP2 MT_SPM_MBOX(3) + +int mt_spm_sspm_notify_u32(int type, unsigned int val) +{ + switch (type) { + case MT_SPM_NOTIFY_LP_ENTER: + mmio_write_32(SSPM_MBOX_SPM_LP1, val); + DO_SPM_SSPM_LP_SUSPEND(); + break; + case MT_SPM_NOTIFY_LP_LEAVE: + mmio_write_32(SSPM_MBOX_SPM_LP1, val); + DO_SPM_SSPM_LP_RESUME(); + break; + default: + panic(); + break; + } + return 0; +}