From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 03:04:41 +0000 Subject: [PATCH] rk3568 rt init --- kernel/drivers/firmware/rockchip_sip.c | 32 +++++++++++++++++++++++++------- 1 files changed, 25 insertions(+), 7 deletions(-) diff --git a/kernel/drivers/firmware/rockchip_sip.c b/kernel/drivers/firmware/rockchip_sip.c index 8658fa6..7f2073c 100644 --- a/kernel/drivers/firmware/rockchip_sip.c +++ b/kernel/drivers/firmware/rockchip_sip.c @@ -291,17 +291,20 @@ */ #ifdef CONFIG_ARM64 #define SIP_UARTDBG_FN SIP_UARTDBG_CFG64 +#define SIP_FIQ_DBG_STACK_SIZE IRQ_STACK_SIZE #else #define SIP_UARTDBG_FN SIP_UARTDBG_CFG +#define SIP_FIQ_DBG_STACK_SIZE SZ_8K + static int firmware_64_32bit; #endif static int fiq_sip_enabled; static int fiq_target_cpu; +static unsigned long fiq_stack_top; static phys_addr_t ft_fiq_mem_phy; static void __iomem *ft_fiq_mem_base; -static void (*sip_fiq_debugger_uart_irq_tf)(struct pt_regs *_pt_regs, - uint32_t cpu); +static sip_fiq_debugger_uart_irq_tf_cb_t sip_fiq_debugger_uart_irq_tf; static struct pt_regs fiq_pt_regs; int sip_fiq_debugger_is_enabled(void) @@ -388,7 +391,7 @@ static void sip_fiq_debugger_uart_irq_tf_cb(unsigned long sp_el1, unsigned long offset, - uint32_t cpu) + unsigned long cpu) { char *cpu_context; @@ -403,15 +406,30 @@ __invoke_sip_fn_smc(SIP_UARTDBG_FN, 0, 0, UARTDBG_CFG_OSHDL_TO_OS); } -int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn) +int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, sip_fiq_debugger_uart_irq_tf_cb_t callback_fn) { struct arm_smccc_res res; + /* Alloc a page for fiq_debugger's stack */ + if (fiq_stack_top == 0) { + fiq_stack_top = __get_free_pages(GFP_KERNEL | __GFP_ZERO, + get_order(SIP_FIQ_DBG_STACK_SIZE)); + if (fiq_stack_top) { + fiq_stack_top += SIP_FIQ_DBG_STACK_SIZE; + } else { + pr_err("%s: alloc stack failed\n", __func__); + return -ENOMEM; + } + } + /* init fiq debugger callback */ sip_fiq_debugger_uart_irq_tf = callback_fn; - res = __invoke_sip_fn_smc(SIP_UARTDBG_FN, irq_id, - (unsigned long)sip_fiq_debugger_uart_irq_tf_cb, - UARTDBG_CFG_INIT); + arm_smccc_smc(SIP_UARTDBG_FN, + irq_id, + (unsigned long)sip_fiq_debugger_uart_irq_tf_cb, + UARTDBG_CFG_INIT, + fiq_stack_top, 0, 0, 0, &res); + if (IS_SIP_ERROR(res.a0)) { pr_err("%s error: %d\n", __func__, (int)res.a0); return res.a0; -- Gitblit v1.6.2