/* BEGIN_ICS_COPYRIGHT7 ****************************************

Copyright (c) 2015-2020, Intel Corporation

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Intel Corporation nor the names of its contributors
      may be used to endorse or promote products derived from this software
      without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

** END_ICS_COPYRIGHT7   ****************************************/

#include "pm_topology.h"

#include "iba/public/ipackon.h"

#define MAX_VFABRICS_OLD 32 // MAX_VFABRICS old value

typedef struct PmUtilStats_oldv10_s {
	uint64 TotMBps;
	uint64 TotKPps;
	uint32 AvgMBps;
	uint32 MinMBps;

	uint32 MaxMBps;
	uint32 BwPorts[STL_PM_UTIL_BUCKETS];
	uint32 AvgKPps;

	uint32 MinKPps;
	uint32 MaxKPps;

	uint16 pmaNoRespPorts;
	uint16 topoIncompPorts;
	uint32 reserved;
} PACK_SUFFIX PmUtilStats_oldv10_t;
typedef struct ErrorSummary_oldv10_s {
	uint32 Integrity;
	uint32 Congestion;
	uint32 SmaCongestion;
	uint32 Bubble;
	uint32 Security;
	uint32 Routing;
	uint16 UtilizationPct10;
	uint16 DiscardsPct10;
	uint32 Reserved;
} PACK_SUFFIX ErrorSummary_oldv10_t;
typedef struct ErrorBucket_oldv10_s {
	uint32 Integrity;
	uint32 Congestion;
	uint32 SmaCongestion;
	uint32 Bubble;
	uint32 Security;
	uint32 Routing;
} PACK_SUFFIX ErrorBucket_oldv10_t;
typedef struct PmErrStats_oldv10_s {
	ErrorSummary_oldv10_t Max;
	ErrorBucket_oldv10_t Ports[STL_PM_CATEGORY_BUCKETS];
} PACK_SUFFIX PmErrStats_oldv10_t;

typedef struct PmCompositeVF_oldv10_s {
	char	name[MAX_VFABRIC_NAME];
	uint32	numPorts;
	uint8	isActive;
	uint8	minIntRate;
	uint8	maxIntRate;
	uint8	reserved;
	PmUtilStats_oldv10_t intUtil;
	PmErrStats_oldv10_t  intErr;
} PACK_SUFFIX PmCompositeVF_oldv10_t;

typedef struct PmCompositeGroups_oldv10_s {
	char	name[STL_PM_GROUPNAMELEN];
	uint32	numIntPorts;
	uint32	numExtPorts;
	uint8	minIntRate;
	uint8	maxIntRate;
	uint8	minExtRate;
	uint8	maxExtRate;
	uint32	reserved;
	PmUtilStats_oldv10_t intUtil;
	PmUtilStats_oldv10_t sendUtil;
	PmUtilStats_oldv10_t recvUtil;
	PmErrStats_oldv10_t  intErr;
	PmErrStats_oldv10_t  extErr;
} PACK_SUFFIX PmCompositeGroup_oldv10_t;

typedef struct PmCompositePort_oldv10_s {
	uint64	guid;
	union {
		uint32	AsReg32;
		struct {IB_BITFIELD11(uint32,
				active:1,           // is port IB_PORT_ACTIVE (SW port 0 fixed up)
				mtu:4,              // enum IB_MTU - due to actual range, 3 bits
				txActiveWidth:4,    // LinkWidthDowngrade.txActive
				rxActiveWidth:4,    // LinkWidthDowngrade.rxActive
				activeSpeed:3,      // LinkSeed.Active
				Initialized:1,      // has group membership been initialized
				queryStatus:2,      // PMA query or clear result
				UnexpectedClear:1,  // PMA Counters unexpectedly cleared
				gotDataCntrs:1,     // Were Data Counters updated
				gotErrorCntrs:1,    // Were Error Counters updated
				Reserved:10)
		}
		s;
	} u;
	STL_LID neighborLid;

	PORT	portNum;
	PORT	neighborPort;
	uint8   InternalBitMask;
	uint8	numGroups;
	uint8	groups[PM_MAX_GROUPS_PER_PORT];

	uint32 numVFs;
	uint32 vlSelectMask;

	CounterSelectMask_t clearSelectMask;
	uint32 reserved99;

	PmCompositeVfvlmap_t compVfVlmap[MAX_VFABRICS_OLD];

	PmCompositePortCounters_t	stlPortCounters;
	PmCompositeVLCounters_t	stlVLPortCounters[MAX_PM_VLS];
	PmCompositePortCounters_t	DeltaStlPortCounters;
	PmCompositeVLCounters_t	DeltaStlVLPortCounters[MAX_PM_VLS];
} PACK_SUFFIX PmCompositePort_oldv10_t;

typedef struct PmCompositeNode_oldv10_s {
	uint64				NodeGUID;
	uint64				SystemImageGUID;
	char				nodeDesc[STL_NODE_DESCRIPTION_ARRAY_SIZE];
	STL_LID 			lid;
	uint8				nodeType;
	uint8				numPorts;

	uint8				Reserved;

	uint8				reserved;
	//PmCompositePort_oldv10_t **ports;
} PACK_SUFFIX PmCompositeNode_oldv10_t;

typedef struct PmCompositeImage_oldv10_s {
	PmFileHeader_t	header;
	uint64	sweepStart;
	uint32	sweepDuration;
	uint8	reserved[2];
	uint16	HFIPorts;
	uint16	switchNodes;
	uint16	reserved2;
	uint32	switchPorts;
	uint32	numLinks;
	uint32 	numSMs;
	uint32	noRespNodes;
	uint32	noRespPorts;
	uint32	skippedNodes;
	uint32	skippedPorts;
	uint32	unexpectedClearPorts;
	uint32  downgradedPorts;
	uint32	numGroups;
	uint32	numVFs;
	uint32	numVFsActive;
	STL_LID	maxLid;
	uint32	numPorts;
	PmCompositeSmInfo_t SMs[PM_HISTORY_MAX_SMS_PER_COMPOSITE];
	uint32	reserved3;
	PmCompositeGroup_oldv10_t allPortsGroup;
	PmCompositeGroup_oldv10_t groups[PM_MAX_GROUPS];
	PmCompositeVF_oldv10_t    VFs[MAX_VFABRICS_OLD];
	//PmCompositeNode_t **nodes;
} PACK_SUFFIX PmCompositeImage_oldv10_t;

#include "iba/public/ipackoff.h"

size_t PaSthOldCompositePortToCurrent(PmCompositePort_t *curr, uint8_t *buf);
size_t PaSthOldCompositeNodeToCurrent(PmCompositeNode_t *curr, uint8_t *buf);
size_t PaSthOldCompositeImageToCurrent(PmCompositeImage_t *curr, uint8_t *buf);
