1/* $NetBSD: amdgpu_smu_v11_0_i2c.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $ */ 2 3/* 4 * Copyright 2019 Advanced Micro Devices, Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 * 24 */ 25 26#include <sys/cdefs.h> 27__KERNEL_RCSID(0, "$NetBSD: amdgpu_smu_v11_0_i2c.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $"); 28 29#include "smuio/smuio_11_0_0_offset.h" 30#include "smuio/smuio_11_0_0_sh_mask.h" 31 32#include "smu_v11_0_i2c.h" 33#include "amdgpu.h" 34#include "soc15_common.h" 35#include <drm/drm_fixed.h> 36#include <drm/drm_drv.h> 37#include "amdgpu_amdkfd.h" 38#include <linux/i2c.h> 39#include <linux/pci.h> 40#include "amdgpu_ras.h" 41 42/* error codes */ 43#define I2C_OK 0 44#define I2C_NAK_7B_ADDR_NOACK 1 45#define I2C_NAK_TXDATA_NOACK 2 46#define I2C_TIMEOUT 4 47#define I2C_SW_TIMEOUT 8 48#define I2C_ABORT 0x10 49 50/* I2C transaction flags */ 51#define I2C_NO_STOP 1 52#define I2C_RESTART 2 53 54#define to_amdgpu_device(x) (container_of(x, struct amdgpu_ras, eeprom_control.eeprom_accessor))->adev 55#define to_eeprom_control(x) container_of(x, struct amdgpu_ras_eeprom_control, eeprom_accessor) 56 57static void smu_v11_0_i2c_set_clock_gating(struct i2c_adapter *control, bool en) 58{ 59 struct amdgpu_device *adev = to_amdgpu_device(control); 60 uint32_t reg = RREG32_SOC15(SMUIO, 0, mmSMUIO_PWRMGT); 61 62 reg = REG_SET_FIELD(reg, SMUIO_PWRMGT, i2c_clk_gate_en, en ? 1 : 0); 63 WREG32_SOC15(SMUIO, 0, mmSMUIO_PWRMGT, reg); 64} 65 66 67static void smu_v11_0_i2c_enable(struct i2c_adapter *control, bool enable) 68{ 69 struct amdgpu_device *adev = to_amdgpu_device(control); 70 71 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE, enable ? 1 : 0); 72} 73 74static void smu_v11_0_i2c_clear_status(struct i2c_adapter *control) 75{ 76 struct amdgpu_device *adev = to_amdgpu_device(control); 77 /* do */ 78 { 79 RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_CLR_INTR); 80 81 } /* while (reg_CKSVII2C_ic_clr_intr == 0) */ 82} 83 84static void smu_v11_0_i2c_configure(struct i2c_adapter *control) 85{ 86 struct amdgpu_device *adev = to_amdgpu_device(control); 87 uint32_t reg = 0; 88 89 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_SLAVE_DISABLE, 1); 90 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_RESTART_EN, 1); 91 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_10BITADDR_MASTER, 0); 92 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_10BITADDR_SLAVE, 0); 93 /* Standard mode */ 94 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_MAX_SPEED_MODE, 2); 95 reg = REG_SET_FIELD(reg, CKSVII2C_IC_CON, IC_MASTER_MODE, 1); 96 97 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_CON, reg); 98} 99 100static void smu_v11_0_i2c_set_clock(struct i2c_adapter *control) 101{ 102 struct amdgpu_device *adev = to_amdgpu_device(control); 103 104 /* 105 * Standard mode speed, These values are taken from SMUIO MAS, 106 * but are different from what is given is 107 * Synopsys spec. The values here are based on assumption 108 * that refclock is 100MHz 109 * 110 * Configuration for standard mode; Speed = 100kbps 111 * Scale linearly, for now only support standard speed clock 112 * This will work only with 100M ref clock 113 * 114 * TBD:Change the calculation to take into account ref clock values also. 115 */ 116 117 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_FS_SPKLEN, 2); 118 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_SS_SCL_HCNT, 120); 119 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_SS_SCL_LCNT, 130); 120 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_SDA_HOLD, 20); 121} 122 123static void smu_v11_0_i2c_set_address(struct i2c_adapter *control, uint8_t address) 124{ 125 struct amdgpu_device *adev = to_amdgpu_device(control); 126 127 /* Convert fromr 8-bit to 7-bit address */ 128 address >>= 1; 129 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_TAR, (address & 0xFF)); 130} 131 132static uint32_t smu_v11_0_i2c_poll_tx_status(struct i2c_adapter *control) 133{ 134 struct amdgpu_device *adev = to_amdgpu_device(control); 135 uint32_t ret = I2C_OK; 136 uint32_t reg, reg_c_tx_abrt_source; 137 138 /*Check if transmission is completed */ 139 unsigned long timeout_counter = jiffies + msecs_to_jiffies(20); 140 141 do { 142 if (time_after(jiffies, timeout_counter)) { 143 ret |= I2C_SW_TIMEOUT; 144 break; 145 } 146 147 reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS); 148 149 } while (REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFE) == 0); 150 151 if (ret != I2C_OK) 152 return ret; 153 154 /* This only checks if NAK is received and transaction got aborted */ 155 reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_INTR_STAT); 156 157 if (REG_GET_FIELD(reg, CKSVII2C_IC_INTR_STAT, R_TX_ABRT) == 1) { 158 reg_c_tx_abrt_source = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_TX_ABRT_SOURCE); 159 DRM_INFO("TX was terminated, IC_TX_ABRT_SOURCE val is:%x", reg_c_tx_abrt_source); 160 161 /* Check for stop due to NACK */ 162 if (REG_GET_FIELD(reg_c_tx_abrt_source, 163 CKSVII2C_IC_TX_ABRT_SOURCE, 164 ABRT_TXDATA_NOACK) == 1) { 165 166 ret |= I2C_NAK_TXDATA_NOACK; 167 168 } else if (REG_GET_FIELD(reg_c_tx_abrt_source, 169 CKSVII2C_IC_TX_ABRT_SOURCE, 170 ABRT_7B_ADDR_NOACK) == 1) { 171 172 ret |= I2C_NAK_7B_ADDR_NOACK; 173 } else { 174 ret |= I2C_ABORT; 175 } 176 177 smu_v11_0_i2c_clear_status(control); 178 } 179 180 return ret; 181} 182 183static uint32_t smu_v11_0_i2c_poll_rx_status(struct i2c_adapter *control) 184{ 185 struct amdgpu_device *adev = to_amdgpu_device(control); 186 uint32_t ret = I2C_OK; 187 uint32_t reg_ic_status, reg_c_tx_abrt_source; 188 189 reg_c_tx_abrt_source = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_TX_ABRT_SOURCE); 190 191 /* If slave is not present */ 192 if (REG_GET_FIELD(reg_c_tx_abrt_source, 193 CKSVII2C_IC_TX_ABRT_SOURCE, 194 ABRT_7B_ADDR_NOACK) == 1) { 195 ret |= I2C_NAK_7B_ADDR_NOACK; 196 197 smu_v11_0_i2c_clear_status(control); 198 } else { /* wait till some data is there in RXFIFO */ 199 /* Poll for some byte in RXFIFO */ 200 unsigned long timeout_counter = jiffies + msecs_to_jiffies(20); 201 202 do { 203 if (time_after(jiffies, timeout_counter)) { 204 ret |= I2C_SW_TIMEOUT; 205 break; 206 } 207 208 reg_ic_status = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS); 209 210 } while (REG_GET_FIELD(reg_ic_status, CKSVII2C_IC_STATUS, RFNE) == 0); 211 } 212 213 return ret; 214} 215 216 217 218 219/** 220 * smu_v11_0_i2c_transmit - Send a block of data over the I2C bus to a slave device. 221 * 222 * @address: The I2C address of the slave device. 223 * @data: The data to transmit over the bus. 224 * @numbytes: The amount of data to transmit. 225 * @i2c_flag: Flags for transmission 226 * 227 * Returns 0 on success or error. 228 */ 229static uint32_t smu_v11_0_i2c_transmit(struct i2c_adapter *control, 230 uint8_t address, uint8_t *data, 231 uint32_t numbytes, uint32_t i2c_flag) 232{ 233 struct amdgpu_device *adev = to_amdgpu_device(control); 234 uint32_t bytes_sent, reg, ret = 0; 235 unsigned long timeout_counter; 236 237 bytes_sent = 0; 238 239 DRM_DEBUG_DRIVER("I2C_Transmit(), address = %x, bytes = %d , data: ", 240 (uint16_t)address, numbytes); 241 242 if (drm_debug_enabled(DRM_UT_DRIVER)) { 243 print_hex_dump(KERN_INFO, "data: ", DUMP_PREFIX_NONE, 244 16, 1, data, numbytes, false); 245 } 246 247 /* Set the I2C slave address */ 248 smu_v11_0_i2c_set_address(control, address); 249 /* Enable I2C */ 250 smu_v11_0_i2c_enable(control, true); 251 252 /* Clear status bits */ 253 smu_v11_0_i2c_clear_status(control); 254 255 256 timeout_counter = jiffies + msecs_to_jiffies(20); 257 258 while (numbytes > 0) { 259 reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS); 260 if (REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)) { 261 do { 262 reg = 0; 263 /* 264 * Prepare transaction, no need to set RESTART. I2C engine will send 265 * START as soon as it sees data in TXFIFO 266 */ 267 if (bytes_sent == 0) 268 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, RESTART, 269 (i2c_flag & I2C_RESTART) ? 1 : 0); 270 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT, data[bytes_sent]); 271 272 /* determine if we need to send STOP bit or not */ 273 if (numbytes == 1) 274 /* Final transaction, so send stop unless I2C_NO_STOP */ 275 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, STOP, 276 (i2c_flag & I2C_NO_STOP) ? 0 : 1); 277 /* Write */ 278 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, CMD, 0); 279 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_DATA_CMD, reg); 280 281 /* Record that the bytes were transmitted */ 282 bytes_sent++; 283 numbytes--; 284 285 reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_STATUS); 286 287 } while (numbytes && REG_GET_FIELD(reg, CKSVII2C_IC_STATUS, TFNF)); 288 } 289 290 /* 291 * We waited too long for the transmission FIFO to become not-full. 292 * Exit the loop with error. 293 */ 294 if (time_after(jiffies, timeout_counter)) { 295 ret |= I2C_SW_TIMEOUT; 296 goto Err; 297 } 298 } 299 300 ret = smu_v11_0_i2c_poll_tx_status(control); 301 302Err: 303 /* Any error, no point in proceeding */ 304 if (ret != I2C_OK) { 305 if (ret & I2C_SW_TIMEOUT) 306 DRM_ERROR("TIMEOUT ERROR !!!"); 307 308 if (ret & I2C_NAK_7B_ADDR_NOACK) 309 DRM_ERROR("Received I2C_NAK_7B_ADDR_NOACK !!!"); 310 311 312 if (ret & I2C_NAK_TXDATA_NOACK) 313 DRM_ERROR("Received I2C_NAK_TXDATA_NOACK !!!"); 314 } 315 316 return ret; 317} 318 319 320/** 321 * smu_v11_0_i2c_receive - Receive a block of data over the I2C bus from a slave device. 322 * 323 * @address: The I2C address of the slave device. 324 * @numbytes: The amount of data to transmit. 325 * @i2c_flag: Flags for transmission 326 * 327 * Returns 0 on success or error. 328 */ 329static uint32_t smu_v11_0_i2c_receive(struct i2c_adapter *control, 330 uint8_t address, uint8_t *data, 331 uint32_t numbytes, uint8_t i2c_flag) 332{ 333 struct amdgpu_device *adev = to_amdgpu_device(control); 334 uint32_t bytes_received, ret = I2C_OK; 335 336 bytes_received = 0; 337 338 /* Set the I2C slave address */ 339 smu_v11_0_i2c_set_address(control, address); 340 341 /* Enable I2C */ 342 smu_v11_0_i2c_enable(control, true); 343 344 while (numbytes > 0) { 345 uint32_t reg = 0; 346 347 smu_v11_0_i2c_clear_status(control); 348 349 350 /* Prepare transaction */ 351 352 /* Each time we disable I2C, so this is not a restart */ 353 if (bytes_received == 0) 354 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, RESTART, 355 (i2c_flag & I2C_RESTART) ? 1 : 0); 356 357 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT, 0); 358 /* Read */ 359 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, CMD, 1); 360 361 /* Transmitting last byte */ 362 if (numbytes == 1) 363 /* Final transaction, so send stop if requested */ 364 reg = REG_SET_FIELD(reg, CKSVII2C_IC_DATA_CMD, STOP, 365 (i2c_flag & I2C_NO_STOP) ? 0 : 1); 366 367 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_DATA_CMD, reg); 368 369 ret = smu_v11_0_i2c_poll_rx_status(control); 370 371 /* Any error, no point in proceeding */ 372 if (ret != I2C_OK) { 373 if (ret & I2C_SW_TIMEOUT) 374 DRM_ERROR("TIMEOUT ERROR !!!"); 375 376 if (ret & I2C_NAK_7B_ADDR_NOACK) 377 DRM_ERROR("Received I2C_NAK_7B_ADDR_NOACK !!!"); 378 379 if (ret & I2C_NAK_TXDATA_NOACK) 380 DRM_ERROR("Received I2C_NAK_TXDATA_NOACK !!!"); 381 382 break; 383 } 384 385 reg = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_DATA_CMD); 386 data[bytes_received] = REG_GET_FIELD(reg, CKSVII2C_IC_DATA_CMD, DAT); 387 388 /* Record that the bytes were received */ 389 bytes_received++; 390 numbytes--; 391 } 392 393 DRM_DEBUG_DRIVER("I2C_Receive(), address = %x, bytes = %d, data :", 394 (uint16_t)address, bytes_received); 395 396 if (drm_debug_enabled(DRM_UT_DRIVER)) { 397 print_hex_dump(KERN_INFO, "data: ", DUMP_PREFIX_NONE, 398 16, 1, data, bytes_received, false); 399 } 400 401 return ret; 402} 403 404static void smu_v11_0_i2c_abort(struct i2c_adapter *control) 405{ 406 struct amdgpu_device *adev = to_amdgpu_device(control); 407 uint32_t reg = 0; 408 409 /* Enable I2C engine; */ 410 reg = REG_SET_FIELD(reg, CKSVII2C_IC_ENABLE, ENABLE, 1); 411 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE, reg); 412 413 /* Abort previous transaction */ 414 reg = REG_SET_FIELD(reg, CKSVII2C_IC_ENABLE, ABORT, 1); 415 WREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE, reg); 416 417 DRM_DEBUG_DRIVER("I2C_Abort() Done."); 418} 419 420 421static bool smu_v11_0_i2c_activity_done(struct i2c_adapter *control) 422{ 423 struct amdgpu_device *adev = to_amdgpu_device(control); 424 425 const uint32_t IDLE_TIMEOUT = 1024; 426 uint32_t timeout_count = 0; 427 uint32_t reg_ic_enable, reg_ic_enable_status, reg_ic_clr_activity; 428 429 reg_ic_enable_status = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE_STATUS); 430 reg_ic_enable = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE); 431 432 433 if ((REG_GET_FIELD(reg_ic_enable, CKSVII2C_IC_ENABLE, ENABLE) == 0) && 434 (REG_GET_FIELD(reg_ic_enable_status, CKSVII2C_IC_ENABLE_STATUS, IC_EN) == 1)) { 435 /* 436 * Nobody is using I2C engine, but engine remains active because 437 * someone missed to send STOP 438 */ 439 smu_v11_0_i2c_abort(control); 440 } else if (REG_GET_FIELD(reg_ic_enable, CKSVII2C_IC_ENABLE, ENABLE) == 0) { 441 /* Nobody is using I2C engine */ 442 return true; 443 } 444 445 /* Keep reading activity bit until it's cleared */ 446 do { 447 reg_ic_clr_activity = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_CLR_ACTIVITY); 448 449 if (REG_GET_FIELD(reg_ic_clr_activity, 450 CKSVII2C_IC_CLR_ACTIVITY, CLR_ACTIVITY) == 0) 451 return true; 452 453 ++timeout_count; 454 455 } while (timeout_count < IDLE_TIMEOUT); 456 457 return false; 458} 459 460static void smu_v11_0_i2c_init(struct i2c_adapter *control) 461{ 462 /* Disable clock gating */ 463 smu_v11_0_i2c_set_clock_gating(control, false); 464 465 if (!smu_v11_0_i2c_activity_done(control)) 466 DRM_WARN("I2C busy !"); 467 468 /* Disable I2C */ 469 smu_v11_0_i2c_enable(control, false); 470 471 /* Configure I2C to operate as master and in standard mode */ 472 smu_v11_0_i2c_configure(control); 473 474 /* Initialize the clock to 50 kHz default */ 475 smu_v11_0_i2c_set_clock(control); 476 477} 478 479static void smu_v11_0_i2c_fini(struct i2c_adapter *control) 480{ 481 struct amdgpu_device *adev = to_amdgpu_device(control); 482 uint32_t reg_ic_enable_status, reg_ic_enable; 483 484 smu_v11_0_i2c_enable(control, false); 485 486 /* Double check if disabled, else force abort */ 487 reg_ic_enable_status = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE_STATUS); 488 reg_ic_enable = RREG32_SOC15(SMUIO, 0, mmCKSVII2C_IC_ENABLE); 489 490 if ((REG_GET_FIELD(reg_ic_enable, CKSVII2C_IC_ENABLE, ENABLE) == 0) && 491 (REG_GET_FIELD(reg_ic_enable_status, 492 CKSVII2C_IC_ENABLE_STATUS, IC_EN) == 1)) { 493 /* 494 * Nobody is using I2C engine, but engine remains active because 495 * someone missed to send STOP 496 */ 497 smu_v11_0_i2c_abort(control); 498 } 499 500 /* Restore clock gating */ 501 502 /* 503 * TODO Reenabling clock gating seems to break subsequent SMU operation 504 * on the I2C bus. My guess is that SMU doesn't disable clock gating like 505 * we do here before working with the bus. So for now just don't restore 506 * it but later work with SMU to see if they have this issue and can 507 * update their code appropriately 508 */ 509 /* smu_v11_0_i2c_set_clock_gating(control, true); */ 510 511} 512 513static bool smu_v11_0_i2c_bus_lock(struct i2c_adapter *control) 514{ 515 struct amdgpu_device *adev = to_amdgpu_device(control); 516 517 /* Send PPSMC_MSG_RequestI2CBus */ 518 if (!adev->powerplay.pp_funcs->smu_i2c_bus_access) 519 goto Fail; 520 521 522 if (!adev->powerplay.pp_funcs->smu_i2c_bus_access(adev->powerplay.pp_handle, true)) 523 return true; 524 525Fail: 526 return false; 527} 528 529static bool smu_v11_0_i2c_bus_unlock(struct i2c_adapter *control) 530{ 531 struct amdgpu_device *adev = to_amdgpu_device(control); 532 533 /* Send PPSMC_MSG_RequestI2CBus */ 534 if (!adev->powerplay.pp_funcs->smu_i2c_bus_access) 535 goto Fail; 536 537 /* Send PPSMC_MSG_ReleaseI2CBus */ 538 if (!adev->powerplay.pp_funcs->smu_i2c_bus_access(adev->powerplay.pp_handle, 539 false)) 540 return true; 541 542Fail: 543 return false; 544} 545 546/***************************** EEPROM I2C GLUE ****************************/ 547 548static uint32_t smu_v11_0_i2c_eeprom_read_data(struct i2c_adapter *control, 549 uint8_t address, 550 uint8_t *data, 551 uint32_t numbytes) 552{ 553 uint32_t ret = 0; 554 555 /* First 2 bytes are dummy write to set EEPROM address */ 556 ret = smu_v11_0_i2c_transmit(control, address, data, 2, I2C_NO_STOP); 557 if (ret != I2C_OK) 558 goto Fail; 559 560 /* Now read data starting with that address */ 561 ret = smu_v11_0_i2c_receive(control, address, data + 2, numbytes - 2, 562 I2C_RESTART); 563 564Fail: 565 if (ret != I2C_OK) 566 DRM_ERROR("ReadData() - I2C error occurred :%x", ret); 567 568 return ret; 569} 570 571static uint32_t smu_v11_0_i2c_eeprom_write_data(struct i2c_adapter *control, 572 uint8_t address, 573 uint8_t *data, 574 uint32_t numbytes) 575{ 576 uint32_t ret; 577 578 ret = smu_v11_0_i2c_transmit(control, address, data, numbytes, 0); 579 580 if (ret != I2C_OK) 581 DRM_ERROR("WriteI2CData() - I2C error occurred :%x", ret); 582 else 583 /* 584 * According to EEPROM spec there is a MAX of 10 ms required for 585 * EEPROM to flush internal RX buffer after STOP was issued at the 586 * end of write transaction. During this time the EEPROM will not be 587 * responsive to any more commands - so wait a bit more. 588 * 589 * TODO Improve to wait for first ACK for slave address after 590 * internal write cycle done. 591 */ 592 msleep(10); 593 594 return ret; 595 596} 597 598static void lock_bus(struct i2c_adapter *i2c, unsigned int flags) 599{ 600 struct amdgpu_ras_eeprom_control *control = to_eeprom_control(i2c); 601 602 if (!smu_v11_0_i2c_bus_lock(i2c)) { 603 DRM_ERROR("Failed to lock the bus from SMU"); 604 return; 605 } 606 607 control->bus_locked = true; 608} 609 610static int trylock_bus(struct i2c_adapter *i2c, unsigned int flags) 611{ 612 WARN_ONCE(1, "This operation not supposed to run in atomic context!"); 613 return false; 614} 615 616static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags) 617{ 618 struct amdgpu_ras_eeprom_control *control = to_eeprom_control(i2c); 619 620 if (!smu_v11_0_i2c_bus_unlock(i2c)) { 621 DRM_ERROR("Failed to unlock the bus from SMU"); 622 return; 623 } 624 625 control->bus_locked = false; 626} 627 628static const struct i2c_lock_operations smu_v11_0_i2c_i2c_lock_ops = { 629 .lock_bus = lock_bus, 630 .trylock_bus = trylock_bus, 631 .unlock_bus = unlock_bus, 632}; 633 634static int smu_v11_0_i2c_eeprom_i2c_xfer(struct i2c_adapter *i2c_adap, 635 struct i2c_msg *msgs, int num) 636{ 637 int i, ret; 638 struct amdgpu_ras_eeprom_control *control = to_eeprom_control(i2c_adap); 639 640 if (!control->bus_locked) { 641 DRM_ERROR("I2C bus unlocked, stopping transaction!"); 642 return -EIO; 643 } 644 645 smu_v11_0_i2c_init(i2c_adap); 646 647 for (i = 0; i < num; i++) { 648 if (msgs[i].flags & I2C_M_RD) 649 ret = smu_v11_0_i2c_eeprom_read_data(i2c_adap, 650 (uint8_t)msgs[i].addr, 651 msgs[i].buf, msgs[i].len); 652 else 653 ret = smu_v11_0_i2c_eeprom_write_data(i2c_adap, 654 (uint8_t)msgs[i].addr, 655 msgs[i].buf, msgs[i].len); 656 657 if (ret != I2C_OK) { 658 num = -EIO; 659 break; 660 } 661 } 662 663 smu_v11_0_i2c_fini(i2c_adap); 664 return num; 665} 666 667static u32 smu_v11_0_i2c_eeprom_i2c_func(struct i2c_adapter *adap) 668{ 669 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 670} 671 672 673static const struct i2c_algorithm smu_v11_0_i2c_eeprom_i2c_algo = { 674 .master_xfer = smu_v11_0_i2c_eeprom_i2c_xfer, 675 .functionality = smu_v11_0_i2c_eeprom_i2c_func, 676}; 677 678int smu_v11_0_i2c_eeprom_control_init(struct i2c_adapter *control) 679{ 680 struct amdgpu_device *adev = to_amdgpu_device(control); 681 int res; 682 683 control->owner = THIS_MODULE; 684 control->class = I2C_CLASS_SPD; 685 control->dev.parent = pci_dev_dev(adev->pdev); 686 control->algo = &smu_v11_0_i2c_eeprom_i2c_algo; 687 snprintf(control->name, sizeof(control->name), "RAS EEPROM"); 688 control->lock_ops = &smu_v11_0_i2c_i2c_lock_ops; 689 690 res = i2c_add_adapter(control); 691 if (res) 692 DRM_ERROR("Failed to register hw i2c, err: %d\n", res); 693 694 return res; 695} 696 697void smu_v11_0_i2c_eeprom_control_fini(struct i2c_adapter *control) 698{ 699 i2c_del_adapter(control); 700} 701 702/* 703 * Keep this for future unit test if bugs arise 704 */ 705#if 0 706#define I2C_TARGET_ADDR 0xA0 707 708bool smu_v11_0_i2c_test_bus(struct i2c_adapter *control) 709{ 710 711 uint32_t ret = I2C_OK; 712 uint8_t data[6] = {0xf, 0, 0xde, 0xad, 0xbe, 0xef}; 713 714 715 DRM_INFO("Begin"); 716 717 if (!smu_v11_0_i2c_bus_lock(control)) { 718 DRM_ERROR("Failed to lock the bus!."); 719 return false; 720 } 721 722 smu_v11_0_i2c_init(control); 723 724 /* Write 0xde to address 0x0000 on the EEPROM */ 725 ret = smu_v11_0_i2c_eeprom_write_data(control, I2C_TARGET_ADDR, data, 6); 726 727 ret = smu_v11_0_i2c_eeprom_read_data(control, I2C_TARGET_ADDR, data, 6); 728 729 smu_v11_0_i2c_fini(control); 730 731 smu_v11_0_i2c_bus_unlock(control); 732 733 734 DRM_INFO("End"); 735 return true; 736} 737#endif 738