[Libva] [PATCH V3 1/3] Use the inline CPUID assembly to obtain CPUID string instead of /proc/cpuinfo

Zhao, Yakui yakui.zhao at intel.com
Sat Sep 27 17:47:55 PDT 2014


On Thu, 2014-09-25 at 19:18 -0600, Zhao, Yakui wrote:
> On some systems there is no access to /proc/cpuinfo. So the inline assembly
> is used directly to detect the CPUID string.
> 
> V2->V3: Follow the suggestion from Google engineer to remove the unused code
> of "if 0". And the "unsigned int" data type is updated to "uint32_t".
> 
> V1->V2: Based on the Matt Turner's suggestion the __cpuid defined in GCC
> cpuid.h is called directly, which is helpful to handle the PIC issue on
> 32-bit.
> 

It will be pushed to the staging branch.

Thanks.
    Yakui

> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> ---
>  src/i965_device_info.c |   54 +++++++++++++++++++++++-------------------------
>  1 file changed, 26 insertions(+), 28 deletions(-)
> 
> diff --git a/src/i965_device_info.c b/src/i965_device_info.c
> index 5ebea2a..690d4e2 100755
> --- a/src/i965_device_info.c
> +++ b/src/i965_device_info.c
> @@ -30,6 +30,7 @@
>  #include <string.h>
>  #include <strings.h>
>  #include <errno.h>
> +#include <cpuid.h>
>  
>  /* Extra set of chroma formats supported for H.264 decoding (beyond YUV 4:2:0) */
>  #define EXTRA_H264_DEC_CHROMA_FORMATS \
> @@ -378,43 +379,40 @@ i965_get_device_info(int devid)
>      }
>  }
>  
> +static void cpuid(unsigned int op,
> +                         uint32_t *eax, uint32_t *ebx,
> +                         uint32_t *ecx, uint32_t *edx)
> +{
> +	__cpuid_count(op, 0, *eax, *ebx, *ecx, *edx);
> +}
> +
> +/*
> + * This function doesn't check the length. And the caller should
> + * assure that the length of input string should be greater than 48.
> + */
>  static int intel_driver_detect_cpustring(char *model_id)
>  {
> -    FILE *fp;
> -    size_t line_length;
> -    ssize_t read_length;
> -    char *line_string, *model_ptr;
> -    bool found;
> +    uint32_t *rdata;
>  
>      if (model_id == NULL)
>          return -EINVAL;
>  
> -    fp = fopen("/proc/cpuinfo", "r");
> -    if (fp == NULL) {
> -        fprintf(stderr, "no permission to access /proc/cpuinfo\n");
> -        return -EACCES;
> -    }
> -    line_string = NULL;
> -    found = false;
> +    rdata = (uint32_t *)model_id;
>  
> -    while((read_length = getline(&line_string, &line_length, fp)) != -1) {
> -        if (strstr(line_string, "model name")) {
> -            model_ptr = strstr(line_string, ": ");
> -            model_ptr += 2;
> -            found = true;
> -            strncpy(model_id, model_ptr, strlen(model_ptr));
> -            break;
> -        }
> -    }
> -    fclose(fp);
> +    /* obtain the max supported extended CPUID info */
> +    cpuid(0x80000000, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
>  
> -    if (line_string)
> -        free(line_string);
> +    /* If the max extended CPUID info is less than 0x80000004, fail */
> +    if (rdata[0] < 0x80000004)
> +	return -EINVAL;
>  
> -    if (found)
> -        return 0;
> -    else
> -        return -EINVAL;
> +    /* obtain the CPUID string */
> +    cpuid(0x80000002, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
> +    cpuid(0x80000003, &rdata[4], &rdata[5], &rdata[6], &rdata[7]);
> +    cpuid(0x80000004, &rdata[8], &rdata[9], &rdata[10], &rdata[11]);
> +
> +    *(model_id + 48) = '\0';
> +    return 0;
>  }
>  
>  /*




More information about the Libva mailing list