forked from Mirrors/opensbi

Since the availability and latency properties of CPU idle states depend on the specific SBI HSM implementation, it is appropriate that the idle states are added to the devicetree at runtime by that implementation. This helper function adds a platform-provided array of idle states to the devicetree, following the SBI idle state binding. Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Samuel Holland <samuel@sholland.org>
126 lines
3.7 KiB
C
126 lines
3.7 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__
|
|
|
|
struct sbi_cpu_idle_state {
|
|
const char *name;
|
|
uint32_t suspend_param;
|
|
bool local_timer_stop;
|
|
uint32_t entry_latency_us;
|
|
uint32_t exit_latency_us;
|
|
uint32_t min_residency_us;
|
|
uint32_t wakeup_latency_us;
|
|
};
|
|
|
|
/**
|
|
* Add CPU idle states to cpu nodes in the DT
|
|
*
|
|
* Add information about CPU idle states to the devicetree. This function
|
|
* assumes that CPU idle states are not already present in the devicetree, and
|
|
* that all CPU states are equally applicable to all CPUs.
|
|
*
|
|
* @param fdt: device tree blob
|
|
* @param states: array of idle state descriptions, ending with empty element
|
|
* @return zero on success and -ve on failure
|
|
*/
|
|
int fdt_add_cpu_idle_states(void *dtb, const struct sbi_cpu_idle_state *state);
|
|
|
|
/**
|
|
* 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 APLIC nodes in the device tree
|
|
*
|
|
* This routine disables APLIC nodes which are not accessible to the next
|
|
* booting stage based on currently assigned domain.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
*/
|
|
void fdt_aplic_fixup(void *fdt);
|
|
|
|
/**
|
|
* Fix up the IMSIC nodes in the device tree
|
|
*
|
|
* This routine disables IMSIC nodes which are not accessible to the next
|
|
* booting stage based on currently assigned domain.
|
|
*
|
|
* It is recommended that platform codes call this helper in their final_init()
|
|
*
|
|
* @param fdt: device tree blob
|
|
*/
|
|
void fdt_imsic_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
|
|
*/
|
|
void fdt_plic_fixup(void *fdt);
|
|
|
|
/**
|
|
* 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, IMSIC nodes, APLIC nodes, 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__ */
|
|
|