接前一篇文章:libdrm全解析十二 —— 源码全解析(9)
本文参考以下博文:
特此致谢!
本文继续对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权限检查。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。
其余宏定义将在后续文章中继续解析。