Skip to content

Commit

Permalink
fdt: Expose the model, compatible and freebsd dts brandind as sysctl
Browse files Browse the repository at this point in the history
This make it easier for script to get the hardware on which they are running.

Sponsored by:	Diablotin Systems
Differential Revision:	  https://reviews.freebsd.org/D31205
Reviewed by: 		  imp
Should be ok on powerpc:  jhibbits (over irc)

(cherry picked from commit 50e0dc0)
  • Loading branch information
evadot authored and Mike Karels committed Mar 9, 2022
1 parent 937d084 commit caa14c7
Showing 1 changed file with 38 additions and 1 deletion.
39 changes: 38 additions & 1 deletion sys/dev/ofw/ofw_fdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,14 @@ static ofw_def_t ofw_fdt = {
};
OFW_DEF(ofw_fdt);

#define FDT_FBSDVER_LEN 16
#define FDT_MODEL_LEN 80
#define FDT_COMPAT_LEN 255

static void *fdtp = NULL;
static char fdt_model[FDT_MODEL_LEN];
static char fdt_compatible[FDT_COMPAT_LEN];
static char fdt_fbsd_version[FDT_FBSDVER_LEN];

static int
sysctl_handle_dtb(SYSCTL_HANDLER_ARGS)
Expand All @@ -124,19 +131,50 @@ sysctl_register_fdt_oid(void *arg)
SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_fdt), OID_AUTO, "dtb",
CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0,
sysctl_handle_dtb, "", "Device Tree Blob");
if (fdt_model[0] != '\0')
SYSCTL_ADD_STRING(NULL, SYSCTL_STATIC_CHILDREN(_hw_fdt),
OID_AUTO, "model", CTLFLAG_RD, fdt_model,
FDT_MODEL_LEN, "System board model");
if (fdt_compatible[0] != '\0')
SYSCTL_ADD_STRING(NULL, SYSCTL_STATIC_CHILDREN(_hw_fdt),
OID_AUTO, "compatible", CTLFLAG_RD, fdt_compatible,
FDT_COMPAT_LEN, "Compatible platforms");
if (fdt_fbsd_version[0] != '\0')
SYSCTL_ADD_STRING(NULL, SYSCTL_STATIC_CHILDREN(_hw_fdt),
OID_AUTO, "freebsd-version", CTLFLAG_RD, fdt_fbsd_version,
FDT_FBSDVER_LEN, "FreeBSD DTS branding version");
}
SYSINIT(dtb_oid, SI_SUB_KMEM, SI_ORDER_ANY, sysctl_register_fdt_oid, NULL);

static int
ofw_fdt_init(ofw_t ofw, void *data)
{
phandle_t root;
ssize_t len;
int err;
int i;

/* Check FDT blob integrity */
if ((err = fdt_check_header(data)) != 0)
return (err);

fdtp = data;
root = ofw_fdt_finddevice(NULL, "/");
len = ofw_fdt_getproplen(NULL, root, "model");
bzero(fdt_model, FDT_MODEL_LEN);
ofw_fdt_getprop(NULL, root, "model", fdt_model, FDT_MODEL_LEN);
len = ofw_fdt_getproplen(NULL, root, "compatible");
bzero(fdt_compatible, FDT_COMPAT_LEN);
ofw_fdt_getprop(NULL, root, "compatible", fdt_compatible, FDT_COMPAT_LEN);
/* Replace the middle '\0' with ' ' */
for (i = 0; i < len - 1; i++)
if (fdt_compatible[i] == '\0')
fdt_compatible[i] = ' ';
if ((len = ofw_fdt_getproplen(NULL, root, "freebsd,dts-version")) > 0) {
bzero(fdt_fbsd_version, FDT_FBSDVER_LEN);
ofw_fdt_getprop(NULL, root, "freebsd,dts-version",
fdt_fbsd_version, FDT_FBSDVER_LEN);
}
return (0);
}

Expand Down Expand Up @@ -410,7 +448,6 @@ ofw_fdt_package_to_path(ofw_t ofw, phandle_t package, char *buf, size_t len)
static int
ofw_fdt_fixup(ofw_t ofw)
{
#define FDT_MODEL_LEN 80
char model[FDT_MODEL_LEN];
phandle_t root;
ssize_t len;
Expand Down

0 comments on commit caa14c7

Please sign in to comment.