forked from Mirrors/opensbi

This is achieved by removing the 'no-map' property from the 'reserved-memory' node when PMP is present, otherwise we keep it as it offers a small protection if the OS does not map this region at all. A new callback in platform_override is introduced and allows to fixup the device-tree. It is used here to override this new default behaviour on SiFive Fu540 platforms that has an erratum that prevents S-mode software to access a PMP protected region using 1GB page table mapping. If PMP is present, telling the OS not to map the reserved regions does not add much protection since it only avoids access to regions that are already protected by PMP. But by not allowing the OS to map those regions, it creates holes in the OS system memory map and prevents the use of hugepages which would generate, among other benefits, less TLB miss. Signed-off-by: Alexandre Ghiti <alex@ghiti.fr> Reviewed-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
79 lines
2.3 KiB
C
79 lines
2.3 KiB
C
// SPDX-License-Identifier: BSD-2-Clause
|
|
/*
|
|
* fdt_fixup.h - Flat Device Tree manipulation helper routines
|
|
* Implement platform specific DT fixups on top of libfdt.
|
|
*
|
|
* Copyright (C) 2020 Bin Meng <bmeng.cn@gmail.com>
|
|
*/
|
|
|
|
#ifndef __FDT_FIXUP_H__
|
|
#define __FDT_FIXUP_H__
|
|
|
|
/**
|
|
* Fix up the CPU node in the device tree
|
|
*
|
|
* This routine updates the "status" property of a CPU node in the device tree
|
|
* to "disabled" if that hart is in disabled state in OpenSBI.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
*/
|
|
void fdt_cpu_fixup(void *fdt);
|
|
|
|
/**
|
|
* Fix up the PLIC node in the device tree
|
|
*
|
|
* This routine updates the "interrupt-extended" property of the PLIC node in
|
|
* the device tree to hide the M-mode external interrupt from CPUs.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
* @param compat: PLIC node compatible string
|
|
*/
|
|
void fdt_plic_fixup(void *fdt, const char *compat);
|
|
|
|
/**
|
|
* Fix up the reserved memory node in the device tree
|
|
*
|
|
* This routine inserts a child node of the reserved memory node in the device
|
|
* tree that describes the protected memory region done by OpenSBI via PMP.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
* @return zero on success and -ve on failure
|
|
*/
|
|
int fdt_reserved_memory_fixup(void *fdt);
|
|
|
|
/**
|
|
* Fix up the reserved memory subnodes in the device tree
|
|
*
|
|
* This routine adds the no-map property to the reserved memory subnodes so
|
|
* that the OS does not map those PMP protected memory regions.
|
|
*
|
|
* Platform codes must call this helper in their final_init() after fdt_fixups()
|
|
* if the OS should not map the PMP protected reserved regions.
|
|
*
|
|
* @param fdt: device tree blob
|
|
* @return zero on success and -ve on failure
|
|
*/
|
|
int fdt_reserved_memory_nomap_fixup(void *fdt);
|
|
|
|
/**
|
|
* General device tree fix-up
|
|
*
|
|
* This routine do all required device tree fix-ups for a typical platform.
|
|
* It fixes up the PLIC node and the reserved memory node in the device tree
|
|
* by calling the corresponding helper routines to accomplish the task.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
*/
|
|
void fdt_fixups(void *fdt);
|
|
|
|
#endif /* __FDT_FIXUP_H__ */
|
|
|