Merge tag 'defconfig-5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_fru_eeprom.c
index 39b6c6b..7709cae 100644 (file)
 #include "smu_v11_0_i2c.h"
 #include "atom.h"
 #include "amdgpu_fru_eeprom.h"
+#include "amdgpu_eeprom.h"
 
-#define I2C_PRODUCT_INFO_ADDR          0xAC
-#define I2C_PRODUCT_INFO_ADDR_SIZE     0x2
-#define I2C_PRODUCT_INFO_OFFSET                0xC0
+#define FRU_EEPROM_MADDR        0x60000
+#define I2C_PRODUCT_INFO_OFFSET 0xC0
 
 static bool is_fru_eeprom_supported(struct amdgpu_device *adev)
 {
@@ -62,19 +62,11 @@ static bool is_fru_eeprom_supported(struct amdgpu_device *adev)
 }
 
 static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,
-                          unsigned char *buff)
+                                 unsigned char *buff)
 {
        int ret, size;
-       struct i2c_msg msg = {
-                       .addr   = I2C_PRODUCT_INFO_ADDR,
-                       .flags  = I2C_M_RD,
-                       .buf    = buff,
-       };
-       buff[0] = 0;
-       buff[1] = addrptr;
-       msg.len = I2C_PRODUCT_INFO_ADDR_SIZE + 1;
-       ret = i2c_transfer(&adev->pm.smu_i2c, &msg, 1);
 
+       ret = amdgpu_eeprom_read(&adev->pm.smu_i2c, addrptr, buff, 1);
        if (ret < 1) {
                DRM_WARN("FRU: Failed to get size field");
                return ret;
@@ -83,13 +75,9 @@ static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,
        /* The size returned by the i2c requires subtraction of 0xC0 since the
         * size apparently always reports as 0xC0+actual size.
         */
-       size = buff[2] - I2C_PRODUCT_INFO_OFFSET;
-       /* Add 1 since address field was 1 byte */
-       buff[1] = addrptr + 1;
-
-       msg.len = I2C_PRODUCT_INFO_ADDR_SIZE + size;
-       ret = i2c_transfer(&adev->pm.smu_i2c, &msg, 1);
+       size = buff[0] - I2C_PRODUCT_INFO_OFFSET;
 
+       ret = amdgpu_eeprom_read(&adev->pm.smu_i2c, addrptr + 1, buff, size);
        if (ret < 1) {
                DRM_WARN("FRU: Failed to get data field");
                return ret;
@@ -101,8 +89,8 @@ static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,
 int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
 {
        unsigned char buff[34];
-       int addrptr, size;
-       int len;
+       u32 addrptr;
+       int size, len;
 
        if (!is_fru_eeprom_supported(adev))
                return 0;
@@ -125,7 +113,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
         * Bytes 8-a are all 1-byte and refer to the size of the entire struct,
         * and the language field, so just start from 0xb, manufacturer size
         */
-       addrptr = 0xb;
+       addrptr = FRU_EEPROM_MADDR + 0xb;
        size = amdgpu_fru_read_eeprom(adev, addrptr, buff);
        if (size < 1) {
                DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size);