iBoot/drivers/flash_nand/id/nandid.h

312 lines
8.7 KiB
C

// Copyright (C) 2008-2009 Apple, Inc. All rights reserved.
//
// This document is the property of Apple, Inc.
// It is considered confidential and proprietary.
//
// This document may not be reproduced or transmitted in any form,
// in whole or in part, without the express written permission of
// Apple, Inc.
//
#include "ANDTypes.h"
#include "WMRTypes.h"
#include "WMRFeatures.h"
#if WMR_BUILDING_IBOOT
#include <lib/devicetree.h>
#endif
#ifndef _NANDID_H_
#define _NANDID_H_
// =============================================================================
// Preprocessor Constants
#define NAND_CHIP_ID_SIZE (8)
#define VALID_NAND_CHIP_ID_SIZE (6)
#define COMPARE_NAND_CHIP_ID_SIZE (4)
#define LEGACY_NAND_CHIP_ID_SIZE (4)
#define NAND_MAX_CE_COUNT_PER_PACKAGE (8)
#define NAND_MAX_PACKAGES_PER_CONFIG (2)
#define NAND_MAX_CE_COUNT_TOTAL (NAND_MAX_PACKAGES_PER_CONFIG * NAND_MAX_CE_COUNT_PER_PACKAGE)
#define NAND_MAX_APPLE_NAME_SIZE (20)
#define NAND_MAX_VENDOR_NAME_SIZE (20)
#define NAND_MAX_PACKAGE_TYPE_SIZE (20)
#define NAND_MAX_PACKAGE_SIZE_SIZE (20)
// =============================================================================
// Drive Strength
typedef UInt8 NandDriveStrength;
#define NAND_DRIVE_STRENGTH_DEFAULT ((NandDriveStrength)0)
#define NAND_DRIVE_STRENGTH_X1 ((NandDriveStrength)1)
#define NAND_DRIVE_STRENGTH_X2 ((NandDriveStrength)2)
#define NAND_DRIVE_STRENGTH_X3 ((NandDriveStrength)3)
#define NAND_DRIVE_STRENGTH_X4 ((NandDriveStrength)4)
// =============================================================================
// Nand Chip Id
typedef UInt8 NandChipId[NAND_CHIP_ID_SIZE];
// =============================================================================
// Nand Package Id
struct NandPackageIdStruct
{
// Unique identifier for this struct - start
NandChipId chipId;
UInt8 ceCnt;
// Unique identifier for this struct - end
};
typedef struct NandPackageIdStruct NandPackageId;
// =============================================================================
// Nand Config Id
struct NandConfigIdStruct
{
// Unique identifier for this struct - start
UInt8 connectedBusCnt;
UInt8 packageCnt;
NandPackageId packageIds[NAND_MAX_PACKAGES_PER_CONFIG];
// Unique identifier for this struct - end
};
typedef struct NandConfigIdStruct NandConfigId;
// =============================================================================
// Nand Geometry
struct NandGeometryStruct
{
// Unique identifier for this struct - start
NandChipId chipId;
// Unique identifier for this struct - end
UInt16 blocksPerCS;
UInt16 pagesPerBlock;
UInt16 dataBytesPerPage;
UInt16 spareBytesPerPage;
UInt8 eccPer512Bytes;
CheckInitialBadType initialBBType;
UInt16 diesPerCS;
};
typedef struct NandGeometryStruct NandGeometry;
#if (defined (AND_ENABLE_NAND_DESCRIPTION_TEXT) || AND_ENABLE_NAND_DESCRIPTION_TEXT)
// =============================================================================
// Nand Description
struct NandDescriptionStruct
{
// Unique identifier for this struct - start
NandPackageId packageId;
// Unique identifier for this struct - end
char appleName[NAND_MAX_APPLE_NAME_SIZE];
char vendorPartNumber[NAND_MAX_VENDOR_NAME_SIZE];
char packageType[NAND_MAX_PACKAGE_TYPE_SIZE];
char packageSize[NAND_MAX_PACKAGE_SIZE_SIZE];
};
typedef struct NandDescriptionStruct NandDescription;
// =============================================================================
// ChipId Description
struct NandChipIdDescriptionStruct
{
// Unique identifier for this struct - start
NandChipId chipId;
// Unique identifier for this struct - end
char die[NAND_MAX_VENDOR_NAME_SIZE];
char vendor[NAND_MAX_VENDOR_NAME_SIZE];
};
typedef struct NandChipIdDescriptionStruct NandChipIdDescription;
#endif // (defined(AND_ENABLE_NAND_DESCRIPTION_TEXT) || AND_ENABLE_NAND_DESCRIPTION_TEXT)
// =============================================================================
// Nand Timing
struct NandTimingStruct
{
// Unique identifier for this struct - start
NandConfigId configId;
// Unique identifier for this struct - end
// write cycle
UInt8 writeCycleNanosecs;
UInt8 writeSetupNanosecs;
UInt8 writeHoldNanosecs;
// read cycle
UInt8 readCycleNanosecs;
UInt8 readSetupNanosecs;
UInt8 readHoldNanosecs;
// read window
UInt8 readDelayNanosecs;
UInt8 readValidNanosecs;
};
typedef struct NandTimingStruct NandTiming;
// =============================================================================
// Nand Support
struct NandBoardSupportStruct
{
// Unique identifier for this struct - start
NandConfigId configId;
// Unique identifier for this struct - end
VendorSpecificType vsType;
};
typedef struct NandBoardSupportStruct NandBoardSupport;
// =============================================================================
// Board Package/Landing Map
typedef UInt32 NandLandingMask;
typedef NandLandingMask NandLandingMap[NAND_MAX_PACKAGES_PER_CONFIG + 1];
// =============================================================================
// Nand Board Timing
struct NandBoardInfoStruct
{
NandDriveStrength controlDstr;
NandDriveStrength dataDstr;
NandDriveStrength chipEnableDstr;
UInt8 socToNandRiseNanosecs;
UInt8 socToNandFallNanosecs;
UInt8 nandToSocRiseNanosecs;
UInt8 nandToSocFallNanosecs;
NandLandingMap landingMap;
BOOL32 useToggleMode;
BOOL32 useDiffDQSMode;
BOOL32 useDiffREMode;
BOOL32 useVref;
BOOL32 useSingleHostChannel;
BOOL32 allowSingleChipEnable;
};
typedef struct NandBoardInfoStruct NandBoardInfo;
struct NandPpnStruct
{
UInt32 specVersion;
UInt32 blocksPerCau;
UInt32 causPerCe;
UInt32 slcPagesPerBlock;
UInt32 mlcPagesPerBlock;
UInt32 matchOddEvenCaus;
UInt32 bitsPerCau;
UInt32 bitsPerPage;
UInt32 bitsPerBlock;
UInt32 maxTransactionSize;
};
typedef struct NandPpnStruct NandPpn;
struct NandFormatStruct
{
UInt32 metaPerLogicalPage;
UInt32 validMetaPerLogicalPage;
UInt32 logicalPageSize;
};
typedef struct NandFormatStruct NandFormat;
// =============================================================================
// Nand Info
struct NandInfoStruct
{
const NandBoardSupport* boardSupport;
const NandBoardInfo* boardInfo;
const NandTiming* configTiming;
const NandGeometry* geometry;
const NandPpn* ppn;
const NandFormat* format;
};
typedef struct NandInfoStruct NandInfo;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
// =============================================================================
// Public Function Declarations
BOOL32 findNandInfo(const NandChipId* chipIds,
NandInfo* nandInfo,
UInt32 numActiveDataBus);
void setNandIdPpnConfig(const NandChipId* chipIds,
NandInfo* nandInfo,
UInt32 busses,
UInt32 ces);
void reportFMCTimingValues(UInt32 readSetupClocks,
UInt32 readHoldClocks,
UInt32 readDccycleClocks,
UInt32 writeSetupClocks,
UInt32 writeHoldClocks);
void reportToggleModeFMCTimingValues(UInt32 dqsHalfCycleClocks,
UInt32 ceSetupClocks,
UInt32 ceHoldClocks,
UInt32 adlClocks,
UInt32 whrClocks,
UInt32 readPreClocks,
UInt32 readPostClocks,
UInt32 writePreClocks,
UInt32 writePostClocks,
UInt32 regDQSTimingCtrl);
void setToggleMode();
void setPPNOptions(BOOL32 retire_on_invalid_refresh);
void reportPpnFeatures(void *list, UInt32 size);
void reportDbgChipIds(void *list, UInt32 size);
void setECCLevels(UInt32 numCorrectableBits,
UInt32 refreshThresholdBits);
BOOL32 checkPpnLandingMap(UInt32 validCEMap);
const NandFormat * getPPNFormat(void);
BOOL32 targetSupportsToggle(void);
BOOL32 targetSupportsDiffDQS(void);
BOOL32 targetSupportsDiffRE(void);
BOOL32 targetSupportsVREF(void);
BOOL32 targetSupportsSHC(void);
BOOL32 targetSupportsSingleCE(void);
// =============================================================================
// Public Variables
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif // _NANDID_H_