summaryrefslogtreecommitdiff
path: root/ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.c
blob: bad5d244cbbadc8a96938f48c048dcb13143e26e (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
/** @file

  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
  Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/
#include <Base.h>
#include <Library/ArmLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>

STATIC
VOID
CacheRangeOperation (
  IN  VOID            *Start,
  IN  UINTN           Length,
  IN  LINE_OPERATION  LineOperation,
  IN  UINTN           LineLength
  )
{
  UINTN  ArmCacheLineAlignmentMask;
  // Align address (rounding down)
  UINTN  AlignedAddress;
  UINTN  EndAddress;

  ArmCacheLineAlignmentMask = LineLength - 1;
  AlignedAddress            = (UINTN)Start - ((UINTN)Start & ArmCacheLineAlignmentMask);
  EndAddress                = (UINTN)Start + Length;

  // Perform the line operation on an address in each cache line
  while (AlignedAddress < EndAddress) {
    LineOperation (AlignedAddress);
    AlignedAddress += LineLength;
  }

  ArmDataSynchronizationBarrier ();
}

VOID
EFIAPI
InvalidateInstructionCache (
  VOID
  )
{
  ASSERT (FALSE);
}

VOID
EFIAPI
InvalidateDataCache (
  VOID
  )
{
  ASSERT (FALSE);
}

VOID *
EFIAPI
InvalidateInstructionCacheRange (
  IN      VOID   *Address,
  IN      UINTN  Length
  )
{
  CacheRangeOperation (
    Address,
    Length,
    ArmCleanDataCacheEntryToPoUByMVA,
    ArmDataCacheLineLength ()
    );
  CacheRangeOperation (
    Address,
    Length,
    ArmInvalidateInstructionCacheEntryToPoUByMVA,
    ArmInstructionCacheLineLength ()
    );

  ArmInstructionSynchronizationBarrier ();

  return Address;
}

VOID
EFIAPI
WriteBackInvalidateDataCache (
  VOID
  )
{
  ASSERT (FALSE);
}

VOID *
EFIAPI
WriteBackInvalidateDataCacheRange (
  IN      VOID   *Address,
  IN      UINTN  Length
  )
{
  CacheRangeOperation (
    Address,
    Length,
    ArmCleanInvalidateDataCacheEntryByMVA,
    ArmDataCacheLineLength ()
    );
  return Address;
}

VOID
EFIAPI
WriteBackDataCache (
  VOID
  )
{
  ASSERT (FALSE);
}

VOID *
EFIAPI
WriteBackDataCacheRange (
  IN      VOID   *Address,
  IN      UINTN  Length
  )
{
  CacheRangeOperation (
    Address,
    Length,
    ArmCleanDataCacheEntryByMVA,
    ArmDataCacheLineLength ()
    );
  return Address;
}

VOID *
EFIAPI
InvalidateDataCacheRange (
  IN      VOID   *Address,
  IN      UINTN  Length
  )
{
  CacheRangeOperation (
    Address,
    Length,
    ArmInvalidateDataCacheEntryByMVA,
    ArmDataCacheLineLength ()
    );
  return Address;
}