3030#include  "amdgpu_eeprom.h" 
3131
3232#define  FRU_EEPROM_MADDR         0x60000
33- #define  I2C_PRODUCT_INFO_OFFSET  0xC0
3433
3534static  bool  is_fru_eeprom_supported (struct  amdgpu_device  * adev )
3635{
@@ -77,9 +76,10 @@ static bool is_fru_eeprom_supported(struct amdgpu_device *adev)
7776}
7877
7978static  int  amdgpu_fru_read_eeprom (struct  amdgpu_device  * adev , uint32_t  addrptr ,
80- 				  unsigned char   * buf )
79+ 				  unsigned char   * buf ,  size_t   buf_size )
8180{
82- 	int  ret , size ;
81+ 	int  ret ;
82+ 	u8  size ;
8383
8484	ret  =  amdgpu_eeprom_read (adev -> pm .fru_eeprom_i2c_bus , addrptr , buf , 1 );
8585	if  (ret  <  1 ) {
@@ -90,9 +90,11 @@ static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,
9090	/* The size returned by the i2c requires subtraction of 0xC0 since the 
9191	 * size apparently always reports as 0xC0+actual size. 
9292	 */ 
93- 	size  =  buf [0 ] -  I2C_PRODUCT_INFO_OFFSET ;
93+ 	size  =  buf [0 ] &  0x3F ;
94+ 	size  =  min_t (size_t , size , buf_size );
9495
95- 	ret  =  amdgpu_eeprom_read (adev -> pm .fru_eeprom_i2c_bus , addrptr  +  1 , buf , size );
96+ 	ret  =  amdgpu_eeprom_read (adev -> pm .fru_eeprom_i2c_bus , addrptr  +  1 ,
97+ 				 buf , size );
9698	if  (ret  <  1 ) {
9799		DRM_WARN ("FRU: Failed to get data field" );
98100		return  ret ;
@@ -129,7 +131,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
129131	 * and the language field, so just start from 0xb, manufacturer size 
130132	 */ 
131133	addrptr  =  FRU_EEPROM_MADDR  +  0xb ;
132- 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf );
134+ 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf ,  sizeof ( buf ) );
133135	if  (size  <  1 ) {
134136		DRM_ERROR ("Failed to read FRU Manufacturer, ret:%d" , size );
135137		return  - EINVAL ;
@@ -139,7 +141,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
139141	 * size field being 1 byte. This pattern continues below. 
140142	 */ 
141143	addrptr  +=  size  +  1 ;
142- 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf );
144+ 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf ,  sizeof ( buf ) );
143145	if  (size  <  1 ) {
144146		DRM_ERROR ("Failed to read FRU product name, ret:%d" , size );
145147		return  - EINVAL ;
@@ -155,7 +157,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
155157	adev -> product_name [len ] =  '\0' ;
156158
157159	addrptr  +=  size  +  1 ;
158- 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf );
160+ 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf ,  sizeof ( buf ) );
159161	if  (size  <  1 ) {
160162		DRM_ERROR ("Failed to read FRU product number, ret:%d" , size );
161163		return  - EINVAL ;
@@ -173,15 +175,15 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
173175	adev -> product_number [len ] =  '\0' ;
174176
175177	addrptr  +=  size  +  1 ;
176- 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf );
178+ 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf ,  sizeof ( buf ) );
177179
178180	if  (size  <  1 ) {
179181		DRM_ERROR ("Failed to read FRU product version, ret:%d" , size );
180182		return  - EINVAL ;
181183	}
182184
183185	addrptr  +=  size  +  1 ;
184- 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf );
186+ 	size  =  amdgpu_fru_read_eeprom (adev , addrptr , buf ,  sizeof ( buf ) );
185187
186188	if  (size  <  1 ) {
187189		DRM_ERROR ("Failed to read FRU serial number, ret:%d" , size );
0 commit comments