/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2021 Western Digital Corporation or its affiliates. * * Authors: * Anup Patel */ #include #include #include #include #include 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" }, { }, }; const struct fdt_driver fdt_ipi_mswi = { .match_table = ipi_mswi_match, .init = ipi_mswi_cold_init, };