[PATCH] drm/amd: Refactor find_system_memory()

Mario Limonciello superm1 at kernel.org
Wed Feb 5 19:31:34 UTC 2025


On 2/4/2025 17:19, Felix Kuehling wrote:
> 
> On 2025-02-04 17:21, Mario Limonciello wrote:
>> From: Mario Limonciello <mario.limonciello at amd.com>
>>
>> find_system_memory() pulls out two fields from an SMBIOS type 17
>> device and sets them on KFD devices. This however is pulling from
>> the middle of the field in the SMBIOS device and leads to an unaligned
>> access.
>>
>> Instead use a struct representation to access the members and pull
>> out the two specific fields.
> 
> Isn't that still an unaligned access? I don't understand the purpose of this patch.

Unless I added wrong, it looked to me that the offset it was pulling 
from previously was incorrect.  So I was expecting it should be aligned 
(and less error prone) to pull from the correct offset from a struct.

> 
> One more comment inline.
> 
>>
>> Link: https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.8.0.pdf p99
>> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 27 +++++++++++------------
>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.h | 17 ++++++++++++++
>>   2 files changed, 30 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>> index ceb9fb475ef13..93d3924dfcba0 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
>> @@ -968,24 +968,23 @@ static void kfd_update_system_properties(void)
>>   	up_read(&topology_lock);
>>   }
>>   
>> -static void find_system_memory(const struct dmi_header *dm,
>> -	void *private)
>> +static void find_system_memory(const struct dmi_header *dm, void *private)
>>   {
>> +	struct dmi_mem_device *memdev = (struct dmi_mem_device *)(dm);
> 
> I think it would be cleaner to use container_of to get a pointer to the structure containing the header.

Ack.

> 
> Regards,
>    Felix
> 
>>   	struct kfd_mem_properties *mem;
>> -	u16 mem_width, mem_clock;
>>   	struct kfd_topology_device *kdev =
>>   		(struct kfd_topology_device *)private;
>> -	const u8 *dmi_data = (const u8 *)(dm + 1);
>> -
>> -	if (dm->type == DMI_ENTRY_MEM_DEVICE && dm->length >= 0x15) {
>> -		mem_width = (u16)(*(const u16 *)(dmi_data + 0x6));
>> -		mem_clock = (u16)(*(const u16 *)(dmi_data + 0x11));
>> -		list_for_each_entry(mem, &kdev->mem_props, list) {
>> -			if (mem_width != 0xFFFF && mem_width != 0)
>> -				mem->width = mem_width;
>> -			if (mem_clock != 0)
>> -				mem->mem_clk_max = mem_clock;
>> -		}
>> +
>> +	if (memdev->header.type != DMI_ENTRY_MEM_DEVICE)
>> +		return;
>> +	if (memdev->header.length < sizeof(struct dmi_mem_device))
>> +		return;
>> +
>> +	list_for_each_entry(mem, &kdev->mem_props, list) {
>> +		if (memdev->total_width != 0xFFFF && memdev->total_width != 0)
>> +			mem->width = memdev->total_width;
>> +		if (memdev->speed != 0)
>> +			mem->mem_clk_max = memdev->speed;
>>   	}
>>   }
>>   
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>> index 155b5c410af16..f06c9db7ddde9 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
>> @@ -24,6 +24,7 @@
>>   #ifndef __KFD_TOPOLOGY_H__
>>   #define __KFD_TOPOLOGY_H__
>>   
>> +#include <linux/dmi.h>
>>   #include <linux/types.h>
>>   #include <linux/list.h>
>>   #include <linux/kfd_sysfs.h>
>> @@ -179,6 +180,22 @@ struct kfd_system_properties {
>>   	struct attribute	attr_props;
>>   };
>>   
>> +struct dmi_mem_device {
>> +	struct dmi_header header;
>> +	u16 physical_handle;
>> +	u16 error_handle;
>> +	u16 total_width;
>> +	u16 data_width;
>> +	u16 size;
>> +	u8 form_factor;
>> +	u8 device_set;
>> +	u8 device_locator;
>> +	u8 bank_locator;
>> +	u8 memory_type;
>> +	u16 type_detail;
>> +	u16 speed;
>> +} __packed;
>> +
>>   struct kfd_topology_device *kfd_create_topology_device(
>>   		struct list_head *device_list);
>>   void kfd_release_topology_device_list(struct list_head *device_list);
> 



More information about the dri-devel mailing list