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.z...@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; > } > > /* _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva