#include "amdgpu_eeprom.h"
 
 #define FRU_EEPROM_MADDR        0x60000
-#define I2C_PRODUCT_INFO_OFFSET 0xC0
 
 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 *buf)
+                                 unsigned char *buf, size_t buf_size)
 {
-       int ret, size;
+       int ret;
+       u8 size;
 
        ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr, buf, 1);
        if (ret < 1) {
        /* The size returned by the i2c requires subtraction of 0xC0 since the
         * size apparently always reports as 0xC0+actual size.
         */
-       size = buf[0] - I2C_PRODUCT_INFO_OFFSET;
+       size = buf[0] & 0x3F;
+       size = min_t(size_t, size, buf_size);
 
-       ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr + 1, buf, size);
+       ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr + 1,
+                                buf, size);
        if (ret < 1) {
                DRM_WARN("FRU: Failed to get data field");
                return ret;
         * and the language field, so just start from 0xb, manufacturer size
         */
        addrptr = FRU_EEPROM_MADDR + 0xb;
-       size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
+       size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
        if (size < 1) {
                DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size);
                return -EINVAL;
         * size field being 1 byte. This pattern continues below.
         */
        addrptr += size + 1;
-       size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
+       size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
        if (size < 1) {
                DRM_ERROR("Failed to read FRU product name, ret:%d", size);
                return -EINVAL;
        adev->product_name[len] = '\0';
 
        addrptr += size + 1;
-       size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
+       size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
        if (size < 1) {
                DRM_ERROR("Failed to read FRU product number, ret:%d", size);
                return -EINVAL;
        adev->product_number[len] = '\0';
 
        addrptr += size + 1;
-       size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
+       size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
 
        if (size < 1) {
                DRM_ERROR("Failed to read FRU product version, ret:%d", size);
        }
 
        addrptr += size + 1;
-       size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
+       size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
 
        if (size < 1) {
                DRM_ERROR("Failed to read FRU serial number, ret:%d", size);