190eb1077SAndy Ritger /*
2*476bd345SBernhard Stoeckner  * SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
390eb1077SAndy Ritger  * SPDX-License-Identifier: MIT
490eb1077SAndy Ritger  *
590eb1077SAndy Ritger  * Permission is hereby granted, free of charge, to any person obtaining a
690eb1077SAndy Ritger  * copy of this software and associated documentation files (the "Software"),
790eb1077SAndy Ritger  * to deal in the Software without restriction, including without limitation
890eb1077SAndy Ritger  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
990eb1077SAndy Ritger  * and/or sell copies of the Software, and to permit persons to whom the
1090eb1077SAndy Ritger  * Software is furnished to do so, subject to the following conditions:
1190eb1077SAndy Ritger  *
1290eb1077SAndy Ritger  * The above copyright notice and this permission notice shall be included in
1390eb1077SAndy Ritger  * all copies or substantial portions of the Software.
1490eb1077SAndy Ritger  *
1590eb1077SAndy Ritger  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1690eb1077SAndy Ritger  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1790eb1077SAndy Ritger  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1890eb1077SAndy Ritger  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1990eb1077SAndy Ritger  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2090eb1077SAndy Ritger  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2190eb1077SAndy Ritger  * DEALINGS IN THE SOFTWARE.
2290eb1077SAndy Ritger  */
2390eb1077SAndy Ritger 
2490eb1077SAndy Ritger #include "core/core.h"
2590eb1077SAndy Ritger #include "gpu/gpu.h"
2690eb1077SAndy Ritger 
2790eb1077SAndy Ritger #include "nverror.h"
2890eb1077SAndy Ritger #include "gpu/bif/kernel_bif.h"
29eb5c7665SAndy Ritger #include "gpu/fsp/kern_fsp.h"
3090eb1077SAndy Ritger #include "platform/chipset/chipset.h"
3190eb1077SAndy Ritger #include "ctrl/ctrl2080/ctrl2080bus.h"
3290eb1077SAndy Ritger 
3390eb1077SAndy Ritger #include "published/hopper/gh100/dev_xtl_ep_pcfg_gpu.h"
3491676d66SBernhard Stoeckner 
3591676d66SBernhard Stoeckner #include "published/hopper/gh100/dev_fb.h"
3690eb1077SAndy Ritger #include "published/hopper/gh100/hwproject.h"
3791676d66SBernhard Stoeckner #include "published/hopper/gh100/dev_xtl_ep_pri.h"
3891676d66SBernhard Stoeckner #include "published/hopper/gh100/dev_nv_xpl.h"
39b5bf85a8SAndy Ritger #include "published/hopper/gh100/dev_vm.h"
4091676d66SBernhard Stoeckner #include "published/hopper/gh100/dev_pmc.h"
4190eb1077SAndy Ritger 
4290eb1077SAndy Ritger #include "os/os.h"
4390eb1077SAndy Ritger 
4491676d66SBernhard Stoeckner static NV_STATUS    _kbifSavePcieConfigRegisters_GH100(OBJGPU *pGpu, KernelBif *pKernelBif, const PKBIF_XVE_REGMAP_REF pRegmapRef);
4591676d66SBernhard Stoeckner static NV_STATUS    _kbifRestorePcieConfigRegisters_GH100(OBJGPU *pGpu, KernelBif *pKernelBif, const PKBIF_XVE_REGMAP_REF pRegmapRef);
4691676d66SBernhard Stoeckner 
4791676d66SBernhard Stoeckner // Size of PCIe config space
4891676d66SBernhard Stoeckner #define PCIE_CONFIG_SPACE_MAX_SIZE     0x2FC
4991676d66SBernhard Stoeckner 
5091676d66SBernhard Stoeckner // Devinit completion timeout after FLR
5191676d66SBernhard Stoeckner #define BIF_FLR_DEVINIT_COMPLETION_TIMEOUT_DEFAULT      900000
5291676d66SBernhard Stoeckner 
5391676d66SBernhard Stoeckner 
5490eb1077SAndy Ritger /*!
5590eb1077SAndy Ritger  * @brief Check if MSI is enabled in HW
5690eb1077SAndy Ritger  *
5790eb1077SAndy Ritger  * @param[in] pGpu        GPU object pointer
5890eb1077SAndy Ritger  * @param[in] pKernelBif  Kernel BIF object pointer
5990eb1077SAndy Ritger  *
6090eb1077SAndy Ritger  * @return  True if MSI enabled else False
6190eb1077SAndy Ritger  */
6290eb1077SAndy Ritger NvBool
kbifIsMSIEnabledInHW_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)6390eb1077SAndy Ritger kbifIsMSIEnabledInHW_GH100
6490eb1077SAndy Ritger (
6590eb1077SAndy Ritger     OBJGPU    *pGpu,
6690eb1077SAndy Ritger     KernelBif *pKernelBif
6790eb1077SAndy Ritger )
6890eb1077SAndy Ritger {
6990eb1077SAndy Ritger     NvU32 data32;
7090eb1077SAndy Ritger 
7190eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_MSI_64_HEADER,
7290eb1077SAndy Ritger                              &data32) != NV_OK)
7390eb1077SAndy Ritger     {
7490eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
7590eb1077SAndy Ritger                   "unable to read NV_EP_PCFG_GPU_MSI_64_HEADER\n");
7690eb1077SAndy Ritger     }
7790eb1077SAndy Ritger 
7890eb1077SAndy Ritger     return FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _MSI_64_HEADER,
7990eb1077SAndy Ritger                             _MSI_ENABLE, 0x1, data32);
8090eb1077SAndy Ritger }
8190eb1077SAndy Ritger 
8290eb1077SAndy Ritger /*!
8390eb1077SAndy Ritger  * @brief Check if MSIX is enabled in HW
8490eb1077SAndy Ritger  *
8590eb1077SAndy Ritger  * @param[in] pGpu        GPU object pointer
8690eb1077SAndy Ritger  * @param[in] pKernelBif  Kernel BIF object pointer
8790eb1077SAndy Ritger  *
8890eb1077SAndy Ritger  * @return  True if MSIX enabled else False
8990eb1077SAndy Ritger  */
9090eb1077SAndy Ritger NvBool
kbifIsMSIXEnabledInHW_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)9190eb1077SAndy Ritger kbifIsMSIXEnabledInHW_GH100
9290eb1077SAndy Ritger (
9390eb1077SAndy Ritger     OBJGPU    *pGpu,
9490eb1077SAndy Ritger     KernelBif *pKernelBif
9590eb1077SAndy Ritger )
9690eb1077SAndy Ritger {
9790eb1077SAndy Ritger     NvU32 data32;
9890eb1077SAndy Ritger 
9990eb1077SAndy Ritger     if (IS_VIRTUAL(pGpu))
10090eb1077SAndy Ritger     {
10190eb1077SAndy Ritger         // SR-IOV guests only support MSI-X
10290eb1077SAndy Ritger         return IS_VIRTUAL_WITH_SRIOV(pGpu);
10390eb1077SAndy Ritger     }
10490eb1077SAndy Ritger     else
10590eb1077SAndy Ritger     {
10690eb1077SAndy Ritger         if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
10790eb1077SAndy Ritger                 NV_EP_PCFG_GPU_MSIX_CAP_HEADER, &data32) != NV_OK)
10890eb1077SAndy Ritger         {
10990eb1077SAndy Ritger             NV_ASSERT_FAILED("Unable to read NV_EP_PCFG_GPU_MSIX_CAP_HEADER\n");
11090eb1077SAndy Ritger             return NV_FALSE;
11190eb1077SAndy Ritger         }
11290eb1077SAndy Ritger         return FLD_TEST_DRF(_EP_PCFG_GPU, _MSIX_CAP_HEADER, _ENABLE,
11390eb1077SAndy Ritger                             _ENABLED, data32);
11490eb1077SAndy Ritger     }
11590eb1077SAndy Ritger }
11690eb1077SAndy Ritger 
11790eb1077SAndy Ritger /*!
11890eb1077SAndy Ritger  * @brief Check if access to PCI config space is enabled or not
11990eb1077SAndy Ritger  *
12090eb1077SAndy Ritger  * @param[in] pGpu        GPU object pointer
12190eb1077SAndy Ritger  * @param[in] pKernelBif  Kernel BIF object pointer
12290eb1077SAndy Ritger  *
12390eb1077SAndy Ritger  * @return NV_TRUE Pci IO access is enabled
12490eb1077SAndy Ritger  */
12590eb1077SAndy Ritger NvBool
kbifIsPciIoAccessEnabled_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)12690eb1077SAndy Ritger kbifIsPciIoAccessEnabled_GH100
12790eb1077SAndy Ritger (
12890eb1077SAndy Ritger     OBJGPU    *pGpu,
12990eb1077SAndy Ritger     KernelBif *pKernelBif
13090eb1077SAndy Ritger )
13190eb1077SAndy Ritger {
13290eb1077SAndy Ritger     NvU32   data = 0;
13390eb1077SAndy Ritger 
13490eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
13590eb1077SAndy Ritger                              NV_EP_PCFG_GPU_CTRL_CMD_AND_STATUS, &data) == NV_OK)
13690eb1077SAndy Ritger     {
13790eb1077SAndy Ritger         if (FLD_TEST_DRF(_EP_PCFG_GPU, _CTRL_CMD_AND_STATUS, _CMD_IO_SPACE, _ENABLE, data))
13890eb1077SAndy Ritger         {
13990eb1077SAndy Ritger             return NV_TRUE;
14090eb1077SAndy Ritger         }
14190eb1077SAndy Ritger     }
14290eb1077SAndy Ritger 
14390eb1077SAndy Ritger     return NV_FALSE;
14490eb1077SAndy Ritger }
14590eb1077SAndy Ritger 
14690eb1077SAndy Ritger /*!
14790eb1077SAndy Ritger  * @brief Check if device is a 3D controller
14890eb1077SAndy Ritger  *
14990eb1077SAndy Ritger  * @param[in] pGpu        GPU object pointer
15090eb1077SAndy Ritger  * @param[in] pKernelBif  Kernel BIF object pointer
15190eb1077SAndy Ritger  *
15290eb1077SAndy Ritger  * @return NV_TRUE If device is a 3D controller
15390eb1077SAndy Ritger  */
15490eb1077SAndy Ritger NvBool
kbifIs3dController_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)15590eb1077SAndy Ritger kbifIs3dController_GH100
15690eb1077SAndy Ritger (
15790eb1077SAndy Ritger     OBJGPU    *pGpu,
15890eb1077SAndy Ritger     KernelBif *pKernelBif
15990eb1077SAndy Ritger )
16090eb1077SAndy Ritger {
16190eb1077SAndy Ritger     NvU32   data = 0;
16290eb1077SAndy Ritger 
16390eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
16490eb1077SAndy Ritger                              NV_EP_PCFG_GPU_REVISION_ID_AND_CLASSCODE, &data) == NV_OK)
16590eb1077SAndy Ritger     {
16690eb1077SAndy Ritger         if (FLD_TEST_DRF(_EP_PCFG_GPU, _REVISION_ID_AND_CLASSCODE, _BASE_CLASSCODE, _3D, data))
16790eb1077SAndy Ritger         {
16890eb1077SAndy Ritger             return NV_TRUE;
16990eb1077SAndy Ritger         }
17090eb1077SAndy Ritger     }
17190eb1077SAndy Ritger 
17290eb1077SAndy Ritger     return NV_FALSE;
17390eb1077SAndy Ritger }
17490eb1077SAndy Ritger 
17590eb1077SAndy Ritger /*!
17690eb1077SAndy Ritger  * @brief Enables extended tag support for GPU.
17790eb1077SAndy Ritger  *
17890eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
17990eb1077SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
18090eb1077SAndy Ritger  *
18190eb1077SAndy Ritger  */
18290eb1077SAndy Ritger void
kbifEnableExtendedTagSupport_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)18390eb1077SAndy Ritger kbifEnableExtendedTagSupport_GH100
18490eb1077SAndy Ritger (
18590eb1077SAndy Ritger     OBJGPU    *pGpu,
18690eb1077SAndy Ritger     KernelBif *pKernelBif
18790eb1077SAndy Ritger )
18890eb1077SAndy Ritger {
18990eb1077SAndy Ritger     NvU32   reg;
19090eb1077SAndy Ritger     OBJSYS *pSys = SYS_GET_INSTANCE();
19190eb1077SAndy Ritger     OBJCL  *pCl  = SYS_GET_CL(pSys);
19290eb1077SAndy Ritger 
19390eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CAPABILITIES,
19490eb1077SAndy Ritger                              &reg) != NV_OK)
19590eb1077SAndy Ritger     {
19690eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
19790eb1077SAndy Ritger                   "Unable to read NV_EP_PCFG_GPU_DEVICE_CAPABILITIES\n");
19890eb1077SAndy Ritger         goto _kbifEnableExtendedTagSupport_GH100_exit;
19990eb1077SAndy Ritger     }
20090eb1077SAndy Ritger 
20190eb1077SAndy Ritger     reg = GPU_DRF_VAL(_EP_PCFG_GPU, _DEVICE_CAPABILITIES,
20290eb1077SAndy Ritger                       _EXTENDED_TAG_FIELD_SUPPORTED, reg);
20390eb1077SAndy Ritger     if ((reg != 0) &&
20490eb1077SAndy Ritger         !pCl->getProperty(pCl, PDB_PROP_CL_EXTENDED_TAG_FIELD_NOT_CAPABLE))
20590eb1077SAndy Ritger     {
20690eb1077SAndy Ritger         if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
20790eb1077SAndy Ritger                                  &reg) != NV_OK)
20890eb1077SAndy Ritger         {
20990eb1077SAndy Ritger             NV_PRINTF(LEVEL_ERROR,
21090eb1077SAndy Ritger                       "Unable to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS\n");
21190eb1077SAndy Ritger             goto _kbifEnableExtendedTagSupport_GH100_exit;
21290eb1077SAndy Ritger         }
21390eb1077SAndy Ritger         reg = FLD_SET_DRF(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
21490eb1077SAndy Ritger                           _EXTENDED_TAG_FIELD_ENABLE, _INIT, reg);
21590eb1077SAndy Ritger 
21690eb1077SAndy Ritger         if (GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
21790eb1077SAndy Ritger                                  reg) != NV_OK)
21890eb1077SAndy Ritger         {
21990eb1077SAndy Ritger             NV_PRINTF(LEVEL_ERROR,
22090eb1077SAndy Ritger                       "Unable to write NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS\n");
22190eb1077SAndy Ritger             goto _kbifEnableExtendedTagSupport_GH100_exit;
22290eb1077SAndy Ritger         }
22390eb1077SAndy Ritger     }
22490eb1077SAndy Ritger 
22590eb1077SAndy Ritger _kbifEnableExtendedTagSupport_GH100_exit:
22690eb1077SAndy Ritger     return;
22790eb1077SAndy Ritger }
22890eb1077SAndy Ritger 
22990eb1077SAndy Ritger /*!
23090eb1077SAndy Ritger  * @brief Enable/disable no snoop for GPU
23190eb1077SAndy Ritger  *
23290eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
23390eb1077SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
23490eb1077SAndy Ritger  * @param[in]  bEnable     True if No snoop needs to be enabled
23590eb1077SAndy Ritger  *
23690eb1077SAndy Ritger  * @return NV_OK If no snoop modified as requested
23790eb1077SAndy Ritger  */
23890eb1077SAndy Ritger NV_STATUS
kbifEnableNoSnoop_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvBool bEnable)23990eb1077SAndy Ritger kbifEnableNoSnoop_GH100
24090eb1077SAndy Ritger (
24190eb1077SAndy Ritger     OBJGPU    *pGpu,
24290eb1077SAndy Ritger     KernelBif *pKernelBif,
24390eb1077SAndy Ritger     NvBool     bEnable
24490eb1077SAndy Ritger )
24590eb1077SAndy Ritger {
24690eb1077SAndy Ritger     NvU8  fieldVal;
24790eb1077SAndy Ritger     NvU32 regVal;
24890eb1077SAndy Ritger     NvU32 status = NV_OK;
24990eb1077SAndy Ritger 
25090eb1077SAndy Ritger     status = GPU_BUS_CFG_CYCLE_RD32(pGpu,
25190eb1077SAndy Ritger                 NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, &regVal);
25290eb1077SAndy Ritger     if (status != NV_OK)
25390eb1077SAndy Ritger     {
25490eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
25590eb1077SAndy Ritger             "Failed to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS.\n");
25690eb1077SAndy Ritger         goto _kbifEnableNoSnoop_GH100_exit;
25790eb1077SAndy Ritger     }
25890eb1077SAndy Ritger 
25990eb1077SAndy Ritger     fieldVal = bEnable ? 1 : 0;
26090eb1077SAndy Ritger     regVal   = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
26190eb1077SAndy Ritger                                _ENABLE_NO_SNOOP, fieldVal, regVal);
26290eb1077SAndy Ritger     status   = GPU_BUS_CFG_CYCLE_WR32(pGpu,
26390eb1077SAndy Ritger                                     NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, regVal);
26490eb1077SAndy Ritger     if (status != NV_OK)
26590eb1077SAndy Ritger     {
26690eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
26790eb1077SAndy Ritger             "Failed to write NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS.\n");
26890eb1077SAndy Ritger         goto _kbifEnableNoSnoop_GH100_exit;
26990eb1077SAndy Ritger     }
27090eb1077SAndy Ritger 
27190eb1077SAndy Ritger _kbifEnableNoSnoop_GH100_exit:
27290eb1077SAndy Ritger     return status;
27390eb1077SAndy Ritger }
27490eb1077SAndy Ritger 
27590eb1077SAndy Ritger /*!
27690eb1077SAndy Ritger  * @brief Enables Relaxed Ordering PCI-E Capability in the PCI Config Space
27790eb1077SAndy Ritger  *
27890eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
27990eb1077SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
28090eb1077SAndy Ritger  */
28190eb1077SAndy Ritger void
kbifPcieConfigEnableRelaxedOrdering_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)28290eb1077SAndy Ritger kbifPcieConfigEnableRelaxedOrdering_GH100
28390eb1077SAndy Ritger (
28490eb1077SAndy Ritger     OBJGPU    *pGpu,
28590eb1077SAndy Ritger     KernelBif *pKernelBif
28690eb1077SAndy Ritger )
28790eb1077SAndy Ritger {
28890eb1077SAndy Ritger     NvU32 xveDevCtrlStatus;
28990eb1077SAndy Ritger 
29090eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
29190eb1077SAndy Ritger                              NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
29290eb1077SAndy Ritger                              &xveDevCtrlStatus) == NV_ERR_GENERIC)
29390eb1077SAndy Ritger     {
29490eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
29590eb1077SAndy Ritger                   "Unable to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS!\n");
29690eb1077SAndy Ritger     }
29790eb1077SAndy Ritger     else
29890eb1077SAndy Ritger     {
29990eb1077SAndy Ritger         GPU_BUS_CFG_CYCLE_FLD_WR_DRF_DEF(pGpu, xveDevCtrlStatus, _EP_PCFG_GPU,
30090eb1077SAndy Ritger                                    _DEVICE_CONTROL_STATUS, _ENABLE_RELAXED_ORDERING, _INIT);
30190eb1077SAndy Ritger     }
30290eb1077SAndy Ritger }
30390eb1077SAndy Ritger 
30490eb1077SAndy Ritger /*!
30590eb1077SAndy Ritger  * @brief Disables Relaxed Ordering PCI-E Capability in the PCI Config Space
30690eb1077SAndy Ritger  *
30790eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
30890eb1077SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
30990eb1077SAndy Ritger  */
31090eb1077SAndy Ritger void
kbifPcieConfigDisableRelaxedOrdering_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)31190eb1077SAndy Ritger kbifPcieConfigDisableRelaxedOrdering_GH100
31290eb1077SAndy Ritger (
31390eb1077SAndy Ritger     OBJGPU    *pGpu,
31490eb1077SAndy Ritger     KernelBif *pKernelBif
31590eb1077SAndy Ritger )
31690eb1077SAndy Ritger {
31790eb1077SAndy Ritger     NvU32 xtlDevCtrlStatus;
31890eb1077SAndy Ritger 
31990eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
32090eb1077SAndy Ritger                              &xtlDevCtrlStatus) == NV_ERR_GENERIC)
32190eb1077SAndy Ritger     {
32290eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
32390eb1077SAndy Ritger                   "Unable to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS!\n");
32490eb1077SAndy Ritger     }
32590eb1077SAndy Ritger     else
32690eb1077SAndy Ritger     {
32790eb1077SAndy Ritger         xtlDevCtrlStatus = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
32890eb1077SAndy Ritger                                            _ENABLE_RELAXED_ORDERING, 0, xtlDevCtrlStatus);
32990eb1077SAndy Ritger         GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
33090eb1077SAndy Ritger                              xtlDevCtrlStatus);
33190eb1077SAndy Ritger     }
33290eb1077SAndy Ritger }
33390eb1077SAndy Ritger 
33490eb1077SAndy Ritger /*!
33590eb1077SAndy Ritger  * @brief  Get the status of XTL
33690eb1077SAndy Ritger  *         (Function name ideally should be bifGetXtlStatusBits)
33790eb1077SAndy Ritger  *
33890eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
33990eb1077SAndy Ritger  * @param[in]  pKernelBif  BIF object pointer
34090eb1077SAndy Ritger  * @param[out] pBits       PCIE error status values
34190eb1077SAndy Ritger  * @param[out] pStatus     Full XTL status
34290eb1077SAndy Ritger  *
34390eb1077SAndy Ritger  * @return NV_OK
34490eb1077SAndy Ritger  */
34590eb1077SAndy Ritger NV_STATUS
kbifGetXveStatusBits_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvU32 * pBits,NvU32 * pStatus)34690eb1077SAndy Ritger kbifGetXveStatusBits_GH100
34790eb1077SAndy Ritger (
34890eb1077SAndy Ritger     OBJGPU    *pGpu,
34990eb1077SAndy Ritger     KernelBif *pKernelBif,
35090eb1077SAndy Ritger     NvU32     *pBits,
35190eb1077SAndy Ritger     NvU32     *pStatus
35290eb1077SAndy Ritger )
35390eb1077SAndy Ritger {
35490eb1077SAndy Ritger     // control/status reg 0x68
35590eb1077SAndy Ritger     NvU32 xtlDevCtrlStatus;
35690eb1077SAndy Ritger 
35790eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
35890eb1077SAndy Ritger                              NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
35990eb1077SAndy Ritger                              &xtlDevCtrlStatus) != NV_OK)
36090eb1077SAndy Ritger     {
36190eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR,
36290eb1077SAndy Ritger                   "Unable to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS!\n");
36390eb1077SAndy Ritger     }
36490eb1077SAndy Ritger     if (pBits == NULL)
36590eb1077SAndy Ritger         return NV_ERR_GENERIC;
36690eb1077SAndy Ritger 
36790eb1077SAndy Ritger     *pBits = 0;
36890eb1077SAndy Ritger 
36990eb1077SAndy Ritger     // The register read above returns garbage on fmodel, so just return.
37090eb1077SAndy Ritger     if (IS_FMODEL(pGpu))
37190eb1077SAndy Ritger     {
37290eb1077SAndy Ritger         if (pStatus)
37390eb1077SAndy Ritger         {
37490eb1077SAndy Ritger             *pStatus = 0;
37590eb1077SAndy Ritger         }
37690eb1077SAndy Ritger         return NV_OK;
37790eb1077SAndy Ritger     }
37890eb1077SAndy Ritger 
37990eb1077SAndy Ritger     // Optionally return full status
38090eb1077SAndy Ritger     if (pStatus)
38190eb1077SAndy Ritger     {
38290eb1077SAndy Ritger         *pStatus = xtlDevCtrlStatus;
38390eb1077SAndy Ritger     }
38490eb1077SAndy Ritger 
38590eb1077SAndy Ritger     if (xtlDevCtrlStatus & DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
38690eb1077SAndy Ritger                                    _CORR_ERROR_DETECTED, 1))
38790eb1077SAndy Ritger     {
38890eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_CORR_ERROR;
38990eb1077SAndy Ritger     }
39090eb1077SAndy Ritger     if (xtlDevCtrlStatus & DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
39190eb1077SAndy Ritger                                    _NON_FATAL_ERROR_DETECTED, 1))
39290eb1077SAndy Ritger     {
39390eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_NON_FATAL_ERROR;
39490eb1077SAndy Ritger     }
39590eb1077SAndy Ritger     if (xtlDevCtrlStatus & DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
39690eb1077SAndy Ritger                                    _FATAL_ERROR_DETECTED, 1))
39790eb1077SAndy Ritger     {
39890eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_FATAL_ERROR;
39990eb1077SAndy Ritger     }
40090eb1077SAndy Ritger     if (xtlDevCtrlStatus & DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS,
40190eb1077SAndy Ritger                                    _UNSUPP_REQUEST_DETECTED, 1))
40290eb1077SAndy Ritger     {
40390eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_UNSUPP_REQUEST;
40490eb1077SAndy Ritger     }
40590eb1077SAndy Ritger 
40690eb1077SAndy Ritger     if (pKernelBif->EnteredRecoverySinceErrorsLastChecked)
40790eb1077SAndy Ritger     {
40890eb1077SAndy Ritger         pKernelBif->EnteredRecoverySinceErrorsLastChecked = NV_FALSE;
40990eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_ERRORS_ENTERED_RECOVERY;
41090eb1077SAndy Ritger     }
41190eb1077SAndy Ritger 
41290eb1077SAndy Ritger     return NV_OK;
41390eb1077SAndy Ritger }
41490eb1077SAndy Ritger 
41590eb1077SAndy Ritger /*!
41690eb1077SAndy Ritger  * @brief Clear XVE status
41790eb1077SAndy Ritger  *        (Function name ideally should be bifClearXtlStatus)
41890eb1077SAndy Ritger  *
41990eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
42090eb1077SAndy Ritger  * @param[in]  pKernelBif  BIF object pointer
42190eb1077SAndy Ritger  * @param[out] pStatus     Full XTL status
42290eb1077SAndy Ritger  *
42390eb1077SAndy Ritger  * @return NV_OK
42490eb1077SAndy Ritger  */
42590eb1077SAndy Ritger NV_STATUS
kbifClearXveStatus_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvU32 * pStatus)42690eb1077SAndy Ritger kbifClearXveStatus_GH100
42790eb1077SAndy Ritger (
42890eb1077SAndy Ritger     OBJGPU    *pGpu,
42990eb1077SAndy Ritger     KernelBif *pKernelBif,
43090eb1077SAndy Ritger     NvU32     *pStatus
43190eb1077SAndy Ritger )
43290eb1077SAndy Ritger {
43390eb1077SAndy Ritger     NvU32 xtlDevCtrlStatus;
43490eb1077SAndy Ritger 
43590eb1077SAndy Ritger     if (pStatus)
43690eb1077SAndy Ritger     {
43790eb1077SAndy Ritger         xtlDevCtrlStatus = *pStatus;
43890eb1077SAndy Ritger         if (xtlDevCtrlStatus == 0)
43990eb1077SAndy Ritger         {
44090eb1077SAndy Ritger             return NV_OK;
44190eb1077SAndy Ritger         }
44290eb1077SAndy Ritger     }
44390eb1077SAndy Ritger     else
44490eb1077SAndy Ritger     {
44590eb1077SAndy Ritger         if (GPU_BUS_CFG_CYCLE_RD32(pGpu,
44690eb1077SAndy Ritger                 NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, &xtlDevCtrlStatus) != NV_OK)
44790eb1077SAndy Ritger         {
44890eb1077SAndy Ritger             NV_PRINTF(LEVEL_ERROR,
44990eb1077SAndy Ritger                       "Unable to read NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS!\n");
45090eb1077SAndy Ritger         }
45190eb1077SAndy Ritger     }
45290eb1077SAndy Ritger 
45390eb1077SAndy Ritger     GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, xtlDevCtrlStatus);
45490eb1077SAndy Ritger 
45590eb1077SAndy Ritger     return NV_OK;
45690eb1077SAndy Ritger }
45790eb1077SAndy Ritger 
45890eb1077SAndy Ritger /*!
45990eb1077SAndy Ritger  * @brief Get XTL AER bits
46090eb1077SAndy Ritger  *
46190eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
46290eb1077SAndy Ritger  * @param[in]  pKernelBif  BIF object pointer
46390eb1077SAndy Ritger  * @param[out] pBits       XTL AER bits value
46490eb1077SAndy Ritger  *
46590eb1077SAndy Ritger  * @return NV_OK
46690eb1077SAndy Ritger  */
46790eb1077SAndy Ritger NV_STATUS
kbifGetXveAerBits_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvU32 * pBits)46890eb1077SAndy Ritger kbifGetXveAerBits_GH100
46990eb1077SAndy Ritger (
47090eb1077SAndy Ritger     OBJGPU    *pGpu,
47190eb1077SAndy Ritger     KernelBif *pKernelBif,
47290eb1077SAndy Ritger     NvU32     *pBits
47390eb1077SAndy Ritger )
47490eb1077SAndy Ritger {
47590eb1077SAndy Ritger     NvU32 xtlAerUncorr;
47690eb1077SAndy Ritger     NvU32 xtlAerCorr;
47790eb1077SAndy Ritger 
47890eb1077SAndy Ritger     if (pBits == NULL)
47990eb1077SAndy Ritger         return NV_ERR_GENERIC;
48090eb1077SAndy Ritger 
48190eb1077SAndy Ritger     // The register read below returns garbage on fmodel, so just return.
48290eb1077SAndy Ritger     if (IS_FMODEL(pGpu))
48390eb1077SAndy Ritger     {
48490eb1077SAndy Ritger         return NV_OK;
48590eb1077SAndy Ritger     }
48690eb1077SAndy Ritger 
48790eb1077SAndy Ritger     *pBits = 0;
48890eb1077SAndy Ritger 
48990eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_UNCORRECTABLE_ERROR_STATUS,
49090eb1077SAndy Ritger                              &xtlAerUncorr) != NV_OK)
49190eb1077SAndy Ritger     {
49290eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_UNCORRECTABLE_ERROR_STATUS\n");
49390eb1077SAndy Ritger         return NV_ERR_GENERIC;
49490eb1077SAndy Ritger     }
49590eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_CORRECTABLE_ERROR_STATUS,
49690eb1077SAndy Ritger                              &xtlAerCorr) != NV_OK)
49790eb1077SAndy Ritger     {
49890eb1077SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_CORRECTABLE_ERROR_STATUS\n");
49990eb1077SAndy Ritger         return NV_ERR_GENERIC;
50090eb1077SAndy Ritger     }
50190eb1077SAndy Ritger 
50290eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _DL_PROTOCOL_ERROR, 0x1, xtlAerUncorr))
50390eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_DLINK_PROTO_ERR;
50490eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _POISONED_TLP_RCVD, 0x1, xtlAerUncorr))
50590eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_POISONED_TLP;
50690eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _COMPLETION_TIMEOUT, 0x1, xtlAerUncorr))
50790eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_TIMEOUT;
50890eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _UNEXPECTED_COMPLETION, 0x1, xtlAerUncorr))
50990eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNEXP_CPL;
51090eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _MALFORMED_TLP, 0x1, xtlAerUncorr))
51190eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_MALFORMED_TLP;
51290eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _UNSUPPORTED_REQUEST_ERROR, 0x1, xtlAerUncorr))
51390eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNSUPPORTED_REQ;
51490eb1077SAndy Ritger 
51590eb1077SAndy Ritger     // FERMI-TODO
51690eb1077SAndy Ritger 
51790eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _RECEIVER_ERROR, 0x1, xtlAerCorr))
51890eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RCV_ERR;
51990eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _BAD_TLP, 0x1, xtlAerCorr))
52090eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_TLP;
52190eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _BAD_DLLP , 0x1, xtlAerCorr))
52290eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_DLLP;
52390eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _REPLAY_NUM_ROLLOVER, 0x1, xtlAerCorr))
52490eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_ROLLOVER;
52590eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _REPLAY_TIMER_TIMEOUT, 0x1, xtlAerCorr))
52690eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_TIMEOUT;
52790eb1077SAndy Ritger     if (FLD_TEST_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _ADVISORY_NON_FATAL_ERROR, 0x1, xtlAerCorr))
52890eb1077SAndy Ritger         *pBits |= NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_ADVISORY_NONFATAL;
52990eb1077SAndy Ritger 
53090eb1077SAndy Ritger     return NV_OK;
53190eb1077SAndy Ritger }
53290eb1077SAndy Ritger 
53390eb1077SAndy Ritger /*!
53490eb1077SAndy Ritger  * @brief Clear XTL AER bits
53590eb1077SAndy Ritger  *
53690eb1077SAndy Ritger  * @param[in] pGpu        GPU object pointer
53790eb1077SAndy Ritger  * @param[in] pKernelBif  BIF object pointer
53890eb1077SAndy Ritger  * @param[in] bits        XTL AER bits to be cleared
53990eb1077SAndy Ritger  *
54090eb1077SAndy Ritger  * @return NV_OK
54190eb1077SAndy Ritger  */
54290eb1077SAndy Ritger NV_STATUS
kbifClearXveAer_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvU32 bits)54390eb1077SAndy Ritger kbifClearXveAer_GH100
54490eb1077SAndy Ritger (
54590eb1077SAndy Ritger     OBJGPU    *pGpu,
54690eb1077SAndy Ritger     KernelBif *pKernelBif,
54790eb1077SAndy Ritger     NvU32      bits
54890eb1077SAndy Ritger )
54990eb1077SAndy Ritger {
55090eb1077SAndy Ritger     NvU32 xtlAerUncorr = 0;
55190eb1077SAndy Ritger     NvU32 xtlAerCorr   = 0;
55290eb1077SAndy Ritger 
55390eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_DLINK_PROTO_ERR)
55490eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _DL_PROTOCOL_ERROR, 0x1,
55590eb1077SAndy Ritger                                        xtlAerUncorr);
55690eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_POISONED_TLP)
55790eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _POISONED_TLP_RCVD, 0x1,
55890eb1077SAndy Ritger                                        xtlAerUncorr);
55990eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_CPL_TIMEOUT)
56090eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _COMPLETION_TIMEOUT, 0x1,
56190eb1077SAndy Ritger                                        xtlAerUncorr);
56290eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNEXP_CPL)
56390eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _UNEXPECTED_COMPLETION, 0x1,
56490eb1077SAndy Ritger                                        xtlAerUncorr);
56590eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_MALFORMED_TLP)
56690eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _MALFORMED_TLP, 0x1,
56790eb1077SAndy Ritger                                        xtlAerUncorr);
56890eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_UNCORR_UNSUPPORTED_REQ)
56990eb1077SAndy Ritger         xtlAerUncorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _UNCORRECTABLE_ERROR_STATUS, _UNSUPPORTED_REQUEST_ERROR, 0x1,
57090eb1077SAndy Ritger                                        xtlAerUncorr);
57190eb1077SAndy Ritger 
57290eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RCV_ERR)
57390eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _RECEIVER_ERROR, 0x1,
57490eb1077SAndy Ritger                                      xtlAerCorr);
57590eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_TLP)
57690eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _BAD_TLP, 0x1,
57790eb1077SAndy Ritger                                      xtlAerCorr);
57890eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_BAD_DLLP)
57990eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _BAD_DLLP, 0x1,
58090eb1077SAndy Ritger                                      xtlAerCorr);
58190eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_ROLLOVER)
58290eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _REPLAY_NUM_ROLLOVER, 0x1,
58390eb1077SAndy Ritger                                      xtlAerCorr);
58490eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_RPLY_TIMEOUT)
58590eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _REPLAY_TIMER_TIMEOUT, 0x1,
58690eb1077SAndy Ritger                                      xtlAerCorr);
58790eb1077SAndy Ritger     if (bits & NV2080_CTRL_BUS_INFO_PCIE_LINK_AER_CORR_ADVISORY_NONFATAL)
58890eb1077SAndy Ritger         xtlAerCorr = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _CORRECTABLE_ERROR_STATUS, _ADVISORY_NON_FATAL_ERROR, 0x1,
58990eb1077SAndy Ritger                                      xtlAerCorr);
59090eb1077SAndy Ritger 
59190eb1077SAndy Ritger     if (xtlAerUncorr != 0)
59290eb1077SAndy Ritger     {
59390eb1077SAndy Ritger         GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_UNCORRECTABLE_ERROR_STATUS, xtlAerUncorr);
59490eb1077SAndy Ritger     }
59590eb1077SAndy Ritger     if (xtlAerCorr != 0)
59690eb1077SAndy Ritger     {
59790eb1077SAndy Ritger         GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_CORRECTABLE_ERROR_STATUS, xtlAerCorr);
59890eb1077SAndy Ritger     }
59990eb1077SAndy Ritger 
60090eb1077SAndy Ritger     return NV_OK;
60190eb1077SAndy Ritger }
60290eb1077SAndy Ritger 
60390eb1077SAndy Ritger /*!
60490eb1077SAndy Ritger  * @brief Return the BAR0 offset and size of the PCI config space mirror.
60590eb1077SAndy Ritger  *
60690eb1077SAndy Ritger  * @param[in]  pGpu          GPU object pointer
60790eb1077SAndy Ritger  * @param[in]  pKernelBif    Kernel BIF object pointer
60890eb1077SAndy Ritger  * @param[out] pBase         BAR0 offset of the PCI config space mirror
60990eb1077SAndy Ritger  * @param[out] pSize         Size in bytes of the PCI config space mirror
61090eb1077SAndy Ritger  *
61190eb1077SAndy Ritger  * @returns NV_OK
61290eb1077SAndy Ritger  */
61390eb1077SAndy Ritger NV_STATUS
kbifGetPciConfigSpacePriMirror_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvU32 * pBase,NvU32 * pSize)61490eb1077SAndy Ritger kbifGetPciConfigSpacePriMirror_GH100
61590eb1077SAndy Ritger (
61690eb1077SAndy Ritger     OBJGPU    *pGpu,
61790eb1077SAndy Ritger     KernelBif *pKernelBif,
61890eb1077SAndy Ritger     NvU32     *pBase,
61990eb1077SAndy Ritger     NvU32     *pSize
62090eb1077SAndy Ritger )
62190eb1077SAndy Ritger {
62290eb1077SAndy Ritger     *pBase = DEVICE_BASE(NV_EP_PCFGM);
62390eb1077SAndy Ritger     *pSize = DEVICE_EXTENT(NV_EP_PCFGM) - DEVICE_BASE(NV_EP_PCFGM) + 1;
62490eb1077SAndy Ritger     return NV_OK;
62590eb1077SAndy Ritger }
62690eb1077SAndy Ritger 
62790eb1077SAndy Ritger /*!
62890eb1077SAndy Ritger  * Kernel-RM only function to enable PCIe requester atomics by
62990eb1077SAndy Ritger  * using OS HAL interface and to cache the completer side capabilities returned
63090eb1077SAndy Ritger  * by the OS HAL interface. RM regkeys "RMSysmemSelectAtomicsConfig" and
63190eb1077SAndy Ritger  * "RMSysmemOverridePcieReqAtomicOps" can be used to force override the
63290eb1077SAndy Ritger  * settings.
63390eb1077SAndy Ritger  *
63490eb1077SAndy Ritger  *
63590eb1077SAndy Ritger  * @param[in]       pGpu        OBJGPU pointer
63690eb1077SAndy Ritger  * @param[in/out]   pKernelBif  Kernel BIF object pointer, PCIe requester atomics details
63790eb1077SAndy Ritger  *                              are cached in here.
63890eb1077SAndy Ritger  * @returns None
63990eb1077SAndy Ritger  */
64090eb1077SAndy Ritger void
kbifProbePcieReqAtomicCaps_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)64190eb1077SAndy Ritger kbifProbePcieReqAtomicCaps_GH100
64290eb1077SAndy Ritger (
64390eb1077SAndy Ritger     OBJGPU    *pGpu,
64490eb1077SAndy Ritger     KernelBif *pKernelBif
64590eb1077SAndy Ritger )
64690eb1077SAndy Ritger {
64790eb1077SAndy Ritger     NvU32   osAtomicsMask    = 0;
64890eb1077SAndy Ritger     OBJSYS *pSys = SYS_GET_INSTANCE();
64990eb1077SAndy Ritger     OBJCL  *pCl  = SYS_GET_CL(pSys);
65090eb1077SAndy Ritger 
65190eb1077SAndy Ritger     if (!pCl->getProperty(pCl, PDB_PROP_CL_BUG_3562968_WAR_ALLOW_PCIE_ATOMICS))
65290eb1077SAndy Ritger     {
65390eb1077SAndy Ritger         NV_PRINTF(LEVEL_INFO, "PCIe atomics not supported in this platform!\n");
65490eb1077SAndy Ritger         return;
65590eb1077SAndy Ritger     }
65690eb1077SAndy Ritger 
65790eb1077SAndy Ritger     if (osConfigurePcieReqAtomics(pGpu->pOsGpuInfo, &osAtomicsMask) != NV_OK ||
65890eb1077SAndy Ritger         osAtomicsMask == 0)
65990eb1077SAndy Ritger     {
66090eb1077SAndy Ritger         NV_PRINTF(LEVEL_INFO, "PCIe requester atomics not enabled since "
66190eb1077SAndy Ritger                   "completer is not capable!\n");
66290eb1077SAndy Ritger         return;
66390eb1077SAndy Ritger     }
66490eb1077SAndy Ritger 
66590eb1077SAndy Ritger     pKernelBif->osPcieAtomicsOpMask = osAtomicsMask;
66690eb1077SAndy Ritger 
66790eb1077SAndy Ritger     // Program PCIe atomics register settings
6684397463eSAndy Ritger     kbifEnablePcieAtomics_HAL(pGpu, pKernelBif);
66990eb1077SAndy Ritger 
67090eb1077SAndy Ritger     return;
67190eb1077SAndy Ritger }
67290eb1077SAndy Ritger 
67390eb1077SAndy Ritger /*!
67490eb1077SAndy Ritger  * @brief Enable PCIe atomics if PCIe hierarchy supports it
67590eb1077SAndy Ritger  *
676758b4ee8SAndy Ritger  * @param[in] pGpu       GPU object pointer
6774397463eSAndy Ritger  * @param[in] pKernelBif Kernel BIF object pointer
6784397463eSAndy Ritger  *
67990eb1077SAndy Ritger  */
6804397463eSAndy Ritger void
kbifEnablePcieAtomics_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)6814397463eSAndy Ritger kbifEnablePcieAtomics_GH100
68290eb1077SAndy Ritger (
6834397463eSAndy Ritger     OBJGPU    *pGpu,
6844397463eSAndy Ritger     KernelBif *pKernelBif
68590eb1077SAndy Ritger )
68690eb1077SAndy Ritger {
68790eb1077SAndy Ritger     NvU32 regVal;
68890eb1077SAndy Ritger 
68990eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS_2, &regVal) != NV_OK)
69090eb1077SAndy Ritger     {
69190eb1077SAndy Ritger         NV_PRINTF(LEVEL_INFO, "Read of NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS_2 failed.\n");
69290eb1077SAndy Ritger         return;
69390eb1077SAndy Ritger     }
69490eb1077SAndy Ritger 
69590eb1077SAndy Ritger     regVal = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS_2, _ATOMIC_OP_REQUESTER_ENABLE, 0x1, regVal);
69690eb1077SAndy Ritger 
69790eb1077SAndy Ritger     if (GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS_2, regVal) != NV_OK)
69890eb1077SAndy Ritger     {
69990eb1077SAndy Ritger         NV_PRINTF(LEVEL_INFO, "Write of NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS_2 failed.\n");
70090eb1077SAndy Ritger         return;
70190eb1077SAndy Ritger     }
70290eb1077SAndy Ritger 
70390eb1077SAndy Ritger     NV_PRINTF(LEVEL_INFO, "PCIe Requester atomics enabled.\n");
70490eb1077SAndy Ritger }
70590eb1077SAndy Ritger 
70690eb1077SAndy Ritger /*!
70790eb1077SAndy Ritger  * @brief Get bus options: link specific capabilities or
70890eb1077SAndy Ritger  * pcie device specific parameters or pcie link specific parameters
70990eb1077SAndy Ritger  *
71090eb1077SAndy Ritger  * @param[in]  pGpu        GPU object pointer
71190eb1077SAndy Ritger  * @param[in]  pKernelBif  BIF object pointer
71290eb1077SAndy Ritger  * @param[in]  options     XTL bus options
71390eb1077SAndy Ritger  * @param[out] pAddrReg    Address of the register for the given bus option
71490eb1077SAndy Ritger  *
71590eb1077SAndy Ritger  * @return  NV_OK on success
71690eb1077SAndy Ritger  *          NV_ERR_GENERIC
71790eb1077SAndy Ritger  */
71890eb1077SAndy Ritger NV_STATUS
kbifGetBusOptionsAddr_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,BUS_OPTIONS options,NvU32 * pAddrReg)71990eb1077SAndy Ritger kbifGetBusOptionsAddr_GH100
72090eb1077SAndy Ritger (
72190eb1077SAndy Ritger     OBJGPU     *pGpu,
72290eb1077SAndy Ritger     KernelBif  *pKernelBif,
72390eb1077SAndy Ritger     BUS_OPTIONS options,
72490eb1077SAndy Ritger     NvU32      *pAddrReg
72590eb1077SAndy Ritger )
72690eb1077SAndy Ritger {
72790eb1077SAndy Ritger     NV_STATUS  status = NV_OK;
72890eb1077SAndy Ritger 
72990eb1077SAndy Ritger     switch (options)
73090eb1077SAndy Ritger     {
73190eb1077SAndy Ritger         case BUS_OPTIONS_DEV_CONTROL_STATUS:
73290eb1077SAndy Ritger             *pAddrReg = NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS;
73390eb1077SAndy Ritger             break;
73491676d66SBernhard Stoeckner         case BUS_OPTIONS_DEV_CONTROL_STATUS_2:
73591676d66SBernhard Stoeckner             *pAddrReg = NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS_2;
73691676d66SBernhard Stoeckner             break;
73790eb1077SAndy Ritger         case BUS_OPTIONS_LINK_CONTROL_STATUS:
73890eb1077SAndy Ritger             *pAddrReg = NV_EP_PCFG_GPU_LINK_CONTROL_STATUS;
73990eb1077SAndy Ritger             break;
74090eb1077SAndy Ritger         case BUS_OPTIONS_LINK_CAPABILITIES:
74190eb1077SAndy Ritger             *pAddrReg = NV_EP_PCFG_GPU_LINK_CAPABILITIES;
74290eb1077SAndy Ritger             break;
74391676d66SBernhard Stoeckner         case BUS_OPTIONS_L1_PM_SUBSTATES_CTRL_1:
74491676d66SBernhard Stoeckner             *pAddrReg = NV_EP_PCFG_GPU_L1_PM_SS_CONTROL_1_REGISTER;
74591676d66SBernhard Stoeckner             break;
74690eb1077SAndy Ritger         default:
74790eb1077SAndy Ritger             NV_PRINTF(LEVEL_ERROR, "Invalid register type passed 0x%x\n",
74890eb1077SAndy Ritger                       options);
74990eb1077SAndy Ritger             status = NV_ERR_GENERIC;
75090eb1077SAndy Ritger             break;
75190eb1077SAndy Ritger     }
75290eb1077SAndy Ritger     return status;
75390eb1077SAndy Ritger }
75490eb1077SAndy Ritger 
75526458140SAndy Ritger /*!
75691676d66SBernhard Stoeckner  * @brief Helper function for _kbifSavePcieConfigRegisters_GH100()
75791676d66SBernhard Stoeckner  *
75891676d66SBernhard Stoeckner  * @param[in]  pGpu         GPU object pointer
75991676d66SBernhard Stoeckner  * @param[in]  pKernelBif  Kernel BIF object pointer
76091676d66SBernhard Stoeckner  * @param[in]  pRegmapRef   Pointer to XVE Register map structure
76191676d66SBernhard Stoeckner  *
76291676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
76391676d66SBernhard Stoeckner  */
76491676d66SBernhard Stoeckner static NV_STATUS
_kbifSavePcieConfigRegisters_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,const PKBIF_XVE_REGMAP_REF pRegmapRef)76591676d66SBernhard Stoeckner _kbifSavePcieConfigRegisters_GH100
76691676d66SBernhard Stoeckner (
76791676d66SBernhard Stoeckner     OBJGPU    *pGpu,
76891676d66SBernhard Stoeckner     KernelBif *pKernelBif,
76991676d66SBernhard Stoeckner     const PKBIF_XVE_REGMAP_REF pRegmapRef
77091676d66SBernhard Stoeckner )
77191676d66SBernhard Stoeckner {
77291676d66SBernhard Stoeckner     NV_STATUS status;
77391676d66SBernhard Stoeckner     NvU32     regOffset;
77491676d66SBernhard Stoeckner     NvU32     bufOffset = 0;
77591676d66SBernhard Stoeckner 
77691676d66SBernhard Stoeckner     // Read and save entire config space
77791676d66SBernhard Stoeckner     for (regOffset = 0x0; regOffset < PCIE_CONFIG_SPACE_MAX_SIZE; regOffset+=0x4)
77891676d66SBernhard Stoeckner     {
77991676d66SBernhard Stoeckner         status = GPU_BUS_CFG_CYCLE_RD32(pGpu, regOffset,
78091676d66SBernhard Stoeckner                                         &pRegmapRef->bufBootConfigSpace[bufOffset]);
78191676d66SBernhard Stoeckner         if (status != NV_OK)
78291676d66SBernhard Stoeckner         {
78391676d66SBernhard Stoeckner             NV_PRINTF(LEVEL_ERROR, "Config read failed.\n");
78491676d66SBernhard Stoeckner             return status;
78591676d66SBernhard Stoeckner         }
78691676d66SBernhard Stoeckner         bufOffset++;
78791676d66SBernhard Stoeckner     }
78891676d66SBernhard Stoeckner 
78991676d66SBernhard Stoeckner     pKernelBif->setProperty(pKernelBif, PDB_PROP_KBIF_SECONDARY_BUS_RESET_SUPPORTED, NV_TRUE);
79091676d66SBernhard Stoeckner 
79191676d66SBernhard Stoeckner     return NV_OK;
79291676d66SBernhard Stoeckner }
79391676d66SBernhard Stoeckner 
79491676d66SBernhard Stoeckner /*!
79591676d66SBernhard Stoeckner  * @brief Helper function for _kbifRestorePcieConfigRegisters_GH100
79691676d66SBernhard Stoeckner  *
79791676d66SBernhard Stoeckner  * @param[in]  pGpu         GPU object pointer
79891676d66SBernhard Stoeckner  * @param[in]  pKernelBif  Kernel BIF object pointer
79991676d66SBernhard Stoeckner  * @param[in]  pRegmapRef   Pointer to XVE Register map structure
80091676d66SBernhard Stoeckner  *
80191676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
80291676d66SBernhard Stoeckner  */
80391676d66SBernhard Stoeckner static NV_STATUS
_kbifRestorePcieConfigRegisters_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,const PKBIF_XVE_REGMAP_REF pRegmapRef)80491676d66SBernhard Stoeckner _kbifRestorePcieConfigRegisters_GH100
80591676d66SBernhard Stoeckner (
80691676d66SBernhard Stoeckner     OBJGPU    *pGpu,
80791676d66SBernhard Stoeckner     KernelBif *pKernelBif,
80891676d66SBernhard Stoeckner     const PKBIF_XVE_REGMAP_REF pRegmapRef
80991676d66SBernhard Stoeckner )
81091676d66SBernhard Stoeckner {
81191676d66SBernhard Stoeckner     NvU32     domain    = gpuGetDomain(pGpu);
81291676d66SBernhard Stoeckner     NvU8      bus       = gpuGetBus(pGpu);
81391676d66SBernhard Stoeckner     NvU8      device    = gpuGetDevice(pGpu);
81491676d66SBernhard Stoeckner     void      *pHandle;
81591676d66SBernhard Stoeckner     NvU32     regOffset;
81691676d66SBernhard Stoeckner     NvU32     bufOffset = 0;
81791676d66SBernhard Stoeckner     NV_STATUS status;
81891676d66SBernhard Stoeckner 
81991676d66SBernhard Stoeckner     pHandle = osPciInitHandle(domain, bus, device, 0, NULL, NULL);
82091676d66SBernhard Stoeckner     NV_ASSERT_OR_RETURN(pHandle, NV_ERR_INVALID_POINTER);
82191676d66SBernhard Stoeckner 
82291676d66SBernhard Stoeckner     // Restore entire config space
82391676d66SBernhard Stoeckner     for (regOffset = 0x0; regOffset < PCIE_CONFIG_SPACE_MAX_SIZE; regOffset+=0x4)
82491676d66SBernhard Stoeckner     {
82591676d66SBernhard Stoeckner         status = GPU_BUS_CFG_CYCLE_WR32(pGpu, regOffset,
82691676d66SBernhard Stoeckner                      pRegmapRef->bufBootConfigSpace[bufOffset]);
82791676d66SBernhard Stoeckner         if (status != NV_OK)
82891676d66SBernhard Stoeckner         {
82991676d66SBernhard Stoeckner             NV_PRINTF(LEVEL_ERROR, "Config write failed.\n");
83091676d66SBernhard Stoeckner             NV_ASSERT(0);
83191676d66SBernhard Stoeckner             return status;
83291676d66SBernhard Stoeckner         }
83391676d66SBernhard Stoeckner         bufOffset++;
83491676d66SBernhard Stoeckner     }
83591676d66SBernhard Stoeckner 
83691676d66SBernhard Stoeckner     return NV_OK;
83791676d66SBernhard Stoeckner }
83891676d66SBernhard Stoeckner 
83991676d66SBernhard Stoeckner /*!
84091676d66SBernhard Stoeckner  * @brief  Helper function saves MSIX vector control masks
84191676d66SBernhard Stoeckner  *
84291676d66SBernhard Stoeckner  * @param[in]  pGpu         GPU object pointer
84391676d66SBernhard Stoeckner  * @param[in]  pKernelBif   KernelBif object pointer
84491676d66SBernhard Stoeckner  *
84591676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
84691676d66SBernhard Stoeckner  */
84791676d66SBernhard Stoeckner NV_STATUS
kbifSaveMsixTable_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)84891676d66SBernhard Stoeckner kbifSaveMsixTable_GH100
84991676d66SBernhard Stoeckner (
85091676d66SBernhard Stoeckner     OBJGPU    *pGpu,
85191676d66SBernhard Stoeckner     KernelBif *pKernelBif
85291676d66SBernhard Stoeckner )
85391676d66SBernhard Stoeckner {
85491676d66SBernhard Stoeckner     NvU32 i;
85591676d66SBernhard Stoeckner     NvU32 controlSize = kbifGetMSIXTableVectorControlSize_HAL(pGpu, pKernelBif);
85691676d66SBernhard Stoeckner 
85791676d66SBernhard Stoeckner     for (i = 0U; i < controlSize; i++)
85891676d66SBernhard Stoeckner     {
85991676d66SBernhard Stoeckner         // Each MSIX table entry is 4 NvU32s
86091676d66SBernhard Stoeckner         pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 0] = GPU_VREG_RD32(pGpu, NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_LO(i));
86191676d66SBernhard Stoeckner         pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 1] = GPU_VREG_RD32(pGpu, NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_HI(i));
86291676d66SBernhard Stoeckner         pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 2] = GPU_VREG_RD32(pGpu, NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_DATA(i));
86391676d66SBernhard Stoeckner         pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 3] = GPU_VREG_RD32(pGpu, NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL(i));
86491676d66SBernhard Stoeckner     }
86591676d66SBernhard Stoeckner 
86691676d66SBernhard Stoeckner     return NV_OK;
86791676d66SBernhard Stoeckner }
86891676d66SBernhard Stoeckner 
86991676d66SBernhard Stoeckner /*!
87091676d66SBernhard Stoeckner  * @brief  Helper function to restore MSIX vector control masks
87191676d66SBernhard Stoeckner  *
87291676d66SBernhard Stoeckner  * @param[in]  pGpu         GPU object pointer
87391676d66SBernhard Stoeckner  * @param[in]  pKernelBif   KernelBif object pointer
87491676d66SBernhard Stoeckner  *
87591676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
87691676d66SBernhard Stoeckner  */
87791676d66SBernhard Stoeckner NV_STATUS
kbifRestoreMsixTable_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)87891676d66SBernhard Stoeckner kbifRestoreMsixTable_GH100
87991676d66SBernhard Stoeckner (
88091676d66SBernhard Stoeckner     OBJGPU    *pGpu,
88191676d66SBernhard Stoeckner     KernelBif *pKernelBif
88291676d66SBernhard Stoeckner )
88391676d66SBernhard Stoeckner {
88491676d66SBernhard Stoeckner     NvU32 i;
88591676d66SBernhard Stoeckner     NvU32 controlSize = kbifGetMSIXTableVectorControlSize_HAL(pGpu, pKernelBif);
88691676d66SBernhard Stoeckner 
88791676d66SBernhard Stoeckner     // Initialize the base offset for the virtual registers for physical function
88891676d66SBernhard Stoeckner     NvU32 vRegOffset = pGpu->sriovState.virtualRegPhysOffset;
88991676d66SBernhard Stoeckner 
89091676d66SBernhard Stoeckner     // In FLR path, we don't want to use usual register r/w macros
89191676d66SBernhard Stoeckner     for (i = 0U; i < controlSize; i++)
89291676d66SBernhard Stoeckner     {
89391676d66SBernhard Stoeckner         // Each MSIX table entry is 4 NvU32s
89491676d66SBernhard Stoeckner         osGpuWriteReg032(pGpu, vRegOffset + NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_LO(i),        pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 0]);
89591676d66SBernhard Stoeckner         osGpuWriteReg032(pGpu, vRegOffset + NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_ADDR_HI(i),        pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 1]);
89691676d66SBernhard Stoeckner         osGpuWriteReg032(pGpu, vRegOffset + NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_DATA(i),           pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 2]);
89791676d66SBernhard Stoeckner         osGpuWriteReg032(pGpu, vRegOffset + NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL(i), pKernelBif->xveRegmapRef[0].bufMsixTable[(i*4) + 3]);
89891676d66SBernhard Stoeckner     }
89991676d66SBernhard Stoeckner 
90091676d66SBernhard Stoeckner     return NV_OK;
90191676d66SBernhard Stoeckner }
90291676d66SBernhard Stoeckner 
90391676d66SBernhard Stoeckner /*!
90491676d66SBernhard Stoeckner  * @brief Wait for to get config access.
90591676d66SBernhard Stoeckner  *
90691676d66SBernhard Stoeckner  * @param[in]  pGpu     GPU object pointer
90791676d66SBernhard Stoeckner  * @param[in]  pKernelBif  Kernel BIF object pointer
90891676d66SBernhard Stoeckner  * @param[in]  pTimeout Value in microseconds to dev init complete
90991676d66SBernhard Stoeckner  *
91091676d66SBernhard Stoeckner  * @return  NV_OK if successful.
91191676d66SBernhard Stoeckner  */
91291676d66SBernhard Stoeckner NV_STATUS
kbifConfigAccessWait_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,RMTIMEOUT * pTimeout)91391676d66SBernhard Stoeckner kbifConfigAccessWait_GH100
91491676d66SBernhard Stoeckner (
91591676d66SBernhard Stoeckner     OBJGPU    *pGpu,
91691676d66SBernhard Stoeckner     KernelBif *pKernelBif,
91791676d66SBernhard Stoeckner     RMTIMEOUT *pTimeout
91891676d66SBernhard Stoeckner )
91991676d66SBernhard Stoeckner {
92091676d66SBernhard Stoeckner     NvU32     regVal = 0;
92191676d66SBernhard Stoeckner     NV_STATUS status = NV_OK;
92291676d66SBernhard Stoeckner 
92391676d66SBernhard Stoeckner     while (NV_TRUE)
92491676d66SBernhard Stoeckner     {
92591676d66SBernhard Stoeckner         //
92691676d66SBernhard Stoeckner         // This read only register should be accessible over config cycle
92791676d66SBernhard Stoeckner         // once devinit is complete without RM having to restore config space.
92891676d66SBernhard Stoeckner         // This register is not really reset on FLR.
92991676d66SBernhard Stoeckner         //
93091676d66SBernhard Stoeckner         if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_ID, &regVal) == NV_OK)
93191676d66SBernhard Stoeckner         {
93291676d66SBernhard Stoeckner             if (FLD_TEST_DRF(_EP_PCFG_GPU, _ID, _VENDOR, _NVIDIA, regVal))
93391676d66SBernhard Stoeckner             {
93491676d66SBernhard Stoeckner                 break;
93591676d66SBernhard Stoeckner             }
93691676d66SBernhard Stoeckner         }
93791676d66SBernhard Stoeckner         status = gpuCheckTimeout(pGpu, pTimeout);
93891676d66SBernhard Stoeckner 
93991676d66SBernhard Stoeckner         if (status == NV_ERR_TIMEOUT)
94091676d66SBernhard Stoeckner         {
94191676d66SBernhard Stoeckner             NV_ASSERT_FAILED("Timed out waiting for devinit to complete\n");
94291676d66SBernhard Stoeckner             return status;
94391676d66SBernhard Stoeckner         }
94491676d66SBernhard Stoeckner         //
94591676d66SBernhard Stoeckner         // Put ourself into wait state for 1ms. This function runs in the context
94691676d66SBernhard Stoeckner         // of DxgkDdiResetFromTimeout which is at PASSIVE_LEVEL(lower priority)
94791676d66SBernhard Stoeckner         // which means it can be in wait state for longer delays of the order of
94891676d66SBernhard Stoeckner         // milliseconds
94991676d66SBernhard Stoeckner         //
95091676d66SBernhard Stoeckner         osDelay(1);
95191676d66SBernhard Stoeckner     }
95291676d66SBernhard Stoeckner 
95391676d66SBernhard Stoeckner     return status;
95491676d66SBernhard Stoeckner }
95591676d66SBernhard Stoeckner 
95691676d66SBernhard Stoeckner /*!
95791676d66SBernhard Stoeckner  * @brief Do function level reset for Fn0 of GPU
95891676d66SBernhard Stoeckner  *
95991676d66SBernhard Stoeckner  * @param[in]  pGpu  GPU object pointer
96091676d66SBernhard Stoeckner  * @param[in]  pKernelBif  Kernel BIF object pointer
96191676d66SBernhard Stoeckner  *
96291676d66SBernhard Stoeckner  * @return  NV_OK if successful
96391676d66SBernhard Stoeckner  */
96491676d66SBernhard Stoeckner NV_STATUS
kbifDoFunctionLevelReset_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)96591676d66SBernhard Stoeckner kbifDoFunctionLevelReset_GH100
96691676d66SBernhard Stoeckner (
96791676d66SBernhard Stoeckner     OBJGPU *pGpu,
96891676d66SBernhard Stoeckner     KernelBif *pKernelBif
96991676d66SBernhard Stoeckner )
97091676d66SBernhard Stoeckner {
97191676d66SBernhard Stoeckner     NvBool     bMSIXEnabled;
97291676d66SBernhard Stoeckner     RMTIMEOUT  timeout;
97391676d66SBernhard Stoeckner     NV_STATUS  status = NV_OK;
97491676d66SBernhard Stoeckner     NvU32      flrDevInitTimeout;
97591676d66SBernhard Stoeckner     NvU32      flrDevInitTimeoutScale = pKernelBif->flrDevInitTimeoutScale;
97691676d66SBernhard Stoeckner 
97791676d66SBernhard Stoeckner     // If this is non-windows platform or non-ESXi, we already use OS based interface
97891676d66SBernhard Stoeckner     {
97991676d66SBernhard Stoeckner         pKernelBif->bInFunctionLevelReset = NV_TRUE;
98091676d66SBernhard Stoeckner         status = osDoFunctionLevelReset(pGpu);
98191676d66SBernhard Stoeckner         if (status != NV_OK)
98291676d66SBernhard Stoeckner         {
98391676d66SBernhard Stoeckner             NV_ASSERT_FAILED("osDoFunctionLevelReset failed!\n");
98491676d66SBernhard Stoeckner         }
98591676d66SBernhard Stoeckner         goto kbifDoFunctionLevelReset_GH100_exit;
98691676d66SBernhard Stoeckner     }
98791676d66SBernhard Stoeckner 
98891676d66SBernhard Stoeckner     pKernelBif->bPreparingFunctionLevelReset = NV_TRUE;
98991676d66SBernhard Stoeckner     status = kbifSavePcieConfigRegisters_HAL(pGpu, pKernelBif);
99091676d66SBernhard Stoeckner     if (status != NV_OK)
99191676d66SBernhard Stoeckner     {
99291676d66SBernhard Stoeckner         NV_ASSERT_FAILED("Config registers save failed!\n");
99391676d66SBernhard Stoeckner         goto kbifDoFunctionLevelReset_GH100_exit;
99491676d66SBernhard Stoeckner     }
99591676d66SBernhard Stoeckner 
99691676d66SBernhard Stoeckner     bMSIXEnabled = kbifIsMSIXEnabledInHW_HAL(pGpu, pKernelBif);
99791676d66SBernhard Stoeckner 
99891676d66SBernhard Stoeckner     if (bMSIXEnabled)
99991676d66SBernhard Stoeckner     {
100091676d66SBernhard Stoeckner         status = kbifSaveMsixTable_HAL(pGpu, pKernelBif);
100191676d66SBernhard Stoeckner         if (status != NV_OK)
100291676d66SBernhard Stoeckner         {
100391676d66SBernhard Stoeckner             NV_ASSERT_FAILED("MSIX Table save failed!\n");
100491676d66SBernhard Stoeckner             goto kbifDoFunctionLevelReset_GH100_exit;
100591676d66SBernhard Stoeckner         }
100691676d66SBernhard Stoeckner     }
100791676d66SBernhard Stoeckner 
100891676d66SBernhard Stoeckner     // Once we save required registers, we are done with prep. phase for FLR
100991676d66SBernhard Stoeckner     pKernelBif->bPreparingFunctionLevelReset = NV_FALSE;
101091676d66SBernhard Stoeckner 
101191676d66SBernhard Stoeckner     // Trigger FLR now
101291676d66SBernhard Stoeckner     status = kbifTriggerFlr_HAL(pGpu, pKernelBif);
101391676d66SBernhard Stoeckner 
101491676d66SBernhard Stoeckner     if (status != NV_OK)
101591676d66SBernhard Stoeckner     {
101691676d66SBernhard Stoeckner         goto kbifDoFunctionLevelReset_GH100_exit;
101791676d66SBernhard Stoeckner     }
101891676d66SBernhard Stoeckner 
101991676d66SBernhard Stoeckner     pKernelBif->bInFunctionLevelReset = NV_TRUE;
102091676d66SBernhard Stoeckner 
102191676d66SBernhard Stoeckner     //
102291676d66SBernhard Stoeckner     // Wait for 10ms on Silicon for reset to propagate. Actually, HW is
102391676d66SBernhard Stoeckner     // supposed to return CRS status for config requests until config
102491676d66SBernhard Stoeckner     // space is not ready but we do expect at least 10ms for it to be ready
102591676d66SBernhard Stoeckner     // so why poll? On RTL and emulation, CPU clocks don't scale to GPU clock
102691676d66SBernhard Stoeckner     // so don't wait.
102791676d66SBernhard Stoeckner     //
102891676d66SBernhard Stoeckner     if (IS_SILICON(pGpu))
102991676d66SBernhard Stoeckner     {
103091676d66SBernhard Stoeckner         osDelayUs(10000);
103191676d66SBernhard Stoeckner     }
103291676d66SBernhard Stoeckner 
103391676d66SBernhard Stoeckner     // flrTimeoutScale is regkey based for easy debugging
103491676d66SBernhard Stoeckner     flrDevInitTimeout = BIF_FLR_DEVINIT_COMPLETION_TIMEOUT_DEFAULT *
103591676d66SBernhard Stoeckner                         flrDevInitTimeoutScale;
103691676d66SBernhard Stoeckner 
103791676d66SBernhard Stoeckner     //
103891676d66SBernhard Stoeckner     // After CRS_TIMEOUT, HW will auto-clear SEND_CRS bit which means config cycles
103991676d66SBernhard Stoeckner     // will succeed but it is still possible that devinit is not complete yet.
104091676d66SBernhard Stoeckner     // OS won't have a way to check that anyway but RM should do that here.
104191676d66SBernhard Stoeckner     // TODO: Should we use this loop or just the PCI spec-defined 100ms delay
104291676d66SBernhard Stoeckner     // now that we have a devinit wait in fspWaitForSecureBoot_HAL below?
104391676d66SBernhard Stoeckner     //
104491676d66SBernhard Stoeckner     gpuSetTimeout(pGpu, flrDevInitTimeout, &timeout, GPU_TIMEOUT_FLAGS_OSTIMER);
104591676d66SBernhard Stoeckner 
104691676d66SBernhard Stoeckner     status = kbifConfigAccessWait_HAL(pGpu, pKernelBif, &timeout);
104791676d66SBernhard Stoeckner 
104891676d66SBernhard Stoeckner     if (status != NV_OK)
104991676d66SBernhard Stoeckner     {
105091676d66SBernhard Stoeckner         NV_ASSERT_FAILED("Timed out waiting for devinit to complete\n");
105191676d66SBernhard Stoeckner         goto kbifDoFunctionLevelReset_GH100_exit;
105291676d66SBernhard Stoeckner     }
105391676d66SBernhard Stoeckner 
105491676d66SBernhard Stoeckner     status = kbifRestorePcieConfigRegisters_HAL(pGpu, pKernelBif);
105591676d66SBernhard Stoeckner     if (status != NV_OK)
105691676d66SBernhard Stoeckner     {
105791676d66SBernhard Stoeckner         NV_ASSERT_FAILED("Config registers restore failed!\n");
105891676d66SBernhard Stoeckner         goto kbifDoFunctionLevelReset_GH100_exit;
105991676d66SBernhard Stoeckner     }
106091676d66SBernhard Stoeckner 
106191676d66SBernhard Stoeckner     // As of GH100, miata rom cannot be run on simulation.
106291676d66SBernhard Stoeckner     if (IS_SILICON(pGpu) || IS_EMULATION(pGpu))
106391676d66SBernhard Stoeckner     {
106491676d66SBernhard Stoeckner         // On emulation VBIOS boot can take long so add prints for better visibility
106591676d66SBernhard Stoeckner         if (IS_EMULATION(pGpu))
106691676d66SBernhard Stoeckner         {
106791676d66SBernhard Stoeckner             NV_PRINTF(LEVEL_ERROR, "Entering secure boot completion wait.\n");
106891676d66SBernhard Stoeckner         }
106991676d66SBernhard Stoeckner 
107091676d66SBernhard Stoeckner         status = NV_ERR_NOT_SUPPORTED;
107191676d66SBernhard Stoeckner         if (status != NV_OK)
107291676d66SBernhard Stoeckner         {
107391676d66SBernhard Stoeckner             DBG_BREAKPOINT();
107491676d66SBernhard Stoeckner             NV_PRINTF(LEVEL_ERROR, "VBIOS boot failed!!\n");
107591676d66SBernhard Stoeckner             goto kbifDoFunctionLevelReset_GH100_exit;
107691676d66SBernhard Stoeckner         }
107791676d66SBernhard Stoeckner 
107891676d66SBernhard Stoeckner         if (IS_EMULATION(pGpu))
107991676d66SBernhard Stoeckner         {
108091676d66SBernhard Stoeckner             NV_PRINTF(LEVEL_ERROR,
108191676d66SBernhard Stoeckner                       "Exited secure boot completion wait with status = NV_OK.\n");
108291676d66SBernhard Stoeckner         }
108391676d66SBernhard Stoeckner     }
108491676d66SBernhard Stoeckner 
108591676d66SBernhard Stoeckner     if (bMSIXEnabled)
108691676d66SBernhard Stoeckner     {
108791676d66SBernhard Stoeckner         // TODO-NM: Check if this needed for other NVPM flows like GC6
108891676d66SBernhard Stoeckner         status = kbifRestoreMsixTable_HAL(pGpu, pKernelBif);
108991676d66SBernhard Stoeckner         if (status != NV_OK)
109091676d66SBernhard Stoeckner         {
109191676d66SBernhard Stoeckner             NV_ASSERT_FAILED("MSIX Table save failed!\n");
109291676d66SBernhard Stoeckner         }
109391676d66SBernhard Stoeckner     }
109491676d66SBernhard Stoeckner 
109591676d66SBernhard Stoeckner kbifDoFunctionLevelReset_GH100_exit:
109691676d66SBernhard Stoeckner     pKernelBif->bPreparingFunctionLevelReset = NV_FALSE;
109791676d66SBernhard Stoeckner     pKernelBif->bInFunctionLevelReset        = NV_FALSE;
109891676d66SBernhard Stoeckner 
109991676d66SBernhard Stoeckner     return status;
110091676d66SBernhard Stoeckner }
110191676d66SBernhard Stoeckner 
110291676d66SBernhard Stoeckner 
110391676d66SBernhard Stoeckner /*!
1104b5bf85a8SAndy Ritger  * @brief Returns size of MSIX vector control table
1105b5bf85a8SAndy Ritger  *
1106b5bf85a8SAndy Ritger  * @param  pGpu  OBJGPU pointer
1107b5bf85a8SAndy Ritger  * @param  pKernelBif  Kernel BIF object pointer
1108b5bf85a8SAndy Ritger  */
1109b5bf85a8SAndy Ritger NvU32
kbifGetMSIXTableVectorControlSize_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1110b5bf85a8SAndy Ritger kbifGetMSIXTableVectorControlSize_GH100
1111b5bf85a8SAndy Ritger (
1112b5bf85a8SAndy Ritger     OBJGPU *pGpu,
1113b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1114b5bf85a8SAndy Ritger )
1115b5bf85a8SAndy Ritger {
1116b5bf85a8SAndy Ritger     return NV_VIRTUAL_FUNCTION_PRIV_MSIX_TABLE_VECTOR_CONTROL__SIZE_1;
1117b5bf85a8SAndy Ritger }
1118b5bf85a8SAndy Ritger 
1119b5bf85a8SAndy Ritger /*!
1120b5bf85a8SAndy Ritger  * @brief Check and cache Function level reset support
1121b5bf85a8SAndy Ritger  *
1122b5bf85a8SAndy Ritger  * @param[in]  pGpu        GPU object pointer
1123b5bf85a8SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
1124b5bf85a8SAndy Ritger  *
1125b5bf85a8SAndy Ritger  */
1126b5bf85a8SAndy Ritger void
kbifCacheFlrSupport_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1127b5bf85a8SAndy Ritger kbifCacheFlrSupport_GH100
1128b5bf85a8SAndy Ritger (
1129b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1130b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1131b5bf85a8SAndy Ritger )
1132b5bf85a8SAndy Ritger {
1133b5bf85a8SAndy Ritger     NvU32 regVal = 0;
1134b5bf85a8SAndy Ritger 
1135b5bf85a8SAndy Ritger     // Read config register
1136b5bf85a8SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CAPABILITIES,
1137b5bf85a8SAndy Ritger                                &regVal) != NV_OK)
1138b5bf85a8SAndy Ritger     {
1139b5bf85a8SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_DEVICE_CAPABILITIES\n");
1140b5bf85a8SAndy Ritger         return;
1141b5bf85a8SAndy Ritger     }
1142b5bf85a8SAndy Ritger 
1143b5bf85a8SAndy Ritger     // Check if FLR is supported
1144b5bf85a8SAndy Ritger     if (FLD_TEST_DRF(_EP_PCFG_GPU, _DEVICE_CAPABILITIES, _FUNCTION_LEVEL_RESET_CAPABILITY,
1145b5bf85a8SAndy Ritger                      _SUPPORTED, regVal))
1146b5bf85a8SAndy Ritger     {
1147b5bf85a8SAndy Ritger         pKernelBif->setProperty(pKernelBif, PDB_PROP_KBIF_FLR_SUPPORTED, NV_TRUE);
1148b5bf85a8SAndy Ritger     }
1149b5bf85a8SAndy Ritger }
1150b5bf85a8SAndy Ritger 
1151b5bf85a8SAndy Ritger /*!
1152b5bf85a8SAndy Ritger  * @brief Check and cache 64b BAR0 support
1153b5bf85a8SAndy Ritger  *
1154b5bf85a8SAndy Ritger  * @param[in]  pGpu        GPU object pointer
1155b5bf85a8SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
1156b5bf85a8SAndy Ritger  *
1157b5bf85a8SAndy Ritger  */
1158b5bf85a8SAndy Ritger void
kbifCache64bBar0Support_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1159b5bf85a8SAndy Ritger kbifCache64bBar0Support_GH100
1160b5bf85a8SAndy Ritger (
1161b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1162b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1163b5bf85a8SAndy Ritger )
1164b5bf85a8SAndy Ritger {
1165b5bf85a8SAndy Ritger     NvU32 regVal = 0;
1166b5bf85a8SAndy Ritger 
1167b5bf85a8SAndy Ritger     // Read config register
1168b5bf85a8SAndy Ritger     if (GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_BARREG0,
1169b5bf85a8SAndy Ritger                                &regVal) != NV_OK)
1170b5bf85a8SAndy Ritger     {
1171b5bf85a8SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_BARREG0\n");
1172b5bf85a8SAndy Ritger         return;
1173b5bf85a8SAndy Ritger     }
1174b5bf85a8SAndy Ritger 
1175b5bf85a8SAndy Ritger     // Check if 64b BAR0 is supported
1176b5bf85a8SAndy Ritger     if (FLD_TEST_DRF(_EP_PCFG_GPU, _BARREG0, _REG_ADDR_TYPE,
1177b5bf85a8SAndy Ritger                      _64BIT, regVal))
1178b5bf85a8SAndy Ritger     {
1179b5bf85a8SAndy Ritger         pKernelBif->setProperty(pKernelBif, PDB_PROP_KBIF_64BIT_BAR0_SUPPORTED, NV_TRUE);
1180b5bf85a8SAndy Ritger     }
1181b5bf85a8SAndy Ritger }
1182b5bf85a8SAndy Ritger 
1183b5bf85a8SAndy Ritger /*!
118426458140SAndy Ritger  * @brief: Get BAR information from PCIe config space
118526458140SAndy Ritger  *
118626458140SAndy Ritger  * @param[in]  pGpu               OBJGPU pointer
118726458140SAndy Ritger  * @param[in]  barRegCSBase       The base register 0 address
118826458140SAndy Ritger  * @param[in]  barIndex           The BAR index to check
118926458140SAndy Ritger  * @param[out] pBarBaseAddress    The start address of the specified BAR
119026458140SAndy Ritger  * @param[out] pIs64BitBar        To indicate if the BAR is using 64bit address
119126458140SAndy Ritger  *
119226458140SAndy Ritger  * @returns NV_STATUS
119326458140SAndy Ritger  */
119426458140SAndy Ritger static NV_STATUS
_kbifGetBarInfo_GH100(OBJGPU * pGpu,NvU32 barRegCSBase,NvU32 barIndex,NvU64 * pBarBaseAddress,NvBool * pIs64BitBar)119526458140SAndy Ritger _kbifGetBarInfo_GH100
119626458140SAndy Ritger (
119726458140SAndy Ritger     OBJGPU    *pGpu,
119826458140SAndy Ritger     NvU32      barRegCSBase,
119926458140SAndy Ritger     NvU32      barIndex,
120026458140SAndy Ritger     NvU64     *pBarBaseAddress,
120126458140SAndy Ritger     NvBool    *pIs64BitBar
120226458140SAndy Ritger )
120326458140SAndy Ritger {
120426458140SAndy Ritger     NV_STATUS status         = NV_OK;
120526458140SAndy Ritger     NvBool    barIs64Bit     = NV_FALSE;
120626458140SAndy Ritger     NvU32     barAddrLow     = 0;
120726458140SAndy Ritger     NvU32     barAddrHigh    = 0;
120826458140SAndy Ritger     NvU32     barRegCSLimit  = barRegCSBase + NV_EP_PCFG_GPU_BARREG5 - NV_EP_PCFG_GPU_BARREG0;
120926458140SAndy Ritger     NvU32     barRegCSOffset = barRegCSBase;
121026458140SAndy Ritger     NvU64     barBaseAddr    = 0;
121126458140SAndy Ritger     NvU32     i              = 0;
121226458140SAndy Ritger 
121326458140SAndy Ritger     for (i = 0; i <= barIndex; i++)
121426458140SAndy Ritger     {
121526458140SAndy Ritger         if ((status = GPU_BUS_CFG_CYCLE_RD32(pGpu, barRegCSOffset, &barAddrLow)) != NV_OK)
121626458140SAndy Ritger         {
121726458140SAndy Ritger             return status;
121826458140SAndy Ritger         }
121926458140SAndy Ritger 
122026458140SAndy Ritger         //
122126458140SAndy Ritger         // The SPACE_TYPE, ADDRESS_TYPE, PREFETCHABLE and BASE_ADDRESS fields
122226458140SAndy Ritger         // have the same definition as for Base Address Register 0
122326458140SAndy Ritger         //
122426458140SAndy Ritger         barIs64Bit = FLD_TEST_DRF(_EP_PCFG_GPU, _BARREG0, _REG_ADDR_TYPE, _64BIT, barAddrLow);
122526458140SAndy Ritger 
122626458140SAndy Ritger         if (i != barIndex)
122726458140SAndy Ritger         {
122826458140SAndy Ritger             barRegCSOffset += (barIs64Bit ? 8 : 4);
122926458140SAndy Ritger 
123026458140SAndy Ritger             if (barRegCSOffset >= barRegCSLimit)
123126458140SAndy Ritger             {
123226458140SAndy Ritger                 return NV_ERR_INVALID_INDEX;
123326458140SAndy Ritger             }
123426458140SAndy Ritger         }
123526458140SAndy Ritger     }
123626458140SAndy Ritger 
123726458140SAndy Ritger     if (pBarBaseAddress != NULL)
123826458140SAndy Ritger     {
123926458140SAndy Ritger         // Get the BAR address
124026458140SAndy Ritger         barBaseAddr = barAddrLow & 0xFFFFFFF0;
124126458140SAndy Ritger         if (barIs64Bit)
124226458140SAndy Ritger         {
124326458140SAndy Ritger             // Read and save the bar high address
124426458140SAndy Ritger             status = GPU_BUS_CFG_CYCLE_RD32(pGpu, barRegCSOffset + 4, &barAddrHigh);
124526458140SAndy Ritger             NV_ASSERT_OR_RETURN((status == NV_OK), status);
124626458140SAndy Ritger 
124726458140SAndy Ritger             barBaseAddr |= (NvU64)barAddrHigh << 32;
124826458140SAndy Ritger         }
124926458140SAndy Ritger 
125026458140SAndy Ritger         *pBarBaseAddress = barBaseAddr;
125126458140SAndy Ritger     }
125226458140SAndy Ritger 
125326458140SAndy Ritger     if (pIs64BitBar != NULL)
125426458140SAndy Ritger     {
125526458140SAndy Ritger         *pIs64BitBar = barIs64Bit;
125626458140SAndy Ritger     }
125726458140SAndy Ritger 
125826458140SAndy Ritger     return NV_OK;
125926458140SAndy Ritger }
126026458140SAndy Ritger 
126126458140SAndy Ritger 
126226458140SAndy Ritger /*! @brief Fetch VF details such as no. of VFs, First VF offset etc
126326458140SAndy Ritger  *
126426458140SAndy Ritger  * @param[in]  pGpu        GPU object pointer
126526458140SAndy Ritger  * @param[in]  pKernelBif  Kernel BIF object pointer
126626458140SAndy Ritger */
126726458140SAndy Ritger void
kbifCacheVFInfo_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)126826458140SAndy Ritger kbifCacheVFInfo_GH100
126926458140SAndy Ritger (
127026458140SAndy Ritger     OBJGPU    *pGpu,
127126458140SAndy Ritger     KernelBif *pKernelBif
127226458140SAndy Ritger )
127326458140SAndy Ritger {
127426458140SAndy Ritger     NV_STATUS status     = NV_OK;
127526458140SAndy Ritger     NvU32     regVal     = 0;
127626458140SAndy Ritger     NvU64     barAddr    = 0;
127726458140SAndy Ritger     NvBool    barIs64Bit = NV_FALSE;
127826458140SAndy Ritger 
127926458140SAndy Ritger     // Get total VF count
128026458140SAndy Ritger     status = GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_SRIOV_INIT_TOT_VF, &regVal);
128126458140SAndy Ritger     if (status != NV_OK)
128226458140SAndy Ritger     {
128326458140SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_SRIOV_INIT_TOT_VF\n");
128426458140SAndy Ritger         return;
128526458140SAndy Ritger     }
128626458140SAndy Ritger     pGpu->sriovState.totalVFs = GPU_DRF_VAL(_EP_PCFG_GPU, _SRIOV_INIT_TOT_VF,
128726458140SAndy Ritger                                             _TOTAL_VFS, regVal);
128826458140SAndy Ritger 
128926458140SAndy Ritger     // Get first VF offset
129026458140SAndy Ritger     status = GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_SRIOV_FIRST_VF_STRIDE, &regVal);
129126458140SAndy Ritger     if (status != NV_OK)
129226458140SAndy Ritger     {
129326458140SAndy Ritger         NV_PRINTF(LEVEL_ERROR, "Unable to read NV_EP_PCFG_GPU_SRIOV_FIRST_VF_STRIDE\n");
129426458140SAndy Ritger         return;
129526458140SAndy Ritger     }
129626458140SAndy Ritger     pGpu->sriovState.firstVFOffset = GPU_DRF_VAL(_EP_PCFG_GPU, _SRIOV_FIRST_VF_STRIDE,
129726458140SAndy Ritger                                                  _FIRST_VF_OFFSET, regVal);
129826458140SAndy Ritger 
129926458140SAndy Ritger     // Get VF BAR0 info
130026458140SAndy Ritger     status = _kbifGetBarInfo_GH100(pGpu, NV_EP_PCFG_GPU_VF_BAR0, 0, &barAddr, &barIs64Bit);
130126458140SAndy Ritger     NV_ASSERT(status == NV_OK);
130226458140SAndy Ritger 
130326458140SAndy Ritger     pGpu->sriovState.firstVFBarAddress[0] = barAddr;
130426458140SAndy Ritger     pGpu->sriovState.b64bitVFBar0         = barIs64Bit;
130526458140SAndy Ritger 
130626458140SAndy Ritger     // Get VF BAR1 info
130726458140SAndy Ritger     status = _kbifGetBarInfo_GH100(pGpu, NV_EP_PCFG_GPU_VF_BAR0, 1, &barAddr, &barIs64Bit);
130826458140SAndy Ritger     NV_ASSERT(status == NV_OK);
130926458140SAndy Ritger 
131026458140SAndy Ritger     pGpu->sriovState.firstVFBarAddress[1] = barAddr;
131126458140SAndy Ritger     pGpu->sriovState.b64bitVFBar1         = barIs64Bit;
131226458140SAndy Ritger 
131326458140SAndy Ritger     // Get VF BAR2 info
131426458140SAndy Ritger     status = _kbifGetBarInfo_GH100(pGpu, NV_EP_PCFG_GPU_VF_BAR0, 2, &barAddr, &barIs64Bit);
131526458140SAndy Ritger     NV_ASSERT(status == NV_OK);
131626458140SAndy Ritger 
131726458140SAndy Ritger     pGpu->sriovState.firstVFBarAddress[2] = barAddr;
131826458140SAndy Ritger     pGpu->sriovState.b64bitVFBar2         = barIs64Bit;
131926458140SAndy Ritger }
132026458140SAndy Ritger 
1321b5bf85a8SAndy Ritger /*!
1322b5bf85a8SAndy Ritger  * @brief Clears Bus Master Enable bit in command register, disabling
1323b5bf85a8SAndy Ritger  *  Function 0 - from issuing any new requests to sysmem.
1324b5bf85a8SAndy Ritger  *
1325b5bf85a8SAndy Ritger  * @param[in] pGpu        GPU object pointer
1326b5bf85a8SAndy Ritger  * @param[in] pKernelBif  KernelBif object pointer
1327b5bf85a8SAndy Ritger  *
1328b5bf85a8SAndy Ritger  * @return NV_OK
1329b5bf85a8SAndy Ritger  */
1330b5bf85a8SAndy Ritger NV_STATUS
kbifStopSysMemRequests_GH100(OBJGPU * pGpu,KernelBif * pKernelBif,NvBool bStop)1331b5bf85a8SAndy Ritger kbifStopSysMemRequests_GH100
1332b5bf85a8SAndy Ritger (
1333b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1334b5bf85a8SAndy Ritger     KernelBif *pKernelBif,
1335b5bf85a8SAndy Ritger     NvBool     bStop
1336b5bf85a8SAndy Ritger )
1337b5bf85a8SAndy Ritger {
1338b5bf85a8SAndy Ritger     NvU32 regVal;
1339b5bf85a8SAndy Ritger 
1340b5bf85a8SAndy Ritger     NV_ASSERT_OK_OR_RETURN(GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_CTRL_CMD_AND_STATUS,
1341b5bf85a8SAndy Ritger                                                   &regVal));
1342b5bf85a8SAndy Ritger 
1343b5bf85a8SAndy Ritger     if (bStop)
1344b5bf85a8SAndy Ritger     {
1345b5bf85a8SAndy Ritger         regVal = FLD_SET_DRF(_EP_PCFG_GPU, _CTRL_CMD_AND_STATUS, _CMD_BUS_MASTER, _DISABLE, regVal);
1346b5bf85a8SAndy Ritger     }
1347b5bf85a8SAndy Ritger     else
1348b5bf85a8SAndy Ritger     {
1349b5bf85a8SAndy Ritger         regVal = FLD_SET_DRF(_EP_PCFG_GPU, _CTRL_CMD_AND_STATUS, _CMD_BUS_MASTER, _ENABLE, regVal);
1350b5bf85a8SAndy Ritger     }
1351b5bf85a8SAndy Ritger 
1352b5bf85a8SAndy Ritger     NV_ASSERT_OK_OR_RETURN(GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_CTRL_CMD_AND_STATUS,
1353b5bf85a8SAndy Ritger                                                   regVal));
1354b5bf85a8SAndy Ritger 
1355b5bf85a8SAndy Ritger     return NV_OK;
1356b5bf85a8SAndy Ritger }
1357b5bf85a8SAndy Ritger 
1358b5bf85a8SAndy Ritger /*!
135991676d66SBernhard Stoeckner  * @brief Save boot time PCIe Config space
136091676d66SBernhard Stoeckner  *
136191676d66SBernhard Stoeckner  * @param[in]  pGpu     GPU object pointer
136291676d66SBernhard Stoeckner  * @param[in]  pBif     BIF object pointer
136391676d66SBernhard Stoeckner  *
136491676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
136591676d66SBernhard Stoeckner  */
136691676d66SBernhard Stoeckner NV_STATUS
kbifSavePcieConfigRegisters_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)136791676d66SBernhard Stoeckner kbifSavePcieConfigRegisters_GH100
136891676d66SBernhard Stoeckner (
136991676d66SBernhard Stoeckner     OBJGPU    *pGpu,
137091676d66SBernhard Stoeckner     KernelBif *pKernelBif
137191676d66SBernhard Stoeckner )
137291676d66SBernhard Stoeckner {
137391676d66SBernhard Stoeckner 
137491676d66SBernhard Stoeckner     NV_STATUS status = NV_OK;
137591676d66SBernhard Stoeckner 
137691676d66SBernhard Stoeckner     // Skip config save on FMODEL (200684952), move to regmap (200700271)
137791676d66SBernhard Stoeckner     if (IS_FMODEL(pGpu))
137891676d66SBernhard Stoeckner     {
137991676d66SBernhard Stoeckner         return NV_OK;
138091676d66SBernhard Stoeckner     }
138191676d66SBernhard Stoeckner 
138291676d66SBernhard Stoeckner     //
138391676d66SBernhard Stoeckner     // Save config space if GPU is about to enter Function Level Reset
138491676d66SBernhard Stoeckner     // OR if on non-windows platform, FORCE_PCIE_CONFIG_SAVE is set and SBR is
138591676d66SBernhard Stoeckner     //    enabled
138691676d66SBernhard Stoeckner     // OR if on windows platform, SBR is enabled
138791676d66SBernhard Stoeckner     //
138891676d66SBernhard Stoeckner     if (!pKernelBif->bPreparingFunctionLevelReset &&
138991676d66SBernhard Stoeckner         !((RMCFG_FEATURE_PLATFORM_WINDOWS ||
139091676d66SBernhard Stoeckner            pKernelBif->getProperty(pKernelBif, PDB_PROP_KBIF_FORCE_PCIE_CONFIG_SAVE)) &&
139191676d66SBernhard Stoeckner           pKernelBif->getProperty(pKernelBif, PDB_PROP_KBIF_SECONDARY_BUS_RESET_ENABLED)))
139291676d66SBernhard Stoeckner     {
139391676d66SBernhard Stoeckner         NV_PRINTF(LEVEL_ERROR, "Config space save has been skipped.\n");
139491676d66SBernhard Stoeckner         return NV_OK;
139591676d66SBernhard Stoeckner     }
139691676d66SBernhard Stoeckner 
139791676d66SBernhard Stoeckner     // Save pcie config space for function 0
139891676d66SBernhard Stoeckner     status = _kbifSavePcieConfigRegisters_GH100(pGpu, pKernelBif,
139991676d66SBernhard Stoeckner                                                 &pKernelBif->xveRegmapRef[0]);
140091676d66SBernhard Stoeckner     if (status != NV_OK)
140191676d66SBernhard Stoeckner     {
140291676d66SBernhard Stoeckner         NV_PRINTF(LEVEL_ERROR, "Saving PCIe config space failed for gpu.\n");
140391676d66SBernhard Stoeckner         NV_ASSERT(0);
140491676d66SBernhard Stoeckner         return status;
140591676d66SBernhard Stoeckner     }
140691676d66SBernhard Stoeckner 
140791676d66SBernhard Stoeckner     return status;
140891676d66SBernhard Stoeckner }
140991676d66SBernhard Stoeckner 
141091676d66SBernhard Stoeckner /*!
141191676d66SBernhard Stoeckner  * @brief Restore boot time PCIe Config space
141291676d66SBernhard Stoeckner  *
141391676d66SBernhard Stoeckner  * @param[in] pGpu  GPU object pointer
141491676d66SBernhard Stoeckner  * @param[in] pBif  BIF object pointer
141591676d66SBernhard Stoeckner  *
141691676d66SBernhard Stoeckner  * @return  'NV_OK' if successful, an RM error code otherwise.
141791676d66SBernhard Stoeckner  */
141891676d66SBernhard Stoeckner NV_STATUS
kbifRestorePcieConfigRegisters_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)141991676d66SBernhard Stoeckner kbifRestorePcieConfigRegisters_GH100
142091676d66SBernhard Stoeckner (
142191676d66SBernhard Stoeckner     OBJGPU    *pGpu,
142291676d66SBernhard Stoeckner     KernelBif *pKernelBif
142391676d66SBernhard Stoeckner )
142491676d66SBernhard Stoeckner {
142591676d66SBernhard Stoeckner     NV_STATUS status = NV_OK;
142691676d66SBernhard Stoeckner 
142791676d66SBernhard Stoeckner     // Skip config restore on FMODEL (200684952), move to regmap (200700271)
142891676d66SBernhard Stoeckner     if (IS_FMODEL(pGpu))
142991676d66SBernhard Stoeckner     {
143091676d66SBernhard Stoeckner         return NV_OK;
143191676d66SBernhard Stoeckner     }
143291676d66SBernhard Stoeckner 
143391676d66SBernhard Stoeckner     // Restore pcie config space for function 0
143491676d66SBernhard Stoeckner     status = _kbifRestorePcieConfigRegisters_GH100(pGpu, pKernelBif,
143591676d66SBernhard Stoeckner                                                    &pKernelBif->xveRegmapRef[0]);
143691676d66SBernhard Stoeckner     if (status != NV_OK)
143791676d66SBernhard Stoeckner     {
143891676d66SBernhard Stoeckner         NV_PRINTF(LEVEL_ERROR, "Restoring PCIe config space failed for gpu.\n");
143991676d66SBernhard Stoeckner         NV_ASSERT(0);
144091676d66SBernhard Stoeckner         return status;
144191676d66SBernhard Stoeckner     }
144291676d66SBernhard Stoeckner 
144391676d66SBernhard Stoeckner     return status;
144491676d66SBernhard Stoeckner }
144591676d66SBernhard Stoeckner 
144691676d66SBernhard Stoeckner /*!
1447b5bf85a8SAndy Ritger  * @brief Waits for function issued transaction completions (sysmem to GPU) to arrive
1448b5bf85a8SAndy Ritger  *
1449b5bf85a8SAndy Ritger  * @param[in] pGpu        GPU object pointer
1450b5bf85a8SAndy Ritger  * @param[in] pKernelBif  KernelBif object pointer
1451b5bf85a8SAndy Ritger  *
1452b5bf85a8SAndy Ritger  * @return NV_OK
1453b5bf85a8SAndy Ritger  */
1454b5bf85a8SAndy Ritger NV_STATUS
kbifWaitForTransactionsComplete_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1455b5bf85a8SAndy Ritger kbifWaitForTransactionsComplete_GH100
1456b5bf85a8SAndy Ritger (
1457b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1458b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1459b5bf85a8SAndy Ritger )
1460b5bf85a8SAndy Ritger {
1461b5bf85a8SAndy Ritger     RMTIMEOUT timeout;
1462b5bf85a8SAndy Ritger     NvU32     regVal;
1463b5bf85a8SAndy Ritger 
1464b5bf85a8SAndy Ritger     NV_ASSERT_OK_OR_RETURN(GPU_BUS_CFG_CYCLE_RD32(
1465b5bf85a8SAndy Ritger         pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, &regVal));
1466b5bf85a8SAndy Ritger 
1467b5bf85a8SAndy Ritger     gpuSetTimeout(pGpu, GPU_TIMEOUT_DEFAULT, &timeout, 0);
1468b5bf85a8SAndy Ritger 
1469b5bf85a8SAndy Ritger     // Wait for number of pending transactions to go to 0
1470b5bf85a8SAndy Ritger     while (DRF_VAL(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS, _TRANSACTIONS_PENDING, regVal) != 0)
1471b5bf85a8SAndy Ritger     {
1472b5bf85a8SAndy Ritger         NV_ASSERT_OK_OR_RETURN(gpuCheckTimeout(pGpu, &timeout));
1473b5bf85a8SAndy Ritger         NV_ASSERT_OK_OR_RETURN(GPU_BUS_CFG_CYCLE_RD32(
1474b5bf85a8SAndy Ritger             pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS, &regVal));
1475b5bf85a8SAndy Ritger     }
1476b5bf85a8SAndy Ritger 
1477b5bf85a8SAndy Ritger     return NV_OK;
1478b5bf85a8SAndy Ritger }
1479b5bf85a8SAndy Ritger 
1480b5bf85a8SAndy Ritger /*!
1481b5bf85a8SAndy Ritger  * @brief Trigger FLR.
1482b5bf85a8SAndy Ritger  *
1483b5bf85a8SAndy Ritger  * @param[in] pGpu        GPU object pointer
1484b5bf85a8SAndy Ritger  * @param[in] pKernelBif  KernelBif object pointer
1485b5bf85a8SAndy Ritger  *
1486b5bf85a8SAndy Ritger  * @return  NV_OK if successful.
1487b5bf85a8SAndy Ritger  */
1488b5bf85a8SAndy Ritger NV_STATUS
kbifTriggerFlr_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1489b5bf85a8SAndy Ritger kbifTriggerFlr_GH100
1490b5bf85a8SAndy Ritger (
1491b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1492b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1493b5bf85a8SAndy Ritger )
1494b5bf85a8SAndy Ritger {
1495b5bf85a8SAndy Ritger     NvU32     regVal = 0;
1496b5bf85a8SAndy Ritger     NV_STATUS status = NV_OK;
1497b5bf85a8SAndy Ritger 
1498b5bf85a8SAndy Ritger     status = GPU_BUS_CFG_CYCLE_RD32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
1499b5bf85a8SAndy Ritger                                     &regVal);
1500b5bf85a8SAndy Ritger 
1501b5bf85a8SAndy Ritger     if (status != NV_OK)
1502b5bf85a8SAndy Ritger     {
1503b5bf85a8SAndy Ritger         NV_ASSERT_FAILED("Config space read of device control failed\n");
1504b5bf85a8SAndy Ritger         return status;
1505b5bf85a8SAndy Ritger     }
1506b5bf85a8SAndy Ritger 
1507b5bf85a8SAndy Ritger     regVal = FLD_SET_DRF_NUM(_EP_PCFG_GPU, _DEVICE_CONTROL_STATUS ,
1508b5bf85a8SAndy Ritger                              _INITIATE_FN_LVL_RST, 0x1, regVal);
1509b5bf85a8SAndy Ritger 
1510b5bf85a8SAndy Ritger     status = GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_DEVICE_CONTROL_STATUS,
1511b5bf85a8SAndy Ritger                                     regVal);
1512b5bf85a8SAndy Ritger 
1513b5bf85a8SAndy Ritger     if (status != NV_OK)
1514b5bf85a8SAndy Ritger     {
1515b5bf85a8SAndy Ritger         NV_ASSERT_FAILED("FLR trigger failed\n");
1516b5bf85a8SAndy Ritger         return status;
1517b5bf85a8SAndy Ritger     }
1518b5bf85a8SAndy Ritger 
1519b5bf85a8SAndy Ritger     return status;
1520b5bf85a8SAndy Ritger }
1521b5bf85a8SAndy Ritger 
1522b5bf85a8SAndy Ritger /*!
1523b5bf85a8SAndy Ritger  * @brief Try restoring BAR registers and command register using config cycles
1524b5bf85a8SAndy Ritger  *
1525b5bf85a8SAndy Ritger  * @param[in] pGpu       GPU object pointer
1526b5bf85a8SAndy Ritger  * @param[in] pKernelBif KernelBif object pointer
1527b5bf85a8SAndy Ritger  *
1528b5bf85a8SAndy Ritger  * @return    NV_OK on success
1529b5bf85a8SAndy Ritger  *            NV_ERR_INVALID_READ if the register read returns unexpected value
1530b5bf85a8SAndy Ritger  *            NV_ERR_OBJECT_NOT_FOUND if the object is not found
1531b5bf85a8SAndy Ritger  */
1532b5bf85a8SAndy Ritger NV_STATUS
kbifRestoreBarsAndCommand_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1533b5bf85a8SAndy Ritger kbifRestoreBarsAndCommand_GH100
1534b5bf85a8SAndy Ritger (
1535b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1536b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1537b5bf85a8SAndy Ritger )
1538b5bf85a8SAndy Ritger {
1539b5bf85a8SAndy Ritger     NvU32  *pBarRegOffsets = pKernelBif->barRegOffsets;
1540b5bf85a8SAndy Ritger     NvU32  barOffsetEntry;
1541b5bf85a8SAndy Ritger 
1542b5bf85a8SAndy Ritger     // Restore all BAR registers
1543b5bf85a8SAndy Ritger     for (barOffsetEntry = 0; barOffsetEntry < KBIF_NUM_BAR_OFFSET_ENTRIES; barOffsetEntry++)
1544b5bf85a8SAndy Ritger     {
1545b5bf85a8SAndy Ritger         if (pBarRegOffsets[barOffsetEntry] != KBIF_INVALID_BAR_REG_OFFSET)
1546b5bf85a8SAndy Ritger         {
1547b5bf85a8SAndy Ritger             GPU_BUS_CFG_CYCLE_WR32(pGpu, pBarRegOffsets[barOffsetEntry],
1548b5bf85a8SAndy Ritger                                    pKernelBif->cacheData.gpuBootConfigSpace[pBarRegOffsets[barOffsetEntry]/sizeof(NvU32)]);
1549b5bf85a8SAndy Ritger         }
1550b5bf85a8SAndy Ritger     }
1551b5bf85a8SAndy Ritger 
1552b5bf85a8SAndy Ritger     // Restore Device Control register
1553b5bf85a8SAndy Ritger     GPU_BUS_CFG_CYCLE_WR32(pGpu, NV_EP_PCFG_GPU_CTRL_CMD_AND_STATUS,
1554b5bf85a8SAndy Ritger                            pKernelBif->cacheData.gpuBootConfigSpace[NV_EP_PCFG_GPU_CTRL_CMD_AND_STATUS/sizeof(NvU32)]);
1555b5bf85a8SAndy Ritger 
1556b5bf85a8SAndy Ritger     if (GPU_REG_RD32(pGpu, NV_PMC_BOOT_0) != pGpu->chipId0)
1557b5bf85a8SAndy Ritger     {
1558b5bf85a8SAndy Ritger         return NV_ERR_INVALID_READ;
1559b5bf85a8SAndy Ritger     }
1560b5bf85a8SAndy Ritger 
1561b5bf85a8SAndy Ritger     return NV_OK;
1562b5bf85a8SAndy Ritger }
1563b5bf85a8SAndy Ritger 
1564b5bf85a8SAndy Ritger /*!
1565b5bf85a8SAndy Ritger  * @brief HAL specific BIF software state initialization
1566b5bf85a8SAndy Ritger  *
1567b5bf85a8SAndy Ritger  * @param[in] pGpu       GPU object pointer
1568b5bf85a8SAndy Ritger  * @param[in] pKernelBif KernelBif object pointer
1569b5bf85a8SAndy Ritger  *
1570b5bf85a8SAndy Ritger  * @return    NV_OK on success
1571b5bf85a8SAndy Ritger  */
1572b5bf85a8SAndy Ritger NV_STATUS
kbifInit_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)1573b5bf85a8SAndy Ritger kbifInit_GH100
1574b5bf85a8SAndy Ritger (
1575b5bf85a8SAndy Ritger     OBJGPU    *pGpu,
1576b5bf85a8SAndy Ritger     KernelBif *pKernelBif
1577b5bf85a8SAndy Ritger )
1578b5bf85a8SAndy Ritger {
1579b5bf85a8SAndy Ritger     // Cache the offsets of BAR registers into an array for subsequent use
1580b5bf85a8SAndy Ritger     kbifStoreBarRegOffsets_HAL(pGpu, pKernelBif, NV_EP_PCFG_GPU_VF_BAR0);
1581b5bf85a8SAndy Ritger 
1582b5bf85a8SAndy Ritger     return NV_OK;
1583b5bf85a8SAndy Ritger }
1584b5bf85a8SAndy Ritger 
158591676d66SBernhard Stoeckner NvU32
kbifGetEccCounts_GH100(OBJGPU * pGpu,KernelBif * pKernelBif)158691676d66SBernhard Stoeckner kbifGetEccCounts_GH100
158791676d66SBernhard Stoeckner (
158891676d66SBernhard Stoeckner     OBJGPU *pGpu,
158991676d66SBernhard Stoeckner     KernelBif *pKernelBif
159091676d66SBernhard Stoeckner )
159191676d66SBernhard Stoeckner {
159291676d66SBernhard Stoeckner     NvU32 regVal;
159391676d66SBernhard Stoeckner     NvU32 count = 0;
159491676d66SBernhard Stoeckner 
159591676d66SBernhard Stoeckner     // PCIE RBUF
159691676d66SBernhard Stoeckner     regVal = GPU_REG_RD32(pGpu, NV_XPL_BASE_ADDRESS + NV_XPL_DL_ERR_COUNT_RBUF);
159791676d66SBernhard Stoeckner     count += DRF_VAL(_XPL_DL, _ERR_COUNT_RBUF, _UNCORR_ERR, regVal);
159891676d66SBernhard Stoeckner 
159991676d66SBernhard Stoeckner     // PCIE SEQ_LUT
160091676d66SBernhard Stoeckner     regVal = GPU_REG_RD32(pGpu, NV_XPL_BASE_ADDRESS + NV_XPL_DL_ERR_COUNT_SEQ_LUT);
160191676d66SBernhard Stoeckner     count += DRF_VAL(_XPL_DL, _ERR_COUNT_SEQ_LUT, _UNCORR_ERR, regVal);
160291676d66SBernhard Stoeckner 
160391676d66SBernhard Stoeckner     // PCIE XTL
160491676d66SBernhard Stoeckner     regVal = GPU_REG_RD32(pGpu, NV_XTL_BASE_ADDRESS + NV_XTL_EP_PRI_DED_ERROR_STATUS);
160591676d66SBernhard Stoeckner     if (regVal != 0)
160691676d66SBernhard Stoeckner     {
160791676d66SBernhard Stoeckner         count += 1;
160891676d66SBernhard Stoeckner     }
160991676d66SBernhard Stoeckner 
161091676d66SBernhard Stoeckner     // PCIE XTL
161191676d66SBernhard Stoeckner     regVal = GPU_REG_RD32(pGpu, NV_XTL_BASE_ADDRESS + NV_XTL_EP_PRI_RAM_ERROR_INTR_STATUS);
161291676d66SBernhard Stoeckner     if (regVal != 0)
161391676d66SBernhard Stoeckner     {
161491676d66SBernhard Stoeckner         count += 1;
161591676d66SBernhard Stoeckner     }
161691676d66SBernhard Stoeckner 
161791676d66SBernhard Stoeckner     return count;
161891676d66SBernhard Stoeckner }
161991676d66SBernhard Stoeckner 
1620