All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <christian.koenig@amd.com>
To: "Gu, JiaWei (Will)" <JiaWei.Gu@amd.com>,
	"amd-gfx@lists.freedesktop.org" <amd-gfx@lists.freedesktop.org>,
	"Nieto, David M" <David.Nieto@amd.com>,
	"maraeo@gmail.com" <maraeo@gmail.com>,
	"Deucher, Alexander" <Alexander.Deucher@amd.com>
Cc: "Deng, Emily" <Emily.Deng@amd.com>
Subject: Re: [PATCH] drm/amdgpu: Add vbios info ioctl interface
Date: Tue, 18 May 2021 15:17:01 +0200	[thread overview]
Message-ID: <1ec97d1f-aaa3-46c1-b702-378879e67cc5@amd.com> (raw)
In-Reply-To: <CH0PR12MB51560CD55134762EF8FE19E0F82C9@CH0PR12MB5156.namprd12.prod.outlook.com>

Well not an expert on that stuff, but looks like that should work for me.

Question is can you provide a patch to use that information in Mesa as 
well? Umr might be sufficient as well as justification for upstreaming, 
but I want to be better save than sorry.

Unless Marek has a better idea maybe add the vbios version to the string 
returned by GLX_MESA_query_renderer or something like that.

Thanks,
Christian.

Am 18.05.21 um 14:19 schrieb Gu, JiaWei (Will):
> [AMD Official Use Only - Internal Distribution Only]
>
> Hi all,
>
> Please help confirm that we're all fine with this new struct in uapi in this V3 patch:
>
> +struct drm_amdgpu_info_vbios {
> +	__u8 name[64];
> +	__u8 vbios_pn[64];
> +	__u32 version;
> +	__u8 vbios_ver_str[32];
> +	__u8 date[32];
> +};
>
> Best regards,
> Jiawei
>
> -----Original Message-----
> From: Jiawei Gu <Jiawei.Gu@amd.com>
> Sent: Tuesday, May 18, 2021 8:16 PM
> To: amd-gfx@lists.freedesktop.org; Koenig, Christian <Christian.Koenig@amd.com>; Nieto, David M <David.Nieto@amd.com>; maraeo@gmail.com; Deucher, Alexander <Alexander.Deucher@amd.com>
> Cc: Deng, Emily <Emily.Deng@amd.com>; Gu, JiaWei (Will) <JiaWei.Gu@amd.com>
> Subject: [PATCH] drm/amdgpu: Add vbios info ioctl interface
>
> Add AMDGPU_INFO_VBIOS_INFO subquery id for detailed vbios info.
>
> Provides a way for the user application to get the VBIOS information without having to parse the binary.
> It is useful for the user to be able to display in a simple way the VBIOS version in their system if they happen to encounter an issue.
>
> V2:
> Use numeric serial.
> Parse and expose vbios version string.
>
> V3:
> Remove redundant data in drm_amdgpu_info_vbios struct.
>
> Signed-off-by: Jiawei Gu <Jiawei.Gu@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c    |  15 ++
>   drivers/gpu/drm/amd/amdgpu/atom.c          | 172 +++++++++++++++++++++
>   drivers/gpu/drm/amd/amdgpu/atom.h          |  10 ++
>   drivers/gpu/drm/amd/include/atomfirmware.h |   5 +
>   include/uapi/drm/amdgpu_drm.h              |  10 ++
>   5 files changed, 212 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> index 8d12e474745a..524e4fe5efe8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
> @@ -861,6 +861,21 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>   					    min((size_t)size, (size_t)(bios_size - bios_offset)))
>   					? -EFAULT : 0;
>   		}
> +		case AMDGPU_INFO_VBIOS_INFO: {
> +			struct drm_amdgpu_info_vbios vbios_info = {};
> +			struct atom_context *atom_context;
> +
> +			atom_context = adev->mode_info.atom_context;
> +			memcpy(vbios_info.name, atom_context->name, sizeof(atom_context->name));
> +			memcpy(vbios_info.vbios_pn, atom_context->vbios_pn, sizeof(atom_context->vbios_pn));
> +			vbios_info.version = atom_context->version;
> +			memcpy(vbios_info.vbios_ver_str, atom_context->vbios_ver_str,
> +						sizeof(atom_context->vbios_ver_str));
> +			memcpy(vbios_info.date, atom_context->date,
> +sizeof(atom_context->date));
> +
> +			return copy_to_user(out, &vbios_info,
> +						min((size_t)size, sizeof(vbios_info))) ? -EFAULT : 0;
> +		}
>   		default:
>   			DRM_DEBUG_KMS("Invalid request %d\n",
>   					info->vbios_info.type);
> diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c
> index 3dcb8b32f48b..6fa2229b7229 100644
> --- a/drivers/gpu/drm/amd/amdgpu/atom.c
> +++ b/drivers/gpu/drm/amd/amdgpu/atom.c
> @@ -31,6 +31,7 @@
>   
>   #define ATOM_DEBUG
>   
> +#include "atomfirmware.h"
>   #include "atom.h"
>   #include "atom-names.h"
>   #include "atom-bits.h"
> @@ -1299,12 +1300,168 @@ static void atom_index_iio(struct atom_context *ctx, int base)
>   	}
>   }
>   
> +static void atom_get_vbios_name(struct atom_context *ctx) {
> +	unsigned char *p_rom;
> +	unsigned char str_num;
> +	unsigned short off_to_vbios_str;
> +	unsigned char *c_ptr;
> +	int name_size;
> +	int i;
> +
> +	const char *na = "--N/A--";
> +	char *back;
> +
> +	p_rom = ctx->bios;
> +
> +	str_num = *(p_rom + OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS);
> +	if (str_num != 0) {
> +		off_to_vbios_str =
> +			*(unsigned short *)(p_rom + OFFSET_TO_GET_ATOMBIOS_STRING_START);
> +
> +		c_ptr = (unsigned char *)(p_rom + off_to_vbios_str);
> +	} else {
> +		/* do not know where to find name */
> +		memcpy(ctx->name, na, 7);
> +		ctx->name[7] = 0;
> +		return;
> +	}
> +
> +	/*
> +	 * skip the atombios strings, usually 4
> +	 * 1st is P/N, 2nd is ASIC, 3rd is PCI type, 4th is Memory type
> +	 */
> +	for (i = 0; i < str_num; i++) {
> +		while (*c_ptr != 0)
> +			c_ptr++;
> +		c_ptr++;
> +	}
> +
> +	/* skip the following 2 chars: 0x0D 0x0A */
> +	c_ptr += 2;
> +
> +	name_size = strnlen(c_ptr, STRLEN_LONG - 1);
> +	memcpy(ctx->name, c_ptr, name_size);
> +	back = ctx->name + name_size;
> +	while ((*--back) == ' ')
> +		;
> +	*(back + 1) = '\0';
> +}
> +
> +static void atom_get_vbios_date(struct atom_context *ctx) {
> +	unsigned char *p_rom;
> +	unsigned char *date_in_rom;
> +
> +	p_rom = ctx->bios;
> +
> +	date_in_rom = p_rom + OFFSET_TO_VBIOS_DATE;
> +
> +	ctx->date[0] = '2';
> +	ctx->date[1] = '0';
> +	ctx->date[2] = date_in_rom[6];
> +	ctx->date[3] = date_in_rom[7];
> +	ctx->date[4] = '/';
> +	ctx->date[5] = date_in_rom[0];
> +	ctx->date[6] = date_in_rom[1];
> +	ctx->date[7] = '/';
> +	ctx->date[8] = date_in_rom[3];
> +	ctx->date[9] = date_in_rom[4];
> +	ctx->date[10] = ' ';
> +	ctx->date[11] = date_in_rom[9];
> +	ctx->date[12] = date_in_rom[10];
> +	ctx->date[13] = date_in_rom[11];
> +	ctx->date[14] = date_in_rom[12];
> +	ctx->date[15] = date_in_rom[13];
> +	ctx->date[16] = '\0';
> +}
> +
> +static unsigned char *atom_find_str_in_rom(struct atom_context *ctx, char *str, int start,
> +					   int end, int maxlen)
> +{
> +	unsigned long str_off;
> +	unsigned char *p_rom;
> +	unsigned short str_len;
> +
> +	str_off = 0;
> +	str_len = strnlen(str, maxlen);
> +	p_rom = ctx->bios;
> +
> +	for (; start <= end; ++start) {
> +		for (str_off = 0; str_off < str_len; ++str_off) {
> +			if (str[str_off] != *(p_rom + start + str_off))
> +				break;
> +		}
> +
> +		if (str_off == str_len || str[str_off] == 0)
> +			return p_rom + start;
> +	}
> +	return NULL;
> +}
> +
> +static void atom_get_vbios_pn(struct atom_context *ctx) {
> +	unsigned char *p_rom;
> +	unsigned short off_to_vbios_str;
> +	unsigned char *vbios_str;
> +	int count;
> +
> +	off_to_vbios_str = 0;
> +	p_rom = ctx->bios;
> +
> +	if (*(p_rom + OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS) != 0) {
> +		off_to_vbios_str =
> +			*(unsigned short *)(p_rom + OFFSET_TO_GET_ATOMBIOS_STRING_START);
> +
> +		vbios_str = (unsigned char *)(p_rom + off_to_vbios_str);
> +	} else {
> +		vbios_str = p_rom + OFFSET_TO_VBIOS_PART_NUMBER;
> +	}
> +
> +	if (*vbios_str == 0) {
> +		vbios_str = atom_find_str_in_rom(ctx, BIOS_ATOM_PREFIX, 3, 1024, 64);
> +		if (vbios_str == NULL)
> +			vbios_str += sizeof(BIOS_ATOM_PREFIX) - 1;
> +	}
> +	if (vbios_str != NULL && *vbios_str == 0)
> +		vbios_str++;
> +
> +	if (vbios_str != NULL) {
> +		count = 0;
> +		while ((count < BIOS_STRING_LENGTH) && vbios_str[count] >= ' ' &&
> +		       vbios_str[count] <= 'z') {
> +			ctx->vbios_pn[count] = vbios_str[count];
> +			count++;
> +		}
> +
> +		ctx->vbios_pn[count] = 0;
> +	}
> +}
> +
> +static void atom_get_vbios_version(struct atom_context *ctx) {
> +	unsigned char *vbios_ver;
> +
> +	/* find anchor ATOMBIOSBK-AMD */
> +	vbios_ver = atom_find_str_in_rom(ctx, BIOS_VERSION_PREFIX, 3, 1024, 64);
> +	if (vbios_ver != NULL) {
> +		/* skip ATOMBIOSBK-AMD VER */
> +		vbios_ver += 18;
> +		memcpy(ctx->vbios_ver_str, vbios_ver, STRLEN_NORMAL);
> +	} else {
> +		ctx->vbios_ver_str[0] = '\0';
> +	}
> +}
> +
>   struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios)  {
>   	int base;
>   	struct atom_context *ctx =
>   	    kzalloc(sizeof(struct atom_context), GFP_KERNEL);
>   	char *str;
> +	struct _ATOM_ROM_HEADER *atom_rom_header;
> +	struct _ATOM_MASTER_DATA_TABLE *master_table;
> +	struct _ATOM_FIRMWARE_INFO *atom_fw_info;
>   	u16 idx;
>   
>   	if (!ctx)
> @@ -1353,6 +1510,21 @@ struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios)
>   		strlcpy(ctx->vbios_version, str, sizeof(ctx->vbios_version));
>   	}
>   
> +	atom_rom_header = (struct _ATOM_ROM_HEADER *)CSTR(base);
> +	if (atom_rom_header->usMasterDataTableOffset != 0) {
> +		master_table = (struct _ATOM_MASTER_DATA_TABLE *)
> +				CSTR(atom_rom_header->usMasterDataTableOffset);
> +		if (master_table->ListOfDataTables.FirmwareInfo != 0) {
> +			atom_fw_info = (struct _ATOM_FIRMWARE_INFO *)
> +					CSTR(master_table->ListOfDataTables.FirmwareInfo);
> +			ctx->version = atom_fw_info->ulFirmwareRevision;
> +		}
> +	}
> +
> +	atom_get_vbios_name(ctx);
> +	atom_get_vbios_pn(ctx);
> +	atom_get_vbios_date(ctx);
> +	atom_get_vbios_version(ctx);
>   
>   	return ctx;
>   }
> diff --git a/drivers/gpu/drm/amd/amdgpu/atom.h b/drivers/gpu/drm/amd/amdgpu/atom.h
> index d279759cab47..0c1839824520 100644
> --- a/drivers/gpu/drm/amd/amdgpu/atom.h
> +++ b/drivers/gpu/drm/amd/amdgpu/atom.h
> @@ -112,6 +112,10 @@ struct drm_device;
>   #define ATOM_IO_SYSIO		2
>   #define ATOM_IO_IIO		0x80
>   
> +#define STRLEN_NORMAL		32
> +#define STRLEN_LONG		64
> +#define STRLEN_VERYLONG		254
> +
>   struct card_info {
>   	struct drm_device *dev;
>   	void (* reg_write)(struct card_info *, uint32_t, uint32_t);   /*  filled by driver */
> @@ -140,6 +144,12 @@ struct atom_context {
>   	uint32_t *scratch;
>   	int scratch_size_bytes;
>   	char vbios_version[20];
> +
> +	uint8_t name[STRLEN_LONG];
> +	uint8_t vbios_pn[STRLEN_LONG];
> +	uint32_t version;
> +	uint8_t vbios_ver_str[STRLEN_NORMAL];
> +	uint8_t date[STRLEN_NORMAL];
>   };
>   
>   extern int amdgpu_atom_debug;
> diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h
> index 275468e4be60..28deecc2f990 100644
> --- a/drivers/gpu/drm/amd/include/atomfirmware.h
> +++ b/drivers/gpu/drm/amd/include/atomfirmware.h
> @@ -197,6 +197,9 @@ enum atom_dp_vs_preemph_def{
>     DP_VS_LEVEL0_PREEMPH_LEVEL3 = 0x18,
>   };
>   
> +#define BIOS_ATOM_PREFIX   "ATOMBIOS"
> +#define BIOS_VERSION_PREFIX  "ATOMBIOSBK-AMD"
> +#define BIOS_STRING_LENGTH 43
>   
>   /*
>   enum atom_string_def{
> @@ -215,6 +218,8 @@ enum atombios_image_offset{
>     MAXSIZE_OF_ATOMBIOS_ASIC_BUS_MEM_TYPE      = 20,  /*including the terminator 0x0!*/
>     OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS   = 0x2f,
>     OFFSET_TO_GET_ATOMBIOS_STRING_START        = 0x6e,
> +  OFFSET_TO_VBIOS_PART_NUMBER                = 0x80,
> +  OFFSET_TO_VBIOS_DATE                       = 0x50,
>   };
>   
>   /****************************************************************************
> diff --git a/include/uapi/drm/amdgpu_drm.h b/include/uapi/drm/amdgpu_drm.h index 9169df7fadee..155fd9918b4d 100644
> --- a/include/uapi/drm/amdgpu_drm.h
> +++ b/include/uapi/drm/amdgpu_drm.h
> @@ -756,6 +756,8 @@ struct drm_amdgpu_cs_chunk_data {
>   	#define AMDGPU_INFO_VBIOS_SIZE		0x1
>   	/* Subquery id: Query vbios image */
>   	#define AMDGPU_INFO_VBIOS_IMAGE		0x2
> +	/* Subquery id: Query vbios info */
> +	#define AMDGPU_INFO_VBIOS_INFO		0x3
>   /* Query UVD handles */
>   #define AMDGPU_INFO_NUM_HANDLES			0x1C
>   /* Query sensor related information */
> @@ -949,6 +951,14 @@ struct drm_amdgpu_info_firmware {
>   	__u32 feature;
>   };
>   
> +struct drm_amdgpu_info_vbios {
> +	__u8 name[64];
> +	__u8 vbios_pn[64];
> +	__u32 version;
> +	__u8 vbios_ver_str[32];
> +	__u8 date[32];
> +};
> +
>   #define AMDGPU_VRAM_TYPE_UNKNOWN 0
>   #define AMDGPU_VRAM_TYPE_GDDR1 1
>   #define AMDGPU_VRAM_TYPE_DDR2  2
> --
> 2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  reply	other threads:[~2021-05-18 13:17 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-18 12:16 [PATCH] drm/amdgpu: Add vbios info ioctl interface Jiawei Gu
2021-05-18 12:19 ` Gu, JiaWei (Will)
2021-05-18 13:17   ` Christian König [this message]
2021-05-18 13:25     ` StDenis, Tom
2021-05-19  2:41       ` Gu, JiaWei (Will)
2021-05-19  3:10         ` Marek Olšák
  -- strict thread matches above, loose matches on Subject: below --
2021-05-20  2:58 Jiawei Gu
2021-05-20  3:24 ` Alex Deucher
2021-05-17 12:08 Jiawei Gu
2021-05-17 12:17 ` Gu, JiaWei (Will)
2021-05-17 12:25   ` Christian König
2021-05-18  2:11     ` Gu, JiaWei (Will)
2021-05-18  2:44       ` Nieto, David M
2021-05-18  3:07         ` Gu, JiaWei (Will)
2021-05-18  4:40           ` Nieto, David M
2021-05-18  5:58             ` Gu, JiaWei (Will)
2021-05-18  7:23               ` Nieto, David M
2021-05-18 10:50               ` Lazar, Lijo
2021-05-19  3:17                 ` Nieto, David M
2021-05-19 13:09               ` Deucher, Alexander
2021-05-19 13:23                 ` Christian König
2021-05-20  1:30                   ` Gu, JiaWei (Will)
2021-05-20 10:58                     ` Christian König
2021-04-28  8:18 Jiawei Gu
2021-04-22  2:34 Jiawei Gu
2021-04-22 13:09 ` Gu, JiaWei (Will)
2021-04-22 13:18   ` Gu, JiaWei (Will)
2021-04-22 13:27     ` Christian König
2021-04-23  3:25       ` Gu, JiaWei (Will)
2021-04-28  6:47         ` Nieto, David M
2021-04-28  7:15           ` Christian König
2021-04-28  7:25             ` Nieto, David M
2021-04-28  7:42               ` Christian König
2021-04-28  8:21                 ` Gu, JiaWei (Will)
2021-04-28 10:38                   ` Gu, JiaWei (Will)
2021-04-28 11:30                     ` StDenis, Tom
2021-04-28 20:53                       ` Alex Deucher
2021-04-28 21:18                         ` StDenis, Tom
2021-05-08  4:28 ` Kees Cook
2021-05-08  4:28   ` Kees Cook
2021-05-08  6:01   ` Gu, JiaWei (Will)
2021-05-08  6:01     ` Gu, JiaWei (Will)
2021-05-08  9:51     ` Kees Cook
2021-05-08  9:51       ` Kees Cook
2021-05-09  5:35       ` Nieto, David M
2021-04-14  9:08 Jiawei Gu
2021-04-14 13:01 ` Alex Deucher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1ec97d1f-aaa3-46c1-b702-378879e67cc5@amd.com \
    --to=christian.koenig@amd.com \
    --cc=Alexander.Deucher@amd.com \
    --cc=David.Nieto@amd.com \
    --cc=Emily.Deng@amd.com \
    --cc=JiaWei.Gu@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=maraeo@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.