1d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm/** @file
2d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
3d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
5d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  This program and the accompanying materials
6d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  are licensed and made available under the terms and conditions of the BSD License
7d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  which accompanies this distribution.  The full text of the license may be found at
8d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  http://opensource.org/licenses/bsd-license.php
9d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
10d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
13d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm**/
14d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
15d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#ifndef FLASH_H
16d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define FLASH_H
17d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
18d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Uefi.h>
19d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
20d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/BaseLib.h>
21d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/BaseMemoryLib.h>
22d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/MemoryAllocationLib.h>
23d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/DebugLib.h>
24d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/IoLib.h>
25d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/PcdLib.h>
26d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/UefiBootServicesTableLib.h>
27d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Library/IoLib.h>
28d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
29d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Protocol/BlockIo.h>
30d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Protocol/Cpu.h>
31d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#include <Omap3530/Omap3530.h>
32d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
33d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_SIZE(x)             ((x) & 0x01)
34d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_SIZE_2K_VAL         (0x01UL)
35d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
36d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define SPARE_AREA_SIZE(x)       (((x) >> 2) & 0x01)
37d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define SPARE_AREA_SIZE_64B_VAL  (0x1UL)
38d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
39d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_SIZE(x)            (((x) >> 4) & 0x01)
40d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_SIZE_128K_VAL      (0x01UL)
41d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
42d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define ORGANIZATION(x)          (((x) >> 6) & 0x01)
43d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define ORGANIZATION_X8          (0x0UL)
44d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define ORGANIZATION_X16         (0x1UL)
45d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
46d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_SIZE_512B           (512)
47d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_SIZE_2K             (2048)
48d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_SIZE_4K             (4096)
49d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define SPARE_AREA_SIZE_16B      (16)
50d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define SPARE_AREA_SIZE_64B      (64)
51d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
52d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_SIZE_16K           (16*1024)
53d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_SIZE_128K          (128*1024)
54d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
55d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_COUNT              (2048)
56d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define LAST_BLOCK               (BLOCK_COUNT - 1)
57d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
58d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define ECC_POSITION             2
59d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
60d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm//List of commands.
61d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define RESET_CMD                0xFF
62d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define READ_ID_CMD              0x90
63d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
64d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define READ_STATUS_CMD          0x70
65d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
66d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_READ_CMD            0x00
67d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PAGE_READ_CONFIRM_CMD    0x30
68d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
69d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_ERASE_CMD          0x60
70d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define BLOCK_ERASE_CONFIRM_CMD  0xD0
71d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
72d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PROGRAM_PAGE_CMD         0x80
73d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define PROGRAM_PAGE_CONFIRM_CMD 0x10
74d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
75d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm//Nand status register bit definition
76d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define NAND_SUCCESS             (0x0UL << 0)
77d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define NAND_FAILURE             BIT0
78d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
79d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define NAND_BUSY                (0x0UL << 6)
80d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define NAND_READY               BIT6
81d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
82d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define NAND_RESET_STATUS        (0x60UL << 0)
83d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
84d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#define MAX_RETRY_COUNT          1500
85d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
86d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
87d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholmtypedef struct {
88d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8 ManufactureId;
89d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8 DeviceId;
90d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8 BlockAddressStart; //Start of the Block address in actual NAND
91d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8 PageAddressStart;  //Start of the Page address in actual NAND
92d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm} NAND_PART_INFO_TABLE;
93d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
94d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholmtypedef struct {
95d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8     ManufactureId;
96d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8     DeviceId;
97d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8     Organization;      //x8 or x16
98d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT32    PageSize;
99d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT32    SparePageSize;
100d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT32    BlockSize;
101d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT32    NumPagesPerBlock;
102d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8     BlockAddressStart; //Start of the Block address in actual NAND
103d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm  UINT8     PageAddressStart;  //Start of the Page address in actual NAND
104d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm} NAND_FLASH_INFO;
105d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm
106d6d2a59a443ba5ba5ba75fbbd176ed9a051d2db0Leif Lindholm#endif //FLASH_H
107