libdrm全解析十三 —— 源码全解析(10)

接前一篇文章:libdrm全解析十二 —— 源码全解析(9)

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

本文继续对include/drm/drm.h中实际功能宏定义进行讲解。

15. DRM_IOCTL_SET_UNIQUE

第15个宏是DRM_IOCTL_SET_UNIQUE,相应代码如下:

#define DRM_IOCTL_SET_UNIQUE		DRM_IOW( 0x10, struct drm_unique)

结合之前文章中的_IOW(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_SET_UNIQUE		( ((1)  << 30) | (('d') << 8) | ((0x10)   << 0) | ((sizeof(struct drm_unique)) << 16) )

struct drm_unique在同文件(include/drm/drm.h)中定义,代码如下:

/*
 * DRM_IOCTL_GET_UNIQUE ioctl argument type.
 *
 * \sa drmGetBusid() and drmSetBusId().
 */
struct drm_unique {
	__kernel_size_t unique_len;	  /**< Length of unique */
	char *unique;	  /**< Unique name for driver instantiation */
};

drm_unique结构中的各成员的意义代码注释描述得很清楚了,在此无需赘述。

DRM_IOCTL_SET_UNIQUE对应的Userspace API为:drmSetBusid()。该函数也是在xf86drm.c中,代码如下:

/**
 * Set the bus ID of the device.
 *
 * \param fd file descriptor.
 * \param busid bus ID string.
 *
 * \return zero on success, negative on failure.
 *
 * \internal
 * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
 * the arguments in a drm_unique structure.
 */
drm_public int drmSetBusid(int fd, const char *busid)
{
    drm_unique_t u;

    memclear(u);
    u.unique     = (char *)busid;
    u.unique_len = strlen(busid);

    if (drmIoctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
        return -errno;
    }
    return 0;
}

此函数与前文中的“2. DRM_IOCTL_GET_UNIQUE”是一对。函数的作用是设置总线(Bus)ID。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

16. DRM_IOCTL_AUTH_MAGIC

第16个宏是DRM_IOCTL_AUTH_MAGIC,相应代码如下:

#define DRM_IOCTL_AUTH_MAGIC		DRM_IOW( 0x11, struct drm_auth)

结合之前文章中的_IOW(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_SET_UNIQUE		( ((1)  << 30) | (('d') << 8) | ((0x11)   << 0) | ((sizeof(struct drm_auth)) << 16) )

struct drm_auth在同文件(include/drm/drm.h)中定义,代码如下:

/*
 * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
 */
struct drm_auth {
	drm_magic_t magic;
};

drm_magic在同文件中定义,如下:

typedef unsigned int drm_magic_t;

DRM_IOCTL_AUTH_MAGIC对应的Userspace API为:drmAuthMagic()。该函数也是在xf86drm.c中,代码如下:

drm_public int drmAuthMagic(int fd, drm_magic_t magic)
{
    drm_auth_t auth;

    memclear(auth);
    auth.magic = magic;
    if (drmIoctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth))
        return -errno;
    return 0;
}

此函数与前文中的“3. DRM_IOCTL_GET_MAGIC”是一对。函数的作用是设置魔数/幻数字(Magic Number),用于GEM ioctl权限检查。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

其余宏定义将在后续文章中继续解析。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/132476833