diff options
Diffstat (limited to 'drivers/fmc/fru-parse.c')
| -rw-r--r-- | drivers/fmc/fru-parse.c | 82 | 
1 files changed, 82 insertions, 0 deletions
diff --git a/drivers/fmc/fru-parse.c b/drivers/fmc/fru-parse.c new file mode 100644 index 00000000000..cb46263c5da --- /dev/null +++ b/drivers/fmc/fru-parse.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2012 CERN (www.cern.ch) + * Author: Alessandro Rubini <rubini@gnudd.com> + * + * Released according to the GNU GPL, version 2 or any later version. + * + * This work is part of the White Rabbit project, a research effort led + * by CERN, the European Institute for Nuclear Research. + */ +#include <linux/ipmi-fru.h> + +/* Some internal helpers */ +static struct fru_type_length * +__fru_get_board_tl(struct fru_common_header *header, int nr) +{ +	struct fru_board_info_area *bia; +	struct fru_type_length *tl; + +	bia = fru_get_board_area(header); +	tl = bia->tl; +	while (nr > 0 && !fru_is_eof(tl)) { +		tl = fru_next_tl(tl); +		nr--; +	} +	if (fru_is_eof(tl)) +		return NULL; +	return tl; +} + +static char *__fru_alloc_get_tl(struct fru_common_header *header, int nr) +{ +	struct fru_type_length *tl; +	char *res; +	int len; + +	tl = __fru_get_board_tl(header, nr); +	if (!tl) +		return NULL; +	len = fru_strlen(tl); +	res = fru_alloc(fru_strlen(tl) + 1); +	if (!res) +		return NULL; +	return fru_strcpy(res, tl); +} + +/* Public checksum verifiers */ +int fru_header_cksum_ok(struct fru_common_header *header) +{ +	uint8_t *ptr = (void *)header; +	int i, sum; + +	for (i = sum = 0; i < sizeof(*header); i++) +		sum += ptr[i]; +	return (sum & 0xff) == 0; +} +int fru_bia_cksum_ok(struct fru_board_info_area *bia) +{ +	uint8_t *ptr = (void *)bia; +	int i, sum; + +	for (i = sum = 0; i < 8 * bia->area_len; i++) +		sum += ptr[i]; +	return (sum & 0xff) == 0; +} + +/* Get various stuff, trivial */ +char *fru_get_board_manufacturer(struct fru_common_header *header) +{ +	return __fru_alloc_get_tl(header, 0); +} +char *fru_get_product_name(struct fru_common_header *header) +{ +	return __fru_alloc_get_tl(header, 1); +} +char *fru_get_serial_number(struct fru_common_header *header) +{ +	return __fru_alloc_get_tl(header, 2); +} +char *fru_get_part_number(struct fru_common_header *header) +{ +	return __fru_alloc_get_tl(header, 3); +}  | 
