|
5 | 5 | * Copyright (c) 2023, David Gwynne <[email protected]> |
6 | 6 | * Copyright (c) 2023, Jared McNeill <[email protected]> |
7 | 7 | * Copyright (c) 2023, Molly Sophia <[email protected]> |
| 8 | + * Copyright (c) 2025, Mario Bălănică <[email protected]> |
8 | 9 | * |
9 | 10 | * SPDX-License-Identifier: BSD-2-Clause-Patent |
10 | 11 | * |
|
18 | 19 | #include <Library/CruLib.h> |
19 | 20 | #include <Library/UefiBootServicesTableLib.h> |
20 | 21 | #include <Library/PcdLib.h> |
| 22 | +#include <VarStoreData.h> |
21 | 23 |
|
22 | | -#define PCIE30_PHY_GRF 0xfd5b8000 |
23 | | -/* PCIEPHY_GRF */ |
24 | | -#define GRF_PCIE30_PHY_CON(n) (PCIE30_PHY_GRF + 0x0000 + (n) * 0x4) /* 0 .. 9 */ |
25 | | -#define GRF_PCIE30_PHY_STATUS(n) (PCIE30_PHY_GRF + 0x0080 + (n) * 0x4) /* 0 .. 2 */ |
26 | | -#define GRF_PCIE30_PHY_PRT0_CON(n) (PCIE30_PHY_GRF + 0x0100 + (n) * 0x4) /* 0 .. 39 */ |
27 | | -/* CON1 and CON9 */ |
28 | | -#define GRF_PCIE30PHY_DA_OCM_MASK BIT15 |
29 | | -#define GRF_PCIE30PHY_DA_OCM BIT15 |
30 | | -/* CON5 */ |
31 | | -#define GRF_PCIE30PHY_LANE0_LINK_NUM_SHIFT 0 |
32 | | -#define GRF_PCIE30PHY_LANE0_LINK_NUM_MASK (0xfU << GRF_PCIE30PHY_LANE0_LINK_NUM_SHIFT) |
33 | | -/* CON6 */ |
34 | | -#define GRF_PCIE30PHY_LANE1_LINK_NUM_SHIFT 0 |
35 | | -#define GRF_PCIE30PHY_LANE1_LINK_NUM_MASK (0xfU << GRF_PCIE30PHY_LANE1_LINK_NUM_SHIFT) |
36 | | - |
37 | | -/* STATUS0 */ |
38 | | -#define GRF_PCIE30PHY_SRAM_INIT_DONE BIT14 |
39 | | - |
40 | | -#define SOFTRST_INDEX 27 |
41 | | -#define SOFTRST_BIT 14 |
42 | | - |
43 | | -STATIC |
44 | | -VOID |
45 | | -GrfUpdateRegister ( |
46 | | - IN EFI_PHYSICAL_ADDRESS Reg, |
47 | | - IN UINT32 Mask, |
48 | | - IN UINT32 Val |
49 | | - ) |
50 | | -{ |
51 | | - ASSERT ((Mask & ~0xFFFF) == 0); |
52 | | - ASSERT ((Val & ~0xFFFF) == 0); |
53 | | - ASSERT ((Mask & Val) == Val); |
| 24 | +#define PHP_GRF_BASE 0xfd5b0000 |
| 25 | +#define PCIE3PHY_GRF_BASE 0xfd5b8000 |
54 | 26 |
|
55 | | - MmioWrite32 (Reg, (Mask << 16) | Val); |
56 | | -} |
| 27 | +/* PHP_GRF */ |
| 28 | +#define PHP_GRF_PCIESEL_CON 0x100 |
| 29 | + |
| 30 | +/* PCIE3PHY_GRF */ |
| 31 | +#define PCIE3PHY_GRF_CMN_CON0 0x0 |
| 32 | +#define PCIE3PHY_GRF_PHY0_STATUS1 0x904 |
| 33 | +#define PCIE3PHY_GRF_PHY1_STATUS1 0xa04 |
| 34 | +#define PCIE3PHY_SRAM_INIT_DONE(reg) ((reg & BIT0) != 0) |
| 35 | + |
| 36 | +STATIC EFI_STATUS mInitStatus = EFI_NOT_READY; |
57 | 37 |
|
58 | 38 | EFI_STATUS |
59 | 39 | Pcie30PhyInit ( |
60 | 40 | VOID |
61 | 41 | ) |
62 | 42 | { |
63 | | - // UINTN Retry; |
| 43 | + UINT8 Mode; |
| 44 | + UINT32 Reg; |
| 45 | + UINTN Retry; |
64 | 46 |
|
65 | | - DEBUG ((DEBUG_INFO, "PCIe30: PHY init\n")); |
66 | | - DEBUG ((DEBUG_INFO, "PCIe30: PHY mode %d\n", PcdGet8 (PcdPcie30PhyMode))); |
| 47 | + if (mInitStatus != EFI_NOT_READY) { |
| 48 | + return mInitStatus; |
| 49 | + } |
67 | 50 |
|
68 | | - // MicroSecondDelay(100000); |
| 51 | + Mode = PcdGet8 (PcdPcie30PhyMode); |
69 | 52 |
|
70 | | - /* Disable power domain */ |
| 53 | + DEBUG ((DEBUG_INFO, "PCIe30: PHY init\n")); |
| 54 | + DEBUG ((DEBUG_INFO, "PCIe30: PHY mode %d\n", Mode)); |
| 55 | + |
| 56 | + /* Enable power domain */ |
71 | 57 | MmioWrite32 (0xFD8D8150, 0x1 << 23 | 0x1 << 21); // PD_PCIE & PD_PHP |
72 | 58 |
|
73 | | - /* Phy mode: from pcd Pcie30PhyMode */ |
74 | | - MmioWrite32 (GRF_PCIE30_PHY_CON (0), (0x7 << 16) | PcdGet8 (PcdPcie30PhyMode)); |
| 59 | + /* Phy mode */ |
| 60 | + Reg = Mode; |
| 61 | + MmioWrite32 (PCIE3PHY_GRF_BASE + PCIE3PHY_GRF_CMN_CON0, (0x7 << 16) | Reg); |
| 62 | + |
| 63 | + /* Set pcie1ln_sel in PHP_GRF_PCIESEL_CON */ |
| 64 | + Reg &= 0x3; |
| 65 | + if (Reg) { |
| 66 | + MmioWrite32 (PHP_GRF_BASE + PHP_GRF_PCIESEL_CON, (0x3 << 16) | Reg); |
| 67 | + } |
75 | 68 |
|
| 69 | + /* Assert PHY Reset */ |
76 | 70 | MmioWrite32 (0xFD7C8A00, (0x1 << 10) | (0x1 << 26)); |
| 71 | + MicroSecondDelay (1); |
77 | 72 |
|
78 | 73 | /* Deassert PCIe PMA output clamp mode */ |
79 | | - MmioWrite32 (GRF_PCIE30_PHY_CON (0), (0x1 << 8) | (0x1 << 24)); |
| 74 | + MmioWrite32 (PCIE3PHY_GRF_BASE + PCIE3PHY_GRF_CMN_CON0, (0x1 << 8) | (0x1 << 24)); |
80 | 75 |
|
81 | 76 | /* Deassert PHY Reset */ |
82 | 77 | MmioWrite32 (0xFD7C8A00, (0x1 << 26)); |
83 | 78 |
|
84 | | - // /* Enable clocks */ |
85 | | - // PmuCruEnableClock (2, 13); |
86 | | - // PmuCruEnableClock (2, 14); |
87 | | - // CruEnableClock (33, 8); |
88 | | - |
89 | | - // /* Assert reset */ |
90 | | - // CruAssertSoftReset (SOFTRST_INDEX, SOFTRST_BIT); |
91 | | - // gBS->Stall (1000); |
| 79 | + for (Retry = 500; Retry > 0; Retry--) { |
| 80 | + Reg = MmioRead32 (PCIE3PHY_GRF_BASE + PCIE3PHY_GRF_PHY0_STATUS1); |
| 81 | + if (Mode == PCIE30_PHY_MODE_AGGREGATION) { |
| 82 | + Reg &= MmioRead32 (PCIE3PHY_GRF_BASE + PCIE3PHY_GRF_PHY1_STATUS1); |
| 83 | + } |
92 | 84 |
|
93 | | - // MicroSecondDelay (1); |
| 85 | + if (PCIE3PHY_SRAM_INIT_DONE (Reg)) { |
| 86 | + break; |
| 87 | + } |
94 | 88 |
|
95 | | - // GrfUpdateRegister (GRF_PCIE30_PHY_CON (9), GRF_PCIE30PHY_DA_OCM_MASK, GRF_PCIE30PHY_DA_OCM); |
96 | | - // GrfUpdateRegister (GRF_PCIE30_PHY_CON (5), GRF_PCIE30PHY_LANE0_LINK_NUM_MASK, PCIE30PHY_LANE0_LINK_NUM); |
97 | | - // GrfUpdateRegister (GRF_PCIE30_PHY_CON (6), GRF_PCIE30PHY_LANE1_LINK_NUM_MASK, PCIE30PHY_LANE1_LINK_NUM); |
98 | | - // GrfUpdateRegister (GRF_PCIE30_PHY_CON (1), GRF_PCIE30PHY_DA_OCM_MASK, GRF_PCIE30PHY_DA_OCM); |
| 89 | + MicroSecondDelay (100); |
| 90 | + } |
99 | 91 |
|
100 | | - // /* De-assert reset */ |
101 | | - // CruDeassertSoftReset (SOFTRST_INDEX, SOFTRST_BIT); |
102 | | - |
103 | | - // for (Retry = 500; Retry > 0; Retry--) { |
104 | | - // MicroSecondDelay (100); |
105 | | - |
106 | | - // if ((MmioRead32 (GRF_PCIE30_PHY_STATUS (0)) & GRF_PCIE30PHY_SRAM_INIT_DONE) != 0) { |
107 | | - // break; |
108 | | - // } |
109 | | - // } |
110 | | - // if (Retry == 0) { |
111 | | - // DEBUG ((DEBUG_WARN, "PCIe30: Failed to enable PCIe 3.0 PHY\n")); |
112 | | - // return EFI_TIMEOUT; |
113 | | - // } |
| 92 | + if (Retry == 0) { |
| 93 | + DEBUG ((DEBUG_WARN, "PCIe30: PHY init failed\n")); |
| 94 | + mInitStatus = EFI_TIMEOUT; |
| 95 | + goto Exit; |
| 96 | + } |
114 | 97 |
|
115 | 98 | DEBUG ((DEBUG_INFO, "PCIe30: PHY init complete\n")); |
116 | | - return EFI_SUCCESS; |
| 99 | + mInitStatus = EFI_SUCCESS; |
| 100 | + |
| 101 | +Exit: |
| 102 | + return mInitStatus; |
117 | 103 | } |
0 commit comments