ofw: add BUS_GET_DEVICE_PATH interface to openfirm/fdt, somewhat incomplete.

This add BUS_GET_DEVICE_PATH interface,
which shows device tree of openfirm/fdt.

In qemu-system-arm64 with "virt" machine with device-tree firmware,
% devctl getpath OFW cpu0

Reviewed by: andrew
Differential Revision: https://reviews.freebsd.org/D37031
This commit is contained in:
Takanori Watanabe 2022-10-18 15:08:53 +09:00
parent 469ad86031
commit 7b5d62bb73
7 changed files with 22 additions and 0 deletions

View File

@ -90,6 +90,7 @@ static device_method_t gic_fdt_methods[] = {
/* Bus interface */
DEVMETHOD(bus_get_resource_list,gic_fdt_get_resource_list),
DEVMETHOD(bus_get_device_path, ofw_bus_gen_get_device_path),
/* ofw_bus interface */
DEVMETHOD(ofw_bus_get_devinfo, gic_ofw_get_devinfo),

View File

@ -64,6 +64,7 @@ static device_method_t gic_v3_fdt_methods[] = {
/* Bus interface */
DEVMETHOD(bus_get_resource_list, gic_v3_fdt_get_resource_list),
DEVMETHOD(bus_get_device_path, ofw_bus_gen_get_device_path),
/* ofw_bus interface */
DEVMETHOD(ofw_bus_get_devinfo, gic_v3_ofw_get_devinfo),

View File

@ -94,6 +94,7 @@ static device_method_t simplebus_methods[] = {
DEVMETHOD(bus_child_pnpinfo, ofw_bus_gen_child_pnpinfo),
DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list),
DEVMETHOD(bus_get_property, simplebus_get_property),
DEVMETHOD(bus_get_device_path, ofw_bus_gen_get_device_path),
/* ofw_bus interface */
DEVMETHOD(ofw_bus_get_devinfo, simplebus_get_devinfo),

View File

@ -104,6 +104,22 @@ ofw_bus_gen_child_pnpinfo(device_t cbdev, device_t child, struct sbuf *sb)
return (0);
};
int
ofw_bus_gen_get_device_path(device_t cbdev, device_t child, const char *locator,
struct sbuf *sb)
{
int rv;
if ( strcmp(locator, BUS_LOCATOR_OFW) == 0){
rv = bus_generic_get_device_path(cbdev, child, locator, sb);
if (rv == 0){
sbuf_printf(sb, "/%s", ofw_bus_get_name(child));
}
return (rv);
}
return (bus_generic_get_device_path(cbdev, child, locator, sb));
};
const char *
ofw_bus_gen_get_compat(device_t bus, device_t dev)
{

View File

@ -84,6 +84,7 @@ ofw_bus_get_type_t ofw_bus_gen_get_type;
/* Helper method to report interesting OF properties in pnpinfo */
bus_child_pnpinfo_t ofw_bus_gen_child_pnpinfo;
bus_get_device_path_t ofw_bus_gen_get_device_path;
/* Routines for processing firmware interrupt maps */
void ofw_bus_setup_iinfo(phandle_t, struct ofw_bus_iinfo *, int);

View File

@ -68,6 +68,7 @@ static device_method_t ofw_cpulist_methods[] = {
/* Bus interface */
DEVMETHOD(bus_add_child, bus_generic_add_child),
DEVMETHOD(bus_child_pnpinfo, ofw_bus_gen_child_pnpinfo),
DEVMETHOD(bus_get_device_path, ofw_bus_gen_get_device_path),
/* ofw_bus interface */
DEVMETHOD(ofw_bus_get_devinfo, ofw_cpulist_get_devinfo),

View File

@ -761,6 +761,7 @@ void bus_data_generation_update(void);
#define BUS_LOCATOR_ACPI "ACPI"
#define BUS_LOCATOR_FREEBSD "FreeBSD"
#define BUS_LOCATOR_UEFI "UEFI"
#define BUS_LOCATOR_OFW "OFW"
extern int bus_current_pass;