[fdt] Add the concept of an FDT image

Define the concept of an "FDT" image, representing a Flattened Device
Tree blob that has been downloaded in order to be provided to a kernel
or other executable image.  FDT images are represented using an image
tag (as with other special-purpose images such as the UEFI shim), and
are similarly marked as hidden so that they will not be included in a
generated magic initrd or show up in a virtual filesystem directory
listing.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/1437/head
Michael Brown 2025-03-27 11:30:27 +00:00
parent 98f86b4d0a
commit cfd93465ec
4 changed files with 76 additions and 0 deletions

View File

@ -28,6 +28,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <assert.h> #include <assert.h>
#include <byteswap.h> #include <byteswap.h>
#include <ipxe/netdevice.h> #include <ipxe/netdevice.h>
#include <ipxe/image.h>
#include <ipxe/fdt.h> #include <ipxe/fdt.h>
/** @file /** @file
@ -39,6 +40,11 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** The system flattened device tree (if present) */ /** The system flattened device tree (if present) */
static struct fdt fdt; static struct fdt fdt;
/** The downloaded flattened device tree tag */
struct image_tag fdt_image __image_tag = {
.name = "FDT",
};
/** A position within a device tree */ /** A position within a device tree */
struct fdt_cursor { struct fdt_cursor {
/** Offset within structure block */ /** Offset within structure block */

View File

@ -10,6 +10,7 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stdint.h> #include <stdint.h>
#include <ipxe/image.h>
struct net_device; struct net_device;
@ -93,6 +94,8 @@ struct fdt {
size_t strings_len; size_t strings_len;
}; };
extern struct image_tag fdt_image __image_tag;
extern int fdt_path ( const char *path, unsigned int *offset ); extern int fdt_path ( const char *path, unsigned int *offset );
extern int fdt_alias ( const char *name, unsigned int *offset ); extern int fdt_alias ( const char *name, unsigned int *offset );
extern const char * fdt_string ( unsigned int offset, const char *name ); extern const char * fdt_string ( unsigned int offset, const char *name );

View File

@ -0,0 +1,16 @@
#ifndef _USR_FDTMGMT_H
#define _USR_FDTMGMT_H
/** @file
*
* Flattened Device Tree management
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/image.h>
extern int imgfdt ( struct image *image );
#endif /* _USR_FDTMGMT_H */

51
src/usr/fdtmgmt.c 100644
View File

@ -0,0 +1,51 @@
/*
* Copyright (C) 2025 Michael Brown <mbrown@fensystems.co.uk>.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* You can also choose to distribute this program under the terms of
* the Unmodified Binary Distribution Licence (as given in the file
* COPYING.UBDL), provided that you have satisfied its requirements.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/fdt.h>
#include <usr/fdtmgmt.h>
/** @file
*
* Flattened Device Tree management
*
*/
/**
* Apply flattened device tree image
*
* @v image FDT image, or NULL to clear FDT
* @ret rc Return status code
*/
int imgfdt ( struct image *image ) {
/* Record (or clear) FDT image */
image_tag ( image, &fdt_image );
/* Avoid including image in constructed initrd */
if ( image )
image_hide ( image );
return 0;
}