/******************************************************************************
 *
 * IBM Confidential
 *
 * Licensed Internal Code Source Materials
 *
 * IBM Flexible Support Processor Licensed Internal Code
 *
 * (c) Copyright IBM Corp. 2004
 *
 * The source code is for this program is not published or otherwise divested
 * of its trade secrets, irrespective of what has been deposited with the
 * U.S. Copyright Office.
 *
 *****************************************************************************/

#ifndef _VPDECC_H_
#define _VPDECC_H_

#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-parameter"

#include <stdlib.h>

#define VPD_ECC_OK 0
#define VPD_ECC_NOT_ENOUGH_BUFFER 1
#define VPD_ECC_WRONG_ECC_SIZE 2
#define VPD_ECC_WRONG_BUFFER_SIZE 9
#define VPD_ECC_UNCORRECTABLE_DATA 90
#define VPD_ECC_CORRECTABLE_DATA 91

#ifdef __cplusplus
extern "C" {
#endif

/* TODO  doxygen !!!!!!!! */

/******************************************************************************/
/* vpdecc_create_ecc                                                          */
/*                                                                            */
/* For a given data block (together with the length of the data block         */
/* this function creates the ECC                                              */
/*                                                                            */
/* @param     pData           In-Buffer containing the raw VPD data           */
/*                                            (wont't be changed)             */
/*                                                                            */
/* @param     vDataLength     In        should contain the length of the Data */
/*                                      in the buffer given to vData          */
/*                                                                            */
/* @param     pEcc            Out-Buffer after execution this will be the     */
/*                                      buffer for the calculated Ecc         */
/*                                                                            */
/* @param     pEccLenght      In/Out    In : size of buffer                   */
/*                                      Out: contains the length of the Ecc   */
/*                                                                            */
/* @return Error returncode                                                   */
/******************************************************************************/
int vpdecc_create_ecc(const unsigned char* data, size_t datalength,
                      unsigned char* ecc, size_t* ecc_buffersize);

/******************************************************************************/
/* vpdecc_check_data                                                          */
/*                                                                            */
/* For a given data block (together with the ecc)                             */
/* this function checks the data for validness                                */
/*                                                                            */
/* @param     pData           In-Buffer containing the raw VPD data           */
/*                            Out-Buffer containing the raw VPD data          */
/*                                      No error           : data unchanged   */
/*                                      Correctable error  : data corrected   */
/*                                      Uncorrectable error: data unchanged   */
/*                                                                            */
/* @param     vDataLength     In        should contain the length of the Data */
/*                                      in the buffer given to vData          */
/*                                                                            */
/* @param     pEcc            In-Buffer should contain the Ecc for the data   */
/*                                                                            */
/*                                                                            */
/* @param     vEccLenght      In        should contain the length of the Ecc  */
/*                                                                            */
/* @return Error returncode                                                   */
/******************************************************************************/
int vpdecc_check_data(unsigned char* data, size_t data_length,
                      const unsigned char* ecc, size_t ecc_length);

#ifdef __cplusplus
} /* end extern "C" */
#endif

#endif /* endif _VPDECC_H_ */