Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: use static mmio offset for NV mailbox

what:
with the new "req_init_data" handshake we need to use mailbox
before do IP discovery, so in mxgpu_nv.c file the original
SOC15_REG method won'twork because that depends on IP discovery
complete first.

how:
so the solution is to always use static MMIO offset for NV+ mailbox
registers.
HW team confirm us all MAILBOX registers will be at the same
offset for all ASICs, no IP discovery needed for those registers

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Emily Deng <Emily.Deng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Monk Liu and committed by
Alex Deucher
ff1f03a7 aa53bc2e

+38 -32
+22 -30
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c
··· 52 52 */ 53 53 static enum idh_event xgpu_nv_mailbox_peek_msg(struct amdgpu_device *adev) 54 54 { 55 - return RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 56 - mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW0)); 55 + return RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0); 57 56 } 58 57 59 58 ··· 61 62 { 62 63 u32 reg; 63 64 64 - reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 65 - mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW0)); 65 + reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0); 66 66 if (reg != event) 67 67 return -ENOENT; 68 68 ··· 114 116 static void xgpu_nv_mailbox_trans_msg (struct amdgpu_device *adev, 115 117 enum idh_request req, u32 data1, u32 data2, u32 data3) 116 118 { 117 - u32 reg; 118 119 int r; 119 120 uint8_t trn; 120 121 ··· 132 135 } 133 136 } while (trn); 134 137 135 - reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 136 - mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0)); 137 - reg = REG_SET_FIELD(reg, BIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0, 138 - MSGBUF_DATA, req); 139 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0), 140 - reg); 141 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW1), 142 - data1); 143 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW2), 144 - data2); 145 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW3), 146 - data3); 147 - 138 + WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW0, req); 139 + WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW1, data1); 140 + WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW2, data2); 141 + WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW3, data3); 148 142 xgpu_nv_mailbox_set_valid(adev, true); 149 143 150 144 /* start to poll ack */ ··· 180 192 if (req == IDH_REQ_GPU_INIT_DATA) 181 193 { 182 194 adev->virt.req_init_data_ver = 183 - RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 184 - mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW1)); 195 + RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW1); 185 196 186 197 /* assume V1 in case host doesn't set version number */ 187 198 if (adev->virt.req_init_data_ver < 1) ··· 191 204 /* Retrieve checksum from mailbox2 */ 192 205 if (req == IDH_REQ_GPU_INIT_ACCESS || req == IDH_REQ_GPU_RESET_ACCESS) { 193 206 adev->virt.fw_reserve.checksum_key = 194 - RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, 195 - mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW2)); 207 + RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW2); 196 208 } 197 209 } 198 210 ··· 242 256 unsigned type, 243 257 enum amdgpu_interrupt_state state) 244 258 { 245 - u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL)); 259 + u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL); 246 260 247 - tmp = REG_SET_FIELD(tmp, BIF_BX_PF_MAILBOX_INT_CNTL, ACK_INT_EN, 248 - (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); 249 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL), tmp); 261 + if (state == AMDGPU_IRQ_STATE_ENABLE) 262 + tmp |= 2; 263 + else 264 + tmp &= ~2; 265 + 266 + WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp); 250 267 251 268 return 0; 252 269 } ··· 301 312 unsigned type, 302 313 enum amdgpu_interrupt_state state) 303 314 { 304 - u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL)); 315 + u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL); 305 316 306 - tmp = REG_SET_FIELD(tmp, BIF_BX_PF_MAILBOX_INT_CNTL, VALID_INT_EN, 307 - (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); 308 - WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL), tmp); 317 + if (state == AMDGPU_IRQ_STATE_ENABLE) 318 + tmp |= 1; 319 + else 320 + tmp &= ~1; 321 + 322 + WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp); 309 323 310 324 return 0; 311 325 }
+16 -2
drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h
··· 59 59 int xgpu_nv_mailbox_get_irq(struct amdgpu_device *adev); 60 60 void xgpu_nv_mailbox_put_irq(struct amdgpu_device *adev); 61 61 62 - #define NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE (SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_CONTROL) * 4) 63 - #define NV_MAIBOX_CONTROL_RCV_OFFSET_BYTE (SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_CONTROL) * 4 + 1) 62 + #define mmMAILBOX_CONTROL 0xE5E 63 + 64 + #define NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE (mmMAILBOX_CONTROL * 4) 65 + #define NV_MAIBOX_CONTROL_RCV_OFFSET_BYTE (NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE + 1) 66 + 67 + #define mmMAILBOX_MSGBUF_TRN_DW0 0xE56 68 + #define mmMAILBOX_MSGBUF_TRN_DW1 0xE57 69 + #define mmMAILBOX_MSGBUF_TRN_DW2 0xE58 70 + #define mmMAILBOX_MSGBUF_TRN_DW3 0xE59 71 + 72 + #define mmMAILBOX_MSGBUF_RCV_DW0 0xE5A 73 + #define mmMAILBOX_MSGBUF_RCV_DW1 0xE5B 74 + #define mmMAILBOX_MSGBUF_RCV_DW2 0xE5C 75 + #define mmMAILBOX_MSGBUF_RCV_DW3 0xE5D 76 + 77 + #define mmMAILBOX_INT_CNTL 0xE5F 64 78 65 79 #endif