139def24fSHawking Zhang /*
239def24fSHawking Zhang  * Copyright 2022 Advanced Micro Devices, Inc.
339def24fSHawking Zhang  *
439def24fSHawking Zhang  * Permission is hereby granted, free of charge, to any person obtaining a
539def24fSHawking Zhang  * copy of this software and associated documentation files (the "Software"),
639def24fSHawking Zhang  * to deal in the Software without restriction, including without limitation
739def24fSHawking Zhang  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
839def24fSHawking Zhang  * and/or sell copies of the Software, and to permit persons to whom the
939def24fSHawking Zhang  * Software is furnished to do so, subject to the following conditions:
1039def24fSHawking Zhang  *
1139def24fSHawking Zhang  * The above copyright notice and this permission notice shall be included in
1239def24fSHawking Zhang  * all copies or substantial portions of the Software.
1339def24fSHawking Zhang  *
1439def24fSHawking Zhang  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1539def24fSHawking Zhang  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1639def24fSHawking Zhang  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1739def24fSHawking Zhang  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1839def24fSHawking Zhang  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1939def24fSHawking Zhang  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2039def24fSHawking Zhang  * OTHER DEALINGS IN THE SOFTWARE.
2139def24fSHawking Zhang  *
2239def24fSHawking Zhang  */
2339def24fSHawking Zhang #include "amdgpu.h"
2439def24fSHawking Zhang #include "amdgpu_atombios.h"
2539def24fSHawking Zhang #include "nbio_v7_9.h"
2639def24fSHawking Zhang #include "amdgpu_ras.h"
2739def24fSHawking Zhang 
2839def24fSHawking Zhang #include "nbio/nbio_7_9_0_offset.h"
2939def24fSHawking Zhang #include "nbio/nbio_7_9_0_sh_mask.h"
3039def24fSHawking Zhang #include "ivsrcid/nbio/irqsrcs_nbif_7_4.h"
3139def24fSHawking Zhang #include <uapi/linux/kfd_ioctl.h>
3239def24fSHawking Zhang 
33ea2d2f8eSRajneesh Bhardwaj #define NPS_MODE_MASK 0x000000FFL
34ea2d2f8eSRajneesh Bhardwaj 
35*50709d18SLijo Lazar /* Core 0 Port 0 counter */
36*50709d18SLijo Lazar #define smnPCIEP_NAK_COUNTER 0x1A340218
37*50709d18SLijo Lazar 
3839def24fSHawking Zhang static void nbio_v7_9_remap_hdp_registers(struct amdgpu_device *adev)
3939def24fSHawking Zhang {
4039def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL,
4139def24fSHawking Zhang 		adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL);
4239def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIF_BX0_REMAP_HDP_REG_FLUSH_CNTL,
4339def24fSHawking Zhang 		adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_REG_FLUSH_CNTL);
4439def24fSHawking Zhang }
4539def24fSHawking Zhang 
4639def24fSHawking Zhang static u32 nbio_v7_9_get_rev_id(struct amdgpu_device *adev)
4739def24fSHawking Zhang {
4839def24fSHawking Zhang 	u32 tmp;
4939def24fSHawking Zhang 
5039def24fSHawking Zhang 	tmp = RREG32_SOC15(NBIO, 0, regRCC_STRAP0_RCC_DEV0_EPF0_STRAP0);
5139def24fSHawking Zhang 	tmp = REG_GET_FIELD(tmp, RCC_STRAP0_RCC_DEV0_EPF0_STRAP0, STRAP_ATI_REV_ID_DEV0_F0);
5239def24fSHawking Zhang 
5339def24fSHawking Zhang 	return tmp;
5439def24fSHawking Zhang }
5539def24fSHawking Zhang 
5639def24fSHawking Zhang static void nbio_v7_9_mc_access_enable(struct amdgpu_device *adev, bool enable)
5739def24fSHawking Zhang {
5839def24fSHawking Zhang 	if (enable)
5939def24fSHawking Zhang 		WREG32_SOC15(NBIO, 0, regBIF_BX0_BIF_FB_EN,
6039def24fSHawking Zhang 			BIF_BX0_BIF_FB_EN__FB_READ_EN_MASK | BIF_BX0_BIF_FB_EN__FB_WRITE_EN_MASK);
6139def24fSHawking Zhang 	else
6239def24fSHawking Zhang 		WREG32_SOC15(NBIO, 0, regBIF_BX0_BIF_FB_EN, 0);
6339def24fSHawking Zhang }
6439def24fSHawking Zhang 
6539def24fSHawking Zhang static u32 nbio_v7_9_get_memsize(struct amdgpu_device *adev)
6639def24fSHawking Zhang {
6739def24fSHawking Zhang 	return RREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF0_RCC_CONFIG_MEMSIZE);
6839def24fSHawking Zhang }
6939def24fSHawking Zhang 
7039def24fSHawking Zhang static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
7139def24fSHawking Zhang 			bool use_doorbell, int doorbell_index, int doorbell_size)
7239def24fSHawking Zhang {
7339def24fSHawking Zhang 	u32 doorbell_range = 0, doorbell_ctrl = 0;
74f8b34a05SLijo Lazar 	int aid_id, dev_inst;
75f8b34a05SLijo Lazar 
76f8b34a05SLijo Lazar 	dev_inst = GET_INST(SDMA0, instance);
77f8b34a05SLijo Lazar 	aid_id = adev->sdma.instance[instance].aid_id;
786b22ef25SLe Ma 
796b22ef25SLe Ma 	if (use_doorbell == false)
806b22ef25SLe Ma 		return;
8139def24fSHawking Zhang 
8239def24fSHawking Zhang 	doorbell_range =
8339def24fSHawking Zhang 		REG_SET_FIELD(doorbell_range, DOORBELL0_CTRL_ENTRY_0,
8439def24fSHawking Zhang 			BIF_DOORBELL0_RANGE_OFFSET_ENTRY, doorbell_index);
8539def24fSHawking Zhang 	doorbell_range =
8639def24fSHawking Zhang 		REG_SET_FIELD(doorbell_range, DOORBELL0_CTRL_ENTRY_0,
8739def24fSHawking Zhang 			BIF_DOORBELL0_RANGE_SIZE_ENTRY, doorbell_size);
8839def24fSHawking Zhang 	doorbell_ctrl =
8939def24fSHawking Zhang 		REG_SET_FIELD(doorbell_ctrl, S2A_DOORBELL_ENTRY_1_CTRL,
9039def24fSHawking Zhang 			S2A_DOORBELL_PORT1_ENABLE, 1);
9139def24fSHawking Zhang 	doorbell_ctrl =
9239def24fSHawking Zhang 		REG_SET_FIELD(doorbell_ctrl, S2A_DOORBELL_ENTRY_1_CTRL,
9339def24fSHawking Zhang 			S2A_DOORBELL_PORT1_RANGE_SIZE, doorbell_size);
9439def24fSHawking Zhang 
95f8b34a05SLijo Lazar 	switch (dev_inst % adev->sdma.num_inst_per_aid) {
9639def24fSHawking Zhang 	case 0:
973955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_1,
986b22ef25SLe Ma 			4 * aid_id, doorbell_range);
9939def24fSHawking Zhang 
10039def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
10139def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
10239def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWID, 0xe);
10339def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
10439def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
10539def24fSHawking Zhang 					S2A_DOORBELL_PORT1_RANGE_OFFSET, 0xe);
10639def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
10739def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
10839def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,
10939def24fSHawking Zhang 					0x1);
110369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_1_CTRL,
111369576c2SLe Ma 			aid_id, doorbell_ctrl);
11239def24fSHawking Zhang 		break;
11339def24fSHawking Zhang 	case 1:
1143955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_2,
1156b22ef25SLe Ma 			4 * aid_id, doorbell_range);
11639def24fSHawking Zhang 
11739def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
11839def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
11939def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWID, 0x8);
12039def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
12139def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
12239def24fSHawking Zhang 					S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x8);
12339def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
12439def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
12539def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,
12639def24fSHawking Zhang 					0x2);
127369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_2_CTRL,
128369576c2SLe Ma 			aid_id, doorbell_ctrl);
12939def24fSHawking Zhang 		break;
13039def24fSHawking Zhang 	case 2:
1313955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_3,
1326b22ef25SLe Ma 			4 * aid_id, doorbell_range);
13339def24fSHawking Zhang 
13439def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
13539def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
13639def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWID, 0x9);
13739def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
13839def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
13939def24fSHawking Zhang 					S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x9);
14039def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
14139def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
14239def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,
14339def24fSHawking Zhang 					0x8);
144369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_5_CTRL,
145369576c2SLe Ma 			aid_id, doorbell_ctrl);
14639def24fSHawking Zhang 		break;
14739def24fSHawking Zhang 	case 3:
1483955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_4,
1496b22ef25SLe Ma 			4 * aid_id, doorbell_range);
15039def24fSHawking Zhang 
15139def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
15239def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
15339def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWID, 0xa);
15439def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
15539def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
15639def24fSHawking Zhang 					S2A_DOORBELL_PORT1_RANGE_OFFSET, 0xa);
15739def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
15839def24fSHawking Zhang 					S2A_DOORBELL_ENTRY_1_CTRL,
15939def24fSHawking Zhang 					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,
16039def24fSHawking Zhang 					0x9);
161369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_6_CTRL,
162369576c2SLe Ma 			aid_id, doorbell_ctrl);
16339def24fSHawking Zhang 		break;
16439def24fSHawking Zhang 	default:
16539def24fSHawking Zhang 		break;
1661ffbc89cSJiapeng Chong 	}
16739def24fSHawking Zhang 
16839def24fSHawking Zhang 	return;
16939def24fSHawking Zhang }
17039def24fSHawking Zhang 
17139def24fSHawking Zhang static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_doorbell,
17239def24fSHawking Zhang 					 int doorbell_index, int instance)
17339def24fSHawking Zhang {
17439def24fSHawking Zhang 	u32 doorbell_range = 0, doorbell_ctrl = 0;
1752e10ced4SJames Zhu 	u32 aid_id = instance;
17639def24fSHawking Zhang 
17739def24fSHawking Zhang 	if (use_doorbell) {
17839def24fSHawking Zhang 		doorbell_range = REG_SET_FIELD(doorbell_range,
17939def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
18039def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_OFFSET_ENTRY,
18139def24fSHawking Zhang 				doorbell_index);
18239def24fSHawking Zhang 		doorbell_range = REG_SET_FIELD(doorbell_range,
18339def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
18439def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_SIZE_ENTRY,
18553054e9aSJames Zhu 				0x9);
1862e10ced4SJames Zhu 		if (aid_id)
1872e10ced4SJames Zhu 			doorbell_range = REG_SET_FIELD(doorbell_range,
1882e10ced4SJames Zhu 					DOORBELL0_CTRL_ENTRY_0,
1892e10ced4SJames Zhu 					DOORBELL0_FENCE_ENABLE_ENTRY,
1902e10ced4SJames Zhu 					0x4);
19139def24fSHawking Zhang 
19239def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
19339def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
19439def24fSHawking Zhang 				S2A_DOORBELL_PORT1_ENABLE, 1);
19539def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
19639def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
19739def24fSHawking Zhang 				S2A_DOORBELL_PORT1_AWID, 0x4);
19839def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
19939def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
20039def24fSHawking Zhang 				S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x4);
20139def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
20239def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
20353054e9aSJames Zhu 				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x9);
20439def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
20539def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
20639def24fSHawking Zhang 				S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0x4);
2072e10ced4SJames Zhu 
2083955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17,
2092e10ced4SJames Zhu 					aid_id, doorbell_range);
210369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL,
211369576c2SLe Ma 				aid_id, doorbell_ctrl);
21239def24fSHawking Zhang 	} else {
21339def24fSHawking Zhang 		doorbell_range = REG_SET_FIELD(doorbell_range,
21439def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
21539def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_SIZE_ENTRY, 0);
21639def24fSHawking Zhang 		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,
21739def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
21839def24fSHawking Zhang 				S2A_DOORBELL_PORT1_RANGE_SIZE, 0);
21939def24fSHawking Zhang 
2203955b141SLe Ma 		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17,
2213955b141SLe Ma 					aid_id, doorbell_range);
222369576c2SLe Ma 		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL,
223369576c2SLe Ma 				aid_id, doorbell_ctrl);
2242e10ced4SJames Zhu 	}
22539def24fSHawking Zhang }
22639def24fSHawking Zhang 
22739def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_aperture(struct amdgpu_device *adev,
22839def24fSHawking Zhang 					       bool enable)
22939def24fSHawking Zhang {
23039def24fSHawking Zhang 	/* Enable to allow doorbell pass thru on pre-silicon bare-metal */
23139def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIFC_DOORBELL_ACCESS_EN_PF, 0xfffff);
23239def24fSHawking Zhang 	WREG32_FIELD15_PREREG(NBIO, 0, RCC_DEV0_EPF0_RCC_DOORBELL_APER_EN,
23339def24fSHawking Zhang 			BIF_DOORBELL_APER_EN, enable ? 1 : 0);
23439def24fSHawking Zhang }
23539def24fSHawking Zhang 
23639def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
23739def24fSHawking Zhang 							bool enable)
23839def24fSHawking Zhang {
23939def24fSHawking Zhang 	u32 tmp = 0;
24039def24fSHawking Zhang 
24139def24fSHawking Zhang 	if (enable) {
24239def24fSHawking Zhang 		tmp = REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL,
24339def24fSHawking Zhang 				    DOORBELL_SELFRING_GPA_APER_EN, 1) |
24439def24fSHawking Zhang 		      REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL,
24539def24fSHawking Zhang 				    DOORBELL_SELFRING_GPA_APER_MODE, 1) |
24639def24fSHawking Zhang 		      REG_SET_FIELD(tmp, BIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL,
24739def24fSHawking Zhang 				    DOORBELL_SELFRING_GPA_APER_SIZE, 0);
24839def24fSHawking Zhang 
24939def24fSHawking Zhang 		WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_BASE_LOW,
25039def24fSHawking Zhang 			     lower_32_bits(adev->doorbell.base));
25139def24fSHawking Zhang 		WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_BASE_HIGH,
25239def24fSHawking Zhang 			     upper_32_bits(adev->doorbell.base));
25339def24fSHawking Zhang 	}
25439def24fSHawking Zhang 
25539def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_DOORBELL_SELFRING_GPA_APER_CNTL, tmp);
25639def24fSHawking Zhang }
25739def24fSHawking Zhang 
25839def24fSHawking Zhang static void nbio_v7_9_ih_doorbell_range(struct amdgpu_device *adev,
25939def24fSHawking Zhang 					bool use_doorbell, int doorbell_index)
26039def24fSHawking Zhang {
26139def24fSHawking Zhang 	u32 ih_doorbell_range = 0, ih_doorbell_ctrl = 0;
26239def24fSHawking Zhang 
26339def24fSHawking Zhang 	if (use_doorbell) {
26439def24fSHawking Zhang 		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range,
26539def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
26639def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_OFFSET_ENTRY,
26739def24fSHawking Zhang 				doorbell_index);
26839def24fSHawking Zhang 		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range,
26939def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
27039def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_SIZE_ENTRY,
27140b832aaSMukul Joshi 				0x8);
27239def24fSHawking Zhang 
27339def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
27439def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
27539def24fSHawking Zhang 				S2A_DOORBELL_PORT1_ENABLE, 1);
27639def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
27739def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
27839def24fSHawking Zhang 				S2A_DOORBELL_PORT1_AWID, 0);
27939def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
28039def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
28139def24fSHawking Zhang 				S2A_DOORBELL_PORT1_RANGE_OFFSET, 0);
28239def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
28339def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
28440b832aaSMukul Joshi 				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x8);
28539def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
28639def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
28739def24fSHawking Zhang 				S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0);
28839def24fSHawking Zhang 	} else {
28939def24fSHawking Zhang 		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range,
29039def24fSHawking Zhang 				DOORBELL0_CTRL_ENTRY_0,
29139def24fSHawking Zhang 				BIF_DOORBELL0_RANGE_SIZE_ENTRY, 0);
29239def24fSHawking Zhang 		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,
29339def24fSHawking Zhang 				S2A_DOORBELL_ENTRY_1_CTRL,
29439def24fSHawking Zhang 				S2A_DOORBELL_PORT1_RANGE_SIZE, 0);
29539def24fSHawking Zhang 	}
29639def24fSHawking Zhang 
29739def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_0, ih_doorbell_range);
29839def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_3_CTRL, ih_doorbell_ctrl);
29939def24fSHawking Zhang }
30039def24fSHawking Zhang 
30139def24fSHawking Zhang 
30239def24fSHawking Zhang static void nbio_v7_9_update_medium_grain_clock_gating(struct amdgpu_device *adev,
30339def24fSHawking Zhang 						       bool enable)
30439def24fSHawking Zhang {
30539def24fSHawking Zhang }
30639def24fSHawking Zhang 
30739def24fSHawking Zhang static void nbio_v7_9_update_medium_grain_light_sleep(struct amdgpu_device *adev,
30839def24fSHawking Zhang 						      bool enable)
30939def24fSHawking Zhang {
31039def24fSHawking Zhang }
31139def24fSHawking Zhang 
31239def24fSHawking Zhang static void nbio_v7_9_get_clockgating_state(struct amdgpu_device *adev,
31339def24fSHawking Zhang 					    u64 *flags)
31439def24fSHawking Zhang {
31539def24fSHawking Zhang }
31639def24fSHawking Zhang 
31739def24fSHawking Zhang static void nbio_v7_9_ih_control(struct amdgpu_device *adev)
31839def24fSHawking Zhang {
31939def24fSHawking Zhang 	u32 interrupt_cntl;
32039def24fSHawking Zhang 
32139def24fSHawking Zhang 	/* setup interrupt control */
32239def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL2, adev->dummy_page_addr >> 8);
32339def24fSHawking Zhang 	interrupt_cntl = RREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL);
32439def24fSHawking Zhang 	/* INTERRUPT_CNTL__IH_DUMMY_RD_OVERRIDE_MASK=0 - dummy read disabled with msi, enabled without msi
32539def24fSHawking Zhang 	 * INTERRUPT_CNTL__IH_DUMMY_RD_OVERRIDE_MASK=1 - dummy read controlled by IH_DUMMY_RD_EN
32639def24fSHawking Zhang 	 */
32739def24fSHawking Zhang 	interrupt_cntl =
32839def24fSHawking Zhang 		REG_SET_FIELD(interrupt_cntl, BIF_BX0_INTERRUPT_CNTL, IH_DUMMY_RD_OVERRIDE, 0);
32939def24fSHawking Zhang 	/* INTERRUPT_CNTL__IH_REQ_NONSNOOP_EN_MASK=1 if ring is in non-cacheable memory, e.g., vram */
33039def24fSHawking Zhang 	interrupt_cntl =
33139def24fSHawking Zhang 		REG_SET_FIELD(interrupt_cntl, BIF_BX0_INTERRUPT_CNTL, IH_REQ_NONSNOOP_EN, 0);
33239def24fSHawking Zhang 	WREG32_SOC15(NBIO, 0, regBIF_BX0_INTERRUPT_CNTL, interrupt_cntl);
33339def24fSHawking Zhang }
33439def24fSHawking Zhang 
33539def24fSHawking Zhang static u32 nbio_v7_9_get_hdp_flush_req_offset(struct amdgpu_device *adev)
33639def24fSHawking Zhang {
33739def24fSHawking Zhang 	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX_PF0_GPU_HDP_FLUSH_REQ);
33839def24fSHawking Zhang }
33939def24fSHawking Zhang 
34039def24fSHawking Zhang static u32 nbio_v7_9_get_hdp_flush_done_offset(struct amdgpu_device *adev)
34139def24fSHawking Zhang {
34239def24fSHawking Zhang 	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX_PF0_GPU_HDP_FLUSH_DONE);
34339def24fSHawking Zhang }
34439def24fSHawking Zhang 
34539def24fSHawking Zhang static u32 nbio_v7_9_get_pcie_index_offset(struct amdgpu_device *adev)
34639def24fSHawking Zhang {
34739def24fSHawking Zhang 	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_INDEX2);
34839def24fSHawking Zhang }
34939def24fSHawking Zhang 
35039def24fSHawking Zhang static u32 nbio_v7_9_get_pcie_data_offset(struct amdgpu_device *adev)
35139def24fSHawking Zhang {
35239def24fSHawking Zhang 	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_DATA2);
35339def24fSHawking Zhang }
35439def24fSHawking Zhang 
3550c552ed3SLe Ma static u32 nbio_v7_9_get_pcie_index_hi_offset(struct amdgpu_device *adev)
3560c552ed3SLe Ma {
3570c552ed3SLe Ma 	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_INDEX2_HI);
3580c552ed3SLe Ma }
3590c552ed3SLe Ma 
36039def24fSHawking Zhang const struct nbio_hdp_flush_reg nbio_v7_9_hdp_flush_reg = {
36139def24fSHawking Zhang 	.ref_and_mask_cp0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP0_MASK,
36239def24fSHawking Zhang 	.ref_and_mask_cp1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP1_MASK,
36339def24fSHawking Zhang 	.ref_and_mask_cp2 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP2_MASK,
36439def24fSHawking Zhang 	.ref_and_mask_cp3 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP3_MASK,
36539def24fSHawking Zhang 	.ref_and_mask_cp4 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP4_MASK,
36639def24fSHawking Zhang 	.ref_and_mask_cp5 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP5_MASK,
36739def24fSHawking Zhang 	.ref_and_mask_cp6 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP6_MASK,
36839def24fSHawking Zhang 	.ref_and_mask_cp7 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP7_MASK,
36939def24fSHawking Zhang 	.ref_and_mask_cp8 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP8_MASK,
37039def24fSHawking Zhang 	.ref_and_mask_cp9 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP9_MASK,
37139def24fSHawking Zhang 	.ref_and_mask_sdma0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA0_MASK,
37239def24fSHawking Zhang 	.ref_and_mask_sdma1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA1_MASK,
37339def24fSHawking Zhang 	.ref_and_mask_sdma2 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG0_MASK,
37439def24fSHawking Zhang 	.ref_and_mask_sdma3 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG1_MASK,
37539def24fSHawking Zhang 	.ref_and_mask_sdma4 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG2_MASK,
37639def24fSHawking Zhang 	.ref_and_mask_sdma5 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG3_MASK,
37739def24fSHawking Zhang 	.ref_and_mask_sdma6 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG4_MASK,
37839def24fSHawking Zhang 	.ref_and_mask_sdma7 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__RSVD_ENG5_MASK,
37939def24fSHawking Zhang };
38039def24fSHawking Zhang 
38139def24fSHawking Zhang static void nbio_v7_9_enable_doorbell_interrupt(struct amdgpu_device *adev,
38239def24fSHawking Zhang 						bool enable)
38339def24fSHawking Zhang {
38439def24fSHawking Zhang 	WREG32_FIELD15_PREREG(NBIO, 0, BIF_BX0_BIF_DOORBELL_INT_CNTL,
38539def24fSHawking Zhang 			      DOORBELL_INTERRUPT_DISABLE, enable ? 0 : 1);
38639def24fSHawking Zhang }
38739def24fSHawking Zhang 
3886c882a57SNathan Chancellor static int nbio_v7_9_get_compute_partition_mode(struct amdgpu_device *adev)
38998a54e88SLe Ma {
390cd321e6fSLijo Lazar 	u32 tmp, px;
39198a54e88SLe Ma 
392cd321e6fSLijo Lazar 	tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_COMPUTE_STATUS);
393cd321e6fSLijo Lazar 	px = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_COMPUTE_STATUS,
394cd321e6fSLijo Lazar 			   PARTITION_MODE);
39598a54e88SLe Ma 
396fe381726SLijo Lazar 	return px;
39798a54e88SLe Ma }
39898a54e88SLe Ma 
3996c882a57SNathan Chancellor static u32 nbio_v7_9_get_memory_partition_mode(struct amdgpu_device *adev,
4006c882a57SNathan Chancellor 					       u32 *supp_modes)
401ea2d2f8eSRajneesh Bhardwaj {
402ea2d2f8eSRajneesh Bhardwaj 	u32 tmp;
4030f2e1d62SLijo Lazar 
404ea2d2f8eSRajneesh Bhardwaj 	tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_STATUS);
405ea2d2f8eSRajneesh Bhardwaj 	tmp = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_MEM_STATUS, NPS_MODE);
406ea2d2f8eSRajneesh Bhardwaj 
4070f2e1d62SLijo Lazar 	if (supp_modes) {
4080f2e1d62SLijo Lazar 		*supp_modes =
4090f2e1d62SLijo Lazar 			RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_CAP);
4100f2e1d62SLijo Lazar 	}
4110f2e1d62SLijo Lazar 
412ea2d2f8eSRajneesh Bhardwaj 	return ffs(tmp);
413ea2d2f8eSRajneesh Bhardwaj }
414ea2d2f8eSRajneesh Bhardwaj 
41589fb3020SShiwu Zhang static void nbio_v7_9_init_registers(struct amdgpu_device *adev)
41689fb3020SShiwu Zhang {
41789fb3020SShiwu Zhang 	u32 inst_mask;
41889fb3020SShiwu Zhang 	int i;
41989fb3020SShiwu Zhang 
42089fb3020SShiwu Zhang 	WREG32_SOC15(NBIO, 0, regXCC_DOORBELL_FENCE,
42189fb3020SShiwu Zhang 		0xff & ~(adev->gfx.xcc_mask));
42289fb3020SShiwu Zhang 
423a3ffabb2SLijo Lazar 	WREG32_SOC15(NBIO, 0, regBIFC_GFX_INT_MONITOR_MASK, 0x7ff);
424a3ffabb2SLijo Lazar 
42589fb3020SShiwu Zhang 	inst_mask = adev->aid_mask & ~1U;
42689fb3020SShiwu Zhang 	for_each_inst(i, inst_mask) {
42789fb3020SShiwu Zhang 		WREG32_SOC15_EXT(NBIO, i, regXCC_DOORBELL_FENCE, i,
42889fb3020SShiwu Zhang 			XCC_DOORBELL_FENCE__SHUB_SLV_MODE_MASK);
42989fb3020SShiwu Zhang 
43089fb3020SShiwu Zhang 	}
43189fb3020SShiwu Zhang }
43289fb3020SShiwu Zhang 
433*50709d18SLijo Lazar static u64 nbio_v7_9_get_pcie_replay_count(struct amdgpu_device *adev)
434*50709d18SLijo Lazar {
435*50709d18SLijo Lazar 	u32 val, nak_r, nak_g;
436*50709d18SLijo Lazar 
437*50709d18SLijo Lazar 	if (adev->flags & AMD_IS_APU)
438*50709d18SLijo Lazar 		return 0;
439*50709d18SLijo Lazar 
440*50709d18SLijo Lazar 	/* Get the number of NAKs received and generated */
441*50709d18SLijo Lazar 	val = RREG32_PCIE(smnPCIEP_NAK_COUNTER);
442*50709d18SLijo Lazar 	nak_r = val & 0xFFFF;
443*50709d18SLijo Lazar 	nak_g = val >> 16;
444*50709d18SLijo Lazar 
445*50709d18SLijo Lazar 	/* Add the total number of NAKs, i.e the number of replays */
446*50709d18SLijo Lazar 	return (nak_r + nak_g);
447*50709d18SLijo Lazar }
448*50709d18SLijo Lazar 
44939def24fSHawking Zhang const struct amdgpu_nbio_funcs nbio_v7_9_funcs = {
45039def24fSHawking Zhang 	.get_hdp_flush_req_offset = nbio_v7_9_get_hdp_flush_req_offset,
45139def24fSHawking Zhang 	.get_hdp_flush_done_offset = nbio_v7_9_get_hdp_flush_done_offset,
45239def24fSHawking Zhang 	.get_pcie_index_offset = nbio_v7_9_get_pcie_index_offset,
45339def24fSHawking Zhang 	.get_pcie_data_offset = nbio_v7_9_get_pcie_data_offset,
4540c552ed3SLe Ma 	.get_pcie_index_hi_offset = nbio_v7_9_get_pcie_index_hi_offset,
45539def24fSHawking Zhang 	.get_rev_id = nbio_v7_9_get_rev_id,
45639def24fSHawking Zhang 	.mc_access_enable = nbio_v7_9_mc_access_enable,
45739def24fSHawking Zhang 	.get_memsize = nbio_v7_9_get_memsize,
45839def24fSHawking Zhang 	.sdma_doorbell_range = nbio_v7_9_sdma_doorbell_range,
45939def24fSHawking Zhang 	.vcn_doorbell_range = nbio_v7_9_vcn_doorbell_range,
46039def24fSHawking Zhang 	.enable_doorbell_aperture = nbio_v7_9_enable_doorbell_aperture,
46139def24fSHawking Zhang 	.enable_doorbell_selfring_aperture = nbio_v7_9_enable_doorbell_selfring_aperture,
46239def24fSHawking Zhang 	.ih_doorbell_range = nbio_v7_9_ih_doorbell_range,
46339def24fSHawking Zhang 	.enable_doorbell_interrupt = nbio_v7_9_enable_doorbell_interrupt,
46439def24fSHawking Zhang 	.update_medium_grain_clock_gating = nbio_v7_9_update_medium_grain_clock_gating,
46539def24fSHawking Zhang 	.update_medium_grain_light_sleep = nbio_v7_9_update_medium_grain_light_sleep,
46639def24fSHawking Zhang 	.get_clockgating_state = nbio_v7_9_get_clockgating_state,
46739def24fSHawking Zhang 	.ih_control = nbio_v7_9_ih_control,
46839def24fSHawking Zhang 	.remap_hdp_registers = nbio_v7_9_remap_hdp_registers,
46998a54e88SLe Ma 	.get_compute_partition_mode = nbio_v7_9_get_compute_partition_mode,
470ea2d2f8eSRajneesh Bhardwaj 	.get_memory_partition_mode = nbio_v7_9_get_memory_partition_mode,
47189fb3020SShiwu Zhang 	.init_registers = nbio_v7_9_init_registers,
472*50709d18SLijo Lazar 	.get_pcie_replay_count = nbio_v7_9_get_pcie_replay_count,
47339def24fSHawking Zhang };
474