]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/NvmExpressPei/NvmExpressPeiHci.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / NvmExpressPei / NvmExpressPeiHci.h
CommitLineData
b8b69433
HW
1/** @file\r
2 The NvmExpressPei driver is used to manage non-volatile memory subsystem\r
3 which follows NVM Express specification at PEI phase.\r
4\r
2e15b750 5 Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
b8b69433 6\r
9d510e61 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
b8b69433
HW
8\r
9**/\r
10\r
11#ifndef _NVM_EXPRESS_PEI_HCI_H_\r
12#define _NVM_EXPRESS_PEI_HCI_H_\r
13\r
14//\r
15// NVME host controller registers operation definitions\r
16//\r
17#define NVME_GET_CAP(Private, Cap) NvmeMmioRead (Cap, Private->MmioBase + NVME_CAP_OFFSET, sizeof (NVME_CAP))\r
18#define NVME_GET_CC(Private, Cc) NvmeMmioRead (Cc, Private->MmioBase + NVME_CC_OFFSET, sizeof (NVME_CC))\r
19#define NVME_SET_CC(Private, Cc) NvmeMmioWrite (Private->MmioBase + NVME_CC_OFFSET, Cc, sizeof (NVME_CC))\r
20#define NVME_GET_CSTS(Private, Csts) NvmeMmioRead (Csts, Private->MmioBase + NVME_CSTS_OFFSET, sizeof (NVME_CSTS))\r
21#define NVME_GET_AQA(Private, Aqa) NvmeMmioRead (Aqa, Private->MmioBase + NVME_AQA_OFFSET, sizeof (NVME_AQA))\r
22#define NVME_SET_AQA(Private, Aqa) NvmeMmioWrite (Private->MmioBase + NVME_AQA_OFFSET, Aqa, sizeof (NVME_AQA))\r
23#define NVME_GET_ASQ(Private, Asq) NvmeMmioRead (Asq, Private->MmioBase + NVME_ASQ_OFFSET, sizeof (NVME_ASQ))\r
24#define NVME_SET_ASQ(Private, Asq) NvmeMmioWrite (Private->MmioBase + NVME_ASQ_OFFSET, Asq, sizeof (NVME_ASQ))\r
25#define NVME_GET_ACQ(Private, Acq) NvmeMmioRead (Acq, Private->MmioBase + NVME_ACQ_OFFSET, sizeof (NVME_ACQ))\r
26#define NVME_SET_ACQ(Private, Acq) NvmeMmioWrite (Private->MmioBase + NVME_ACQ_OFFSET, Acq, sizeof (NVME_ACQ))\r
27#define NVME_GET_VER(Private, Ver) NvmeMmioRead (Ver, Private->MmioBase + NVME_VER_OFFSET, sizeof (NVME_VER))\r
28#define NVME_SET_SQTDBL(Private, Qid, Sqtdbl) NvmeMmioWrite (Private->MmioBase + NVME_SQTDBL_OFFSET(Qid, Private->Cap.Dstrd), Sqtdbl, sizeof (NVME_SQTDBL))\r
29#define NVME_SET_CQHDBL(Private, Qid, Cqhdbl) NvmeMmioWrite (Private->MmioBase + NVME_CQHDBL_OFFSET(Qid, Private->Cap.Dstrd), Cqhdbl, sizeof (NVME_CQHDBL))\r
30\r
31//\r
32// Base memory address enum types\r
33//\r
34enum {\r
35 BASEMEM_ASQ,\r
36 BASEMEM_ACQ,\r
37 BASEMEM_SQ,\r
38 BASEMEM_CQ,\r
39 BASEMEM_PRP,\r
40 MAX_BASEMEM_COUNT\r
41};\r
42\r
43//\r
44// All of base memories are 4K(0x1000) alignment\r
45//\r
1436aea4
MK
46#define ALIGN(v, a) (UINTN)((((v) - 1) | ((a) - 1)) + 1)\r
47#define NVME_MEM_BASE(Private) ((UINTN)(Private->Buffer))\r
48#define NVME_ASQ_BASE(Private) (ALIGN (NVME_MEM_BASE(Private) + ((NvmeBaseMemPageOffset (BASEMEM_ASQ)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE))\r
49#define NVME_ACQ_BASE(Private) (ALIGN (NVME_MEM_BASE(Private) + ((NvmeBaseMemPageOffset (BASEMEM_ACQ)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE))\r
50#define NVME_SQ_BASE(Private, Index) (ALIGN (NVME_MEM_BASE(Private) + ((NvmeBaseMemPageOffset (BASEMEM_SQ) + ((Index)*(NVME_MAX_QUEUES-1))) * EFI_PAGE_SIZE), EFI_PAGE_SIZE))\r
51#define NVME_CQ_BASE(Private, Index) (ALIGN (NVME_MEM_BASE(Private) + ((NvmeBaseMemPageOffset (BASEMEM_CQ) + ((Index)*(NVME_MAX_QUEUES-1))) * EFI_PAGE_SIZE), EFI_PAGE_SIZE))\r
52#define NVME_PRP_BASE(Private) (ALIGN (NVME_MEM_BASE(Private) + ((NvmeBaseMemPageOffset (BASEMEM_PRP)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE))\r
b8b69433
HW
53\r
54/**\r
55 Transfer MMIO Data to memory.\r
56\r
57 @param[in,out] MemBuffer Destination: Memory address.\r
58 @param[in] MmioAddr Source: MMIO address.\r
59 @param[in] Size Size for read.\r
60\r
61 @retval EFI_SUCCESS MMIO read sucessfully.\r
62\r
63**/\r
64EFI_STATUS\r
65NvmeMmioRead (\r
1436aea4
MK
66 IN OUT VOID *MemBuffer,\r
67 IN UINTN MmioAddr,\r
68 IN UINTN Size\r
b8b69433
HW
69 );\r
70\r
71/**\r
72 Transfer memory data to MMIO.\r
73\r
74 @param[in,out] MmioAddr Destination: MMIO address.\r
75 @param[in] MemBuffer Source: Memory address.\r
76 @param[in] Size Size for write.\r
77\r
78 @retval EFI_SUCCESS MMIO write sucessfully.\r
79\r
80**/\r
81EFI_STATUS\r
82NvmeMmioWrite (\r
1436aea4
MK
83 IN OUT UINTN MmioAddr,\r
84 IN VOID *MemBuffer,\r
85 IN UINTN Size\r
b8b69433
HW
86 );\r
87\r
88/**\r
89 Get the page offset for specific NVME based memory.\r
90\r
91 @param[in] BaseMemIndex The Index of BaseMem (0-based).\r
92\r
93 @retval - The page count for specific BaseMem Index\r
94\r
95**/\r
96UINT32\r
97NvmeBaseMemPageOffset (\r
1436aea4 98 IN UINTN BaseMemIndex\r
b8b69433
HW
99 );\r
100\r
b8b69433
HW
101/**\r
102 Initialize the Nvm Express controller.\r
103\r
104 @param[in] Private The pointer to the PEI_NVME_CONTROLLER_PRIVATE_DATA data structure.\r
105\r
106 @retval EFI_SUCCESS The NVM Express Controller is initialized successfully.\r
107 @retval Others A device error occurred while initializing the controller.\r
108\r
109**/\r
110EFI_STATUS\r
111NvmeControllerInit (\r
1436aea4 112 IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private\r
b8b69433
HW
113 );\r
114\r
115/**\r
116 Get specified identify namespace data.\r
117\r
118 @param[in] Private The pointer to the PEI_NVME_CONTROLLER_PRIVATE_DATA data structure.\r
119 @param[in] NamespaceId The specified namespace identifier.\r
120 @param[in] Buffer The buffer used to store the identify namespace data.\r
121\r
122 @return EFI_SUCCESS Successfully get the identify namespace data.\r
123 @return EFI_DEVICE_ERROR Fail to get the identify namespace data.\r
124\r
125**/\r
126EFI_STATUS\r
127NvmeIdentifyNamespace (\r
1436aea4
MK
128 IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private,\r
129 IN UINT32 NamespaceId,\r
130 IN VOID *Buffer\r
b8b69433
HW
131 );\r
132\r
133/**\r
2e15b750 134 Free the DMA resources allocated by an NVME controller.\r
b8b69433
HW
135\r
136 @param[in] Private The pointer to the PEI_NVME_CONTROLLER_PRIVATE_DATA data structure.\r
137\r
138**/\r
139VOID\r
2e15b750 140NvmeFreeDmaResource (\r
1436aea4 141 IN PEI_NVME_CONTROLLER_PRIVATE_DATA *Private\r
b8b69433
HW
142 );\r
143\r
144#endif\r