summaryrefslogtreecommitdiffstats
path: root/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
blob: 065841bc9309559371116bee0bfcc3db00b7bdf2 (plain)
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/** @file
  Flash Device Library based on SPI Flash library.

Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved. <BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiDxe.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/SpiFlashLib.h>

/**
  Initialize spi flash device.

  @retval EFI_SUCCESS              The tested spi flash device is supported.
  @retval EFI_UNSUPPORTED          The tested spi flash device is not supported.

**/
EFI_STATUS
EFIAPI
LibFvbFlashDeviceInit (
  VOID
  )
{
  return SpiConstructor ();
}


/**
  Read NumBytes bytes of data from the address specified by
  PAddress into Buffer.

  @param[in]      PAddress      The starting physical address of the read.
  @param[in,out]  NumBytes      On input, the number of bytes to read. On output, the number
                                of bytes actually read.
  @param[out]     Buffer        The destination data buffer for the read.

  @retval         EFI_SUCCESS.      Opertion is successful.
  @retval         EFI_DEVICE_ERROR  If there is any device errors.

**/
EFI_STATUS
EFIAPI
LibFvbFlashDeviceRead (
  IN      UINTN                           PAddress,
  IN  OUT UINTN                           *NumBytes,
      OUT UINT8                           *Buffer
  )
{
  EFI_STATUS                              Status;
  UINT32                                  ByteCount;
  UINT32                                  RgnSize;
  UINT32                                  AddrOffset;

  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
  // which equal (PAddress + RgnSize) here.
  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
  ByteCount  = (UINT32)*NumBytes;
  return SpiFlashRead (FlashRegionBios, AddrOffset, ByteCount, Buffer);
}


/**
  Write NumBytes bytes of data from Buffer to the address specified by
  PAddresss.

  @param[in]      PAddress        The starting physical address of the write.
  @param[in,out]  NumBytes        On input, the number of bytes to write. On output,
                                  the actual number of bytes written.
  @param[in]      Buffer          The source data buffer for the write.

  @retval         EFI_SUCCESS.      Opertion is successful.
  @retval         EFI_DEVICE_ERROR  If there is any device errors.

**/
EFI_STATUS
EFIAPI
LibFvbFlashDeviceWrite (
  IN        UINTN                           PAddress,
  IN OUT    UINTN                           *NumBytes,
  IN        UINT8                           *Buffer
  )
{
  EFI_STATUS                                Status;
  UINT32                                    ByteCount;
  UINT32                                    RgnSize;
  UINT32                                    AddrOffset;

  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
  // which equal (PAddress + RgnSize) here.
  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
  ByteCount  = (UINT32)*NumBytes;
  return SpiFlashWrite (FlashRegionBios, AddrOffset, ByteCount, Buffer);
}


/**
  Erase the block starting at PAddress.

  @param[in]  PAddress        The starting physical address of the block to be erased.
                              This library assume that caller garantee that the PAddress
                              is at the starting address of this block.
  @param[in]  LbaLength       The length of the logical block to be erased.

  @retval     EFI_SUCCESS.      Opertion is successful.
  @retval     EFI_DEVICE_ERROR  If there is any device errors.

**/
EFI_STATUS
EFIAPI
LibFvbFlashDeviceBlockErase (
  IN    UINTN                     PAddress,
  IN    UINTN                     LbaLength
  )
{
  EFI_STATUS                      Status;
  UINT32                          RgnSize;
  UINT32                          AddrOffset;

  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
  if (EFI_ERROR (Status)) {
    return Status;
  }

  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
  // which equal (PAddress + RgnSize) here.
  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
  return SpiFlashErase (FlashRegionBios, AddrOffset, (UINT32)LbaLength);
}


/**
  Lock or unlock the block starting at PAddress.

  @param[in]  PAddress        The starting physical address of region to be (un)locked.
  @param[in]  LbaLength       The length of the logical block to be erased.
  @param[in]  Lock            TRUE to lock. FALSE to unlock.

  @retval     EFI_SUCCESS.      Opertion is successful.
  @retval     EFI_DEVICE_ERROR  If there is any device errors.

**/
EFI_STATUS
EFIAPI
LibFvbFlashDeviceBlockLock (
  IN    UINTN                          PAddress,
  IN    UINTN                          LbaLength,
  IN    BOOLEAN                        Lock
  )
{
  return EFI_SUCCESS;
}