hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/** @file
  Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
**/
 
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/PcdLib.h>
 
#include "RamFlash.h"
 
VOID *mFlashBase;
 
STATIC UINTN       mFdBlockSize = 0;
STATIC UINTN       mFdBlockCount = 0;
 
STATIC
UINT8*
RamFlashPtr (
  IN        EFI_LBA                             Lba,
  IN        UINTN                               Offset
  )
{
  return mFlashBase + ((UINTN)Lba * mFdBlockSize) + Offset;
}
 
/**
  Read from Ram Flash
 
  @param[in] Lba      The starting logical block index to read from.
  @param[in] Offset   Offset into the block at which to begin reading.
  @param[in] NumBytes On input, indicates the requested read size. On
                      output, indicates the actual number of bytes read
  @param[in] Buffer   Pointer to the buffer to read into.
 
**/
EFI_STATUS
RamFlashRead (
  IN        EFI_LBA                              Lba,
  IN        UINTN                                Offset,
  IN        UINTN                                *NumBytes,
  IN        UINT8                                *Buffer
  )
{
  UINT8  *Ptr;
 
  //
  // Only write to the first 64k. We don't bother saving the FTW Spare
  // block into the flash memory.
  //
  if (Lba >= mFdBlockCount) {
    return EFI_INVALID_PARAMETER;
  }
 
  //
  // Get flash address
  //
  Ptr = (UINT8*) RamFlashPtr (Lba, Offset);
 
  CopyMem (Buffer, Ptr, *NumBytes);
 
  return EFI_SUCCESS;
}
 
 
/**
  Write to Ram Flash
 
  @param[in] Lba      The starting logical block index to write to.
  @param[in] Offset   Offset into the block at which to begin writing.
  @param[in] NumBytes On input, indicates the requested write size. On
                      output, indicates the actual number of bytes written
  @param[in] Buffer   Pointer to the data to write.
 
**/
EFI_STATUS
RamFlashWrite (
  IN        EFI_LBA                             Lba,
  IN        UINTN                               Offset,
  IN        UINTN                               *NumBytes,
  IN        UINT8                               *Buffer
  )
{
  UINT8  *Ptr;
  UINTN  i;
 
  //
  // Only write to the first 64k. We don't bother saving the FTW Spare
  // block into the flash memory.
  //
  if (Lba >= mFdBlockCount) {
    return EFI_INVALID_PARAMETER;
  }
 
  //
  // Program flash
  //
  Ptr = RamFlashPtr (Lba, Offset);
  for (i = 0; i < *NumBytes; i++) {
     MmioWrite8((UINTN)Ptr, Buffer[i]);
     Ptr ++;
  }
 
  return EFI_SUCCESS;
}
 
 
/**
  Erase a Ram Flash block
 
  @param Lba    The logical block index to erase.
 
**/
EFI_STATUS
RamFlashEraseBlock (
  IN   EFI_LBA      Lba
  )
{
 
  return EFI_SUCCESS;
}
 
 
/**
  Initializes Ram flash memory support
 
  @retval EFI_WRITE_PROTECTED   The Ram flash device is not present.
  @retval EFI_SUCCESS           The Ram flash device is supported.
 
**/
EFI_STATUS
RamFlashInitialize (
  VOID
  )
{
  mFlashBase = (UINT8*)(UINTN) PcdGet32 (PcdVariableFdBaseAddress);
  mFdBlockSize = PcdGet32 (PcdVariableFdBlockSize);
  ASSERT(PcdGet32 (PcdVariableFdSize) % mFdBlockSize == 0);
  mFdBlockCount = PcdGet32 (PcdVariableFdSize) / mFdBlockSize;
 
  return EFI_SUCCESS;
}