/*
 * IoHriMainStore.h
 * Copyright (C) 2001  Mike Corrigan IBM Corporation
 *
 * 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
 * (at your option) 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#ifndef _IOHRIMAINSTORE_H
#define _IOHRIMAINSTORE_H

/* Main Store Vpd for Condor,iStar,sStar */
struct IoHriMainStoreSegment4 {
	u8	msArea0Exists:1;
	u8	msArea1Exists:1;
	u8	msArea2Exists:1;
	u8	msArea3Exists:1;
	u8	reserved1:4;
	u8	reserved2;

	u8	msArea0Functional:1;
	u8	msArea1Functional:1;
	u8	msArea2Functional:1;
	u8	msArea3Functional:1;
	u8	reserved3:4;
	u8	reserved4;

	u32	totalMainStore;

	u64	msArea0Ptr;
	u64	msArea1Ptr;
	u64	msArea2Ptr;
	u64	msArea3Ptr;

	u32	cardProductionLevel;

	u32	msAdrHole;

	u8	msArea0HasRiserVpd:1;
	u8	msArea1HasRiserVpd:1;
	u8	msArea2HasRiserVpd:1;
	u8	msArea3HasRiserVpd:1;
	u8	reserved5:4;
	u8	reserved6;
	u16	reserved7;

	u8	reserved8[28];

	u64	nonInterleavedBlocksStartAdr;
	u64	nonInterleavedBlocksEndAdr;
};

/* Main Store VPD for Power4 */
struct IoHriMainStoreChipInfo1 {
	u32	chipMfgID	__attribute((packed));
	char	chipECLevel[4]	__attribute((packed));
};

struct IoHriMainStoreVpdIdData {
	char	typeNumber[4];
	char	modelNumber[4];
	char	partNumber[12];
	char	serialNumber[12];
};

struct IoHriMainStoreVpdFruData {
	char	fruLabel[8]	__attribute((packed));
	u8	numberOfSlots	__attribute((packed));
	u8	pluggingType	__attribute((packed));
	u16	slotMapIndex	__attribute((packed));
};

struct IoHriMainStoreAdrRangeBlock {
	void	*blockStart      __attribute((packed));
	void	*blockEnd        __attribute((packed));
	u32	blockProcChipId __attribute((packed));
};

#define MaxAreaAdrRangeBlocks 4

struct IoHriMainStoreArea4 {
	u32	msVpdFormat			__attribute((packed));
	u8	containedVpdType		__attribute((packed));
	u8	reserved1			__attribute((packed));
	u16	reserved2			__attribute((packed));

	u64	msExists			__attribute((packed));
	u64	msFunctional			__attribute((packed));

	u32	memorySize			__attribute((packed));
	u32	procNodeId			__attribute((packed));

	u32	numAdrRangeBlocks		__attribute((packed));
	struct IoHriMainStoreAdrRangeBlock xAdrRangeBlock[MaxAreaAdrRangeBlocks]	__attribute((packed));

	struct IoHriMainStoreChipInfo1	chipInfo0	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo1	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo2	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo3	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo4	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo5	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo6	__attribute((packed));
	struct IoHriMainStoreChipInfo1	chipInfo7	__attribute((packed));

	void	*msRamAreaArray			__attribute((packed));
	u32	msRamAreaArrayNumEntries	__attribute((packed));
	u32	msRamAreaArrayEntrySize		__attribute((packed));

	u32	numaDimmExists			__attribute((packed));
	u32	numaDimmFunctional		__attribute((packed));
	void	*numaDimmArray			__attribute((packed));
	u32	numaDimmArrayNumEntries		__attribute((packed));
	u32	numaDimmArrayEntrySize		__attribute((packed));

	struct IoHriMainStoreVpdIdData idData	__attribute((packed));

	u64	powerData			__attribute((packed));
	u64	cardAssemblyPartNum		__attribute((packed));
	u64	chipSerialNum			__attribute((packed));

	u64	reserved3			__attribute((packed));
	char	reserved4[16]			__attribute((packed));

	struct IoHriMainStoreVpdFruData fruData	__attribute((packed));

	u8	vpdPortNum			__attribute((packed));
	u8	reserved5			__attribute((packed));
	u8	frameId				__attribute((packed));
	u8	rackUnit			__attribute((packed));
	char	asciiKeywordVpd[256]		__attribute((packed));
	u32	reserved6			__attribute((packed));
};


struct IoHriMainStoreSegment5 {
	u16	reserved1;
	u8	reserved2;
	u8	msVpdFormat;

	u32	totalMainStore;
	u64	maxConfiguredMsAdr;

	struct IoHriMainStoreArea4	*msAreaArray;
	u32	msAreaArrayNumEntries;
	u32	msAreaArrayEntrySize;

	u32	msAreaExists;
	u32	msAreaFunctional;

	u64	reserved3;
};

extern u64	xMsVpd[];

#endif	/* _IOHRIMAINSTORE_H */
