mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00

Now that the SBI IPI core clears IPIs at warm boot in a generic way, none of the drivers or platforms use these hooks, and we can remove them. Platforms need only to initialize the driver once during cold init. If other hooks are needed in the future, they can be added to struct sbi_ipi_device. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#include <sbi/sbi_error.h>
|
|
#include <sbi/sbi_heap.h>
|
|
#include <sbi_utils/fdt/fdt_helper.h>
|
|
#include <sbi_utils/ipi/fdt_ipi.h>
|
|
#include <sbi_utils/ipi/aclint_mswi.h>
|
|
|
|
static int ipi_mswi_cold_init(const void *fdt, int nodeoff,
|
|
const struct fdt_match *match)
|
|
{
|
|
int rc;
|
|
unsigned long offset;
|
|
struct aclint_mswi_data *ms;
|
|
|
|
ms = sbi_zalloc(sizeof(*ms));
|
|
if (!ms)
|
|
return SBI_ENOMEM;
|
|
|
|
rc = fdt_parse_aclint_node(fdt, nodeoff, false, false,
|
|
&ms->addr, &ms->size, NULL, NULL,
|
|
&ms->first_hartid, &ms->hart_count);
|
|
if (rc) {
|
|
sbi_free(ms);
|
|
return rc;
|
|
}
|
|
|
|
if (match->data) {
|
|
/* Adjust MSWI address and size for CLINT device */
|
|
offset = *((unsigned long *)match->data);
|
|
ms->addr += offset;
|
|
if ((ms->size - offset) < ACLINT_MSWI_SIZE)
|
|
return SBI_EINVAL;
|
|
ms->size = ACLINT_MSWI_SIZE;
|
|
}
|
|
|
|
rc = aclint_mswi_cold_init(ms);
|
|
if (rc) {
|
|
sbi_free(ms);
|
|
return rc;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const unsigned long clint_offset = CLINT_MSWI_OFFSET;
|
|
|
|
static const struct fdt_match ipi_mswi_match[] = {
|
|
{ .compatible = "riscv,clint0", .data = &clint_offset },
|
|
{ .compatible = "sifive,clint0", .data = &clint_offset },
|
|
{ .compatible = "thead,c900-clint", .data = &clint_offset },
|
|
{ .compatible = "thead,c900-aclint-mswi" },
|
|
{ .compatible = "riscv,aclint-mswi" },
|
|
{ },
|
|
};
|
|
|
|
struct fdt_ipi fdt_ipi_mswi = {
|
|
.match_table = ipi_mswi_match,
|
|
.cold_init = ipi_mswi_cold_init,
|
|
};
|