On Fri, Aug 19, 2011 at 5:59 PM, Benjamin Franzke <benjaminfran...@googlemail.com> wrote: > 2011/8/19 Chia-I Wu <olva...@gmail.com>: >> There is no libudev on Android. Use DRM to get the PCI ID directly. >> --- >> src/gallium/targets/egl-static/egl.c | 62 >> ++++++++++++++++++++++++++++++++++ >> 1 files changed, 62 insertions(+), 0 deletions(-) >> >> diff --git a/src/gallium/targets/egl-static/egl.c >> b/src/gallium/targets/egl-static/egl.c >> index 568f549..38ba6c2 100644 >> --- a/src/gallium/targets/egl-static/egl.c >> +++ b/src/gallium/targets/egl-static/egl.c >> @@ -109,6 +109,68 @@ out: >> return (*chip_id >= 0); >> } >> >> +#elif defined(PIPE_OS_ANDROID) > Just want to mention that I appreciate doing this really only for android, > and not as a fallback for no-libudev in general. (which would probably end up > with more problems for none intel/radeon users and strange bugs..) Can you elaborate? I have no intention to make it a fallback, but I am curious about the potential problems.
>> + >> +#include <xf86drm.h> >> +/* for i915 */ >> +#include <i915_drm.h> >> +/* for radeon */ >> +#include <radeon_drm.h> >> + >> +static boolean >> +drm_fd_get_pci_id(int fd, int *vendor_id, int *chip_id) >> +{ >> + drmVersionPtr version; >> + >> + *chip_id = -1; >> + >> + version = drmGetVersion(fd); >> + if (!version) { >> + _eglLog(_EGL_WARNING, "invalid drm fd"); >> + return FALSE; >> + } >> + if (!version->name) { >> + _eglLog(_EGL_WARNING, "unable to determine the driver name"); >> + drmFreeVersion(version); >> + return FALSE; >> + } >> + >> + if (strcmp(version->name, "i915") == 0) { > > Shouldnt util_strcmp from util/u_string.h be used instead? Yes, will do. >> + struct drm_i915_getparam gp; >> + int ret; >> + >> + *vendor_id = 0x8086; >> + >> + memset(&gp, 0, sizeof(gp)); >> + gp.param = I915_PARAM_CHIPSET_ID; >> + gp.value = chip_id; >> + ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); >> + if (ret) { >> + _eglLog(_EGL_WARNING, "failed to get param for i915"); >> + *chip_id = -1; >> + } >> + } >> + else if (strcmp(version->name, "radeon") == 0) { >> + struct drm_radeon_info info; >> + int ret; >> + >> + *vendor_id = 0x1002; >> + >> + memset(&info, 0, sizeof(info)); >> + info.request = RADEON_INFO_DEVICE_ID; >> + info.value = (long) chip_id; > > Just a little nitpick: value is of type uint64_t, so the cast should > rather be to an unsigned type. I will make it "unsigned long". > Besides that: > Reviewed-by: Benjamin Franzke <benjaminfran...@googlemail.com> Thanks. >> + ret = drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)); >> + if (ret) { >> + _eglLog(_EGL_WARNING, "failed to get info for radeon"); >> + *chip_id = -1; >> + } >> + } >> + >> + drmFreeVersion(version); >> + >> + return (*chip_id >= 0); >> +} >> + >> #else >> >> static boolean >> -- >> 1.7.5.4 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev >> > -- o...@lunarg.com _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev