Files

143 lines
3.2 KiB
C
Raw Permalink Normal View History

2026-08-13 11:28:40 +08:00
/*
* Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
*
* SPDX-License-Identifier: MIT
*/
#include <stdlib.h>
#include <stdint.h>
#include "mailbox-irq.h"
#include "mailbox_soc.h"
#include "common.h"
#define AOTAG "AOCPU"
#define PRINT_DBG(...) //printf(__VA_ARGS__)
#define PRINT_ERR(...) printf(__VA_ARGS__)
#define NO_DISABLE_IRQ 1
#define aml_writel32(val, reg) (REG32(reg) = val)
#define aml_readl32(reg) (REG32(reg))
struct xHandlerTableEntry xMbHandlerTable[IRQ_MAX];
void vMbDefaultHandler(void *vArg)
{
(void)vArg;
}
void vSetMbIrqHandler(unsigned int xNum, vHandlerFunc vHandler, void *vArg, unsigned int xPriority)
{
PRINT_DBG("%s xNum:%d\n", __func__, xNum);
if (vHandler == NULL) {
xMbHandlerTable[xNum].vHandler = &vMbDefaultHandler;
xMbHandlerTable[xNum].vArg = NULL;
} else {
xMbHandlerTable[xNum].vHandler = vHandler;
xMbHandlerTable[xNum].vArg = vArg;
}
xMbHandlerTable[xNum].xPriority = xPriority;
}
void vMbSetIrqPriority(unsigned int xNum, unsigned int xPriority)
{
xMbHandlerTable[xNum].xPriority = xPriority;
}
#if (IRQ_MAX == 64)
void vEnableMbInterrupt(uint64_t xMask)
#else
void vEnableMbInterrupt(uint32_t xMask)
#endif
{
#ifndef NO_DISABLE_IRQ
#if (IRQ_MAX == 64)
uint32_t ulValHigh = 0;
uint32_t ulValLow = 0;
uint32_t ulMaskHigh = 0;
uint32_t ulMaskLow = 0;
ulMaskHigh = (uint32_t)(xMask >> 32);
ulMaskLow = (uint32_t)(xMask & 0xFFFFFFFF);
ulValHigh = aml_readl32(MAILBOX_IRQ_MASK1) | ulMaskHigh;
ulValLow = aml_readl32(MAILBOX_IRQ_MASK) | ulMaskLow;
aml_writel32(ulMaskHigh, MAILBOX_IRQ_MASK1);
aml_writel32(ulMaskLow, MAILBOX_IRQ_MASK);
#else
uint32_t ulVal = 0;
ulVal = aml_readl32(MAILBOX_IRQ_MASK) | xMask;
aml_writel32(ulVal, MAILBOX_IRQ_MASK);
#endif /* #if (IRQ_MAX == 64) */
#else
(void)xMask;
#endif /* #ifndef NO_DISABLE_IRQ */
}
#if (IRQ_MAX == 64)
void vDisableMbInterrupt(uint64_t xMask)
#else
void vDisableMbInterrupt(uint32_t xMask)
#endif
{
#ifndef NO_DISABLE_IRQ
#if (IRQ_MAX == 64)
uint32_t ulValHigh = 0;
uint32_t ulValLow = 0;
uint32_t ulMaskHigh = 0;
uint32_t ulMaskLow = 0;
ulValHigh = (uint32_t)(xMask >> 32);
ulValLow = (uint32_t)(xMask & 0xFFFFFFFF);
ulValHigh = aml_readl32(MAILBOX_IRQ_MASK1) & (~ulValHigh);
ulValLow = aml_readl32(MAILBOX_IRQ_MASK) & (~ulValLow);
aml_writel32(ulValHigh, MAILBOX_IRQ_MASK1);
aml_writel32(ulValLow, MAILBOX_IRQ_MASK);
#else
uint32_t ulVal = 0;
ulVal = aml_readl32(MAILBOX_IRQ_MASK) & (~xMask);
aml_writel32(ulVal, MAILBOX_IRQ_MASK);
#endif /* #if (IRQ_MAX == 64) */
#else
(void)xMask;
#endif /* #ifndef NO_DISABLE_IRQ */
}
#if (IRQ_MAX == 64)
void vClrMbInterrupt(uint64_t xMask)
#else
void vClrMbInterrupt(uint32_t xMask)
#endif
{
#if (IRQ_MAX == 64)
uint32_t lval = 0, hval = 0;
lval = xMask & 0xffffffff;
hval = (xMask >> 32) & 0xffffffff;
aml_writel32(lval, MAILBOX_IRQ_CLR);
aml_writel32(hval, MAILBOX_IRQ_CLR1);
#else
aml_writel32(xMask, MAILBOX_IRQ_CLR);
#endif
}
uint64_t xGetMbIrqStats(void)
{
#if (IRQ_MAX == 64)
uint64_t val = 0;
uint32_t lval = 0, hval = 0;
lval = aml_readl32(MAILBOX_IRQ_STS);
hval = aml_readl32(MAILBOX_IRQ_STS1);
val = hval;
val = ((val & 0xffffffff) << 32) | lval;
return val;
#else
return aml_readl32(MAILBOX_IRQ_STS);
#endif
}