On 30/05/17 06:16 AM, Samuel Li wrote:
> From: Xiaojie Yuan <xiaojie.y...@amd.com>

I took a closer look and noticed some details (and some non-details
about the amdgpu.ids file at the end).


> diff --git a/amdgpu/amdgpu_asic_id.c b/amdgpu/amdgpu_asic_id.c
> new file mode 100644
> index 0000000..a43ca33
> --- /dev/null
> +++ b/amdgpu/amdgpu_asic_id.c

[...]

> +#include "xf86drm.h"
> +#include "amdgpu_drm.h"

Should be

#include <xf86drm.h>
#include <amdgpu_drm.h>

since these header files are not located in the same directory as
amdgpu_asic_id.c.


> +static int parse_one_line(const char *line, struct amdgpu_asic_id *id)
> +{
> +     char *buf, *saveptr;
> +     char *s_did;
> +     char *s_rid;
> +     char *s_name;
> +     char *endptr;
> +     int r = 0;

This function could be simplified slightly by initializing r = -EINVAL
here and only setting it to 0 just before the out label.


> +int amdgpu_parse_asic_ids(struct amdgpu_asic_id **p_asic_id_table)
> +{

[...]

> +     /* 1st valid line is file version */
> +     while ((n = getline(&line, &len, fp)) != -1) {
> +             /* trim trailing newline */
> +             if (line[n - 1] == '\n')
> +                     line[n - 1] = '\0';

Should probably increment line_num here, otherwise the line number in
the error message below might be confusing.


> +                     fprintf(stderr, "Invalid format: %s: line %d: %s\n",
> +                                     AMDGPU_ASIC_ID_TABLE, line_num, line);

The second line should be indented to align with the opening parenthesis.


> +             if (table_size >= table_max_size) {
> +                     /* double table size */
> +                     table_max_size *= 2;
> +                     asic_id_table = realloc(asic_id_table, table_max_size *
> +                                     sizeof(struct amdgpu_asic_id));

Ditto.


> +     /* end of table */
> +     id = asic_id_table + table_size;
> +     memset(id, 0, sizeof(struct amdgpu_asic_id));

Might also want to realloc asic_id_table according to the final table
size, to avoid wasting memory.


> +     if (r && asic_id_table) {
> +             while (table_size--) {
> +                     id = asic_id_table + table_size;
> +                     if (id->marketing_name !=  NULL)
> +                             free(id->marketing_name);

free(NULL) works fine (and parse_one_line returns an error for
id->marketing_name == NULL anyway), so this can be simplified to

                        free(id->marketing_name);


> @@ -140,6 +140,13 @@ static void 
> amdgpu_device_free_internal(amdgpu_device_handle dev)
>       close(dev->fd);
>       if ((dev->flink_fd >= 0) && (dev->fd != dev->flink_fd))
>               close(dev->flink_fd);
> +     if (dev->asic_ids) {
> +             for (id = dev->asic_ids; id->did; id++) {
> +                     if (id->marketing_name !=  NULL)
> +                             free(id->marketing_name);
> +             }

Ditto, this can be simplified to

                for (id = dev->asic_ids; id->did; id++)
                        free(id->marketing_name);


> @@ -267,6 +274,11 @@ int amdgpu_device_initialize(int fd,
>       amdgpu_vamgr_init(&dev->vamgr_32, start, max,
>                         dev->dev_info.virtual_address_alignment);
>  
> +     r = amdgpu_parse_asic_ids(&dev->asic_ids);
> +     if (r)
> +             fprintf(stderr, "%s: Can not parse asic ids, 0x%x.",
> +                     __func__, r);

"Cannot parse ASIC IDs"

Also, there should be curly braces around a multi-line statement.


> @@ -297,13 +309,15 @@ int amdgpu_device_deinitialize(amdgpu_device_handle dev)
>  
>  const char *amdgpu_get_marketing_name(amdgpu_device_handle dev)
>  {
> -     const struct amdgpu_asic_id_table_t *t = amdgpu_asic_id_table;
> +     const struct amdgpu_asic_id *id;
> +
> +     if (!dev->asic_ids)
> +             return NULL;
>  
> -     while (t->did) {
> -             if ((t->did == dev->info.asic_id) &&
> -                 (t->rid == dev->info.pci_rev_id))
> -                     return t->marketing_name;
> -             t++;
> +     for (id = dev->asic_ids; id->did; id++) {
> +             if ((id->did == dev->info.asic_id) &&
> +                             (id->rid == dev->info.pci_rev_id))

The last line is indented incorrectly, should be 2 tabs and 4 spaces.


> diff --git a/include/drm/amdgpu.ids b/include/drm/amdgpu.ids
> new file mode 100644
> index 0000000..6d6b944
> --- /dev/null
> +++ b/include/drm/amdgpu.ids

I think the path of this file in the repository should be
amdgpu/amdgpu.ids rather than include/drm/amdgpu.ids.


> @@ -0,0 +1,170 @@
> +# List of AMDGPU ID's

This should say "IDs" instead of "ID's".


> +67FF,        CF,     67FF:CF
> +67FF,        EF,     67FF:EF

There should be no such dummy entries in the file. If it's useful,
amdgpu_get_marketing_name can return a dummy string based on the PCI ID
and revision when there's no matching entry in the file.


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to