mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/riscv: dt_processor_hartid() implementation
Implements dt_processor_hartid() to get the hart ID of the given device tree node and do some checks if CPU is available and given device tree node has proper riscv,isa property. As a helper function dt_get_hartid() is introduced to deal specifically with reg propery of a CPU device node. Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
17104a7462
commit
dc89505f80
2 files changed
+81
No files matched your search
@@ -26,6 +26,10 @@ static inline void set_cpuid_to_hartid(unsigned long cpuid,
|
||||
|
||||
void setup_tp(unsigned int cpuid);
|
||||
|
||||
struct dt_device_node;
|
||||
int dt_processor_hartid(const struct dt_device_node *node,
|
||||
unsigned long *hartid);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#include <xen/cpumask.h>
|
||||
#include <xen/device_tree.h>
|
||||
#include <xen/errno.h>
|
||||
#include <xen/init.h>
|
||||
#include <xen/sections.h>
|
||||
#include <xen/types.h>
|
||||
|
||||
#include <asm/current.h>
|
||||
|
||||
@@ -14,3 +17,77 @@ void __init smp_prepare_boot_cpu(void)
|
||||
cpumask_set_cpu(0, &cpu_possible_map);
|
||||
cpumask_set_cpu(0, &cpu_online_map);
|
||||
}
|
||||
|
||||
/**
|
||||
* dt_get_hartid - Get the hartid from a CPU device node
|
||||
*
|
||||
* @cpun: CPU number(logical index) for which device node is required
|
||||
*
|
||||
* Return: The hartid for the CPU node or ~0UL if not found.
|
||||
*/
|
||||
static unsigned long dt_get_hartid(const struct dt_device_node *cpun)
|
||||
{
|
||||
const __be32 *cell;
|
||||
unsigned int ac;
|
||||
uint32_t len;
|
||||
|
||||
ac = dt_n_addr_cells(cpun);
|
||||
cell = dt_get_property(cpun, "reg", &len);
|
||||
|
||||
/*
|
||||
* If ac > 2, the result may be truncated or meaningless unless
|
||||
* dt_read_number() supports wider integers.
|
||||
*
|
||||
* TODO: drop (ac > 2) when dt_read_number() will support wider
|
||||
* integers.
|
||||
*/
|
||||
if ( !cell || !ac || (ac > 2) || (ac > len / sizeof(*cell)) )
|
||||
return ~0UL;
|
||||
|
||||
return dt_read_number(cell, ac);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the hartid of the given device tree node, or -ENODEV if the node
|
||||
* isn't an enabled and valid RISC-V hart node.
|
||||
*/
|
||||
int dt_processor_hartid(const struct dt_device_node *node,
|
||||
unsigned long *hartid)
|
||||
{
|
||||
const char *isa;
|
||||
int ret;
|
||||
|
||||
if ( !dt_device_is_compatible(node, "riscv") )
|
||||
{
|
||||
printk("Found incompatible CPU\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
*hartid = dt_get_hartid(node);
|
||||
if ( *hartid == ~0UL )
|
||||
{
|
||||
printk("Found CPU without CPU ID\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
if ( !dt_device_is_available(node))
|
||||
{
|
||||
printk("CPU with hartid=%#lx is not available\n", *hartid);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ( (ret = dt_property_read_string(node, "riscv,isa", &isa)) )
|
||||
{
|
||||
printk("CPU with hartid=%#lx has no \"riscv,isa\" property\n", *hartid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ( isa[0] != 'r' || isa[1] != 'v' )
|
||||
{
|
||||
printk("CPU with hartid=%#lx has an invalid ISA of \"%s\"\n", *hartid,
|
||||
isa);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||