[Mesa-dev] [PATCHv2 10/21] targets/egl-static: do not rely on libudev on Android
Benjamin Franzke
benjaminfranzke at googlemail.com
Fri Aug 19 02:59:55 PDT 2011
2011/8/19 Chia-I Wu <olvaffe at 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..)
> +
> +#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?
> + 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.
Besides that:
Reviewed-by: Benjamin Franzke <benjaminfranzke at googlemail.com>
> + 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list