Am Mo., 29. Apr. 2019 um 17:35 Uhr schrieb Alexander Graf <ag...@csgraf.de>: > > > On 29.04.19 16:29, Christian Gmeiner wrote: > > Hi > > > > Am Do., 25. Apr. 2019 um 12:09 Uhr schrieb Alexander Graf <ag...@csgraf.de>: > >> > >> On 16.04.19 13:38, Christian Gmeiner wrote: > >>> Add an very simple API to be able to access SMBIOS strings > >>> like vendor, model and bios version. > >>> > >>> Signed-off-by: Christian Gmeiner <christian.gmei...@gmail.com> > >>> --- > >>> include/smbios.h | 37 ++++++++++ > >>> lib/Kconfig | 6 ++ > >>> lib/Makefile | 1 + > >>> lib/smbios-parser.c | 162 ++++++++++++++++++++++++++++++++++++++++++++ > >>> 4 files changed, 206 insertions(+) > >>> create mode 100644 lib/smbios-parser.c > >>> > >>> diff --git a/include/smbios.h b/include/smbios.h > >>> index 97b9ddce23..ad44e54245 100644 > >>> --- a/include/smbios.h > >>> +++ b/include/smbios.h > >>> @@ -237,4 +237,41 @@ typedef int (*smbios_write_type)(ulong *addr, int > >>> handle); > >>> */ > >>> ulong write_smbios_table(ulong addr); > >>> > >>> + > >>> +struct smbios_parser; > >>> + > >>> +/** > >>> + * smbios_parser_create() - Create smbios parser > >>> + * > >>> + * @addr: start address to search for SMBIOS structure > >>> + * @len: size of search area > >>> + * @return: NULL or valid pointer to a struct smbios_parser > >>> + */ > >>> +struct smbios_parser *smbios_parser_create(unsigned int addr, unsigned > >>> int len); > >>> + > >>> +/** > >>> + * smbios_parser_destroy() - Destroy smbios parser > >>> + * > >>> + * @p: pointer to a struct smbios_parser > >>> + */ > >>> +void smbios_parser_destroy(struct smbios_parser *p); > >>> + > >>> +/** > >>> + * smbios_header() - Search for SMBIOS header type > >>> + * > >>> + * @p: pointer to a struct smbios_parser > >>> + * @type: SMBIOS type > >>> + * @return: NULL or a valid pointer to a struct smbios_header > >>> + */ > >>> +struct smbios_header *smbios_header(const struct smbios_parser *p, int > >>> type); > >>> + > >>> +/** > >>> + * smbios_string() - Return string from SMBIOS > >>> + * > >>> + * @header: pointer to struct smbios_header > >>> + * @index: string index > >>> + * @return: NULL or a valid const char pointer > >>> + */ > >>> +const char *smbios_string(const struct smbios_header *header, int index); > >>> + > >>> #endif /* _SMBIOS_H_ */ > >>> diff --git a/lib/Kconfig b/lib/Kconfig > >>> index 2120216593..59aafc63a7 100644 > >>> --- a/lib/Kconfig > >>> +++ b/lib/Kconfig > >>> @@ -432,6 +432,12 @@ config SMBIOS_PRODUCT_NAME > >>> > >>> endmenu > >>> > >>> +config SMBIOS_PARSER > >>> + bool "SMBIOS parser" > >>> + default n > >>> + help > >>> + A simple parser for SMBIOS data. > >>> + > >>> source lib/efi/Kconfig > >>> source lib/efi_loader/Kconfig > >>> source lib/optee/Kconfig > >>> diff --git a/lib/Makefile b/lib/Makefile > >>> index 47829bfed5..f095bd420a 100644 > >>> --- a/lib/Makefile > >>> +++ b/lib/Makefile > >>> @@ -34,6 +34,7 @@ obj-$(CONFIG_FIT) += fdtdec_common.o > >>> obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o > >>> obj-$(CONFIG_GZIP_COMPRESSED) += gzip.o > >>> obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o > >>> +obj-$(CONFIG_SMBIOS_PARSER) += smbios-parser.o > >>> obj-$(CONFIG_IMAGE_SPARSE) += image-sparse.o > >>> obj-y += ldiv.o > >>> obj-$(CONFIG_MD5) += md5.o > >>> diff --git a/lib/smbios-parser.c b/lib/smbios-parser.c > >>> new file mode 100644 > >>> index 0000000000..b24fd7210c > >>> --- /dev/null > >>> +++ b/lib/smbios-parser.c > >>> @@ -0,0 +1,162 @@ > >>> +// SPDX-License-Identifier: GPL-2.0+ > >>> +/* > >>> + * Copyright (C) 2019, Bachmann electronic GmbH > >>> + */ > >>> + > >>> +#include <common.h> > >>> +#include <malloc.h> > >>> +#include <mapmem.h> > >>> +#include <smbios.h> > >>> + > >>> +struct smbios_parser { > >>> + void *search_area; > >>> + unsigned int search_area_len; > >>> + struct smbios_entry *entry; > >>> + void *data; > >>> +}; > >>> + > >>> +static inline int verify_checksum(const struct smbios_entry *e) > >>> +{ > >>> + /* > >>> + * Checksums for SMBIOS tables are calculated to have a value, so > >>> that > >>> + * the sum over all bytes yields zero (using unsigned 8 bit > >>> arithmetic). > >>> + */ > >>> + u8 *byte = (u8 *)e; > >>> + u8 sum = 0; > >>> + > >>> + for (int i = 0; i < e->length; i++) > >>> + sum += byte[i]; > >>> + > >>> + return sum; > >>> +} > >>> + > >>> +static struct smbios_entry *find_smbios_entry(const struct smbios_parser > >>> *p) > >>> +{ > >>> + static const char sm_sig[] = "_SM_"; > >>> + u8 *buf = (u8 *)p->search_area; > >>> + const u8 *end = (u8 *)p->search_area + p->search_area_len; > >>> + struct smbios_entry *entry = NULL; > >>> + > >>> + /* look for smbios entry */ > >>> + while (buf < end) { > >> > >> Don't you have a way to pass the DMI pointer directly, maybe using cbfs? > >> Searching through the SMBIOS search area is so 1990s (and pretty much > >> only works on x86). > >> > > Coreboot adds a smbios cbmem entry which can be used to get the base > > address. > > Will make use of that mechanism in the next version of the patch set. > > > Thanks, that will make this code a lot more robust :). > > > > > >> I also don't think we really need all the smbios_parser logic. No need > >> to create special pseudo objects. IMHO you should either create an > >> actual UCLASS for SMBIOS with genuine callbacks and expose the table as > >> DM object or just make all search functions in this patch stateless. I'd > >> opt for the latter - it's how the SMBIOS creation works too. > >> > > I am not sure what you mean with 'special pseudo objects' - struct > > smbios_parser? > > > Yes. The parser is stateful. I would ideally like it best if it wasn't :). >
One of the reasons I need the smbios_parser is the map_sysmem(..) thing. Maybe I do not need it at all - that would make the whole thing much simpler. -- greets -- Christian Gmeiner, MSc https://christian-gmeiner.info _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot