libdrm全解析六 —— 源码全解析(3)

接前一篇文章:libdrm全解析五 —— 源码全解析(2)

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

上一篇文章开始了对于include/drm/drm.h中实际功能宏定义的讲解,先解析了前2个。本文及后续文章讲解其余的宏定义。

3. DRM_IOCTL_GET_MAGIC

第3个宏是DRM_IOCTL_MAGIC,相应代码如下:

#define DRM_IOCTL_GET_MAGIC		DRM_IOR( 0x02, struct drm_auth)

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

#define DRM_IOCTL_MAGIC		( ((2)  << 30) | (('d') << 8) | ((0x02)   << 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_t的定义在同文件中,如下:

typedef unsigned int drm_magic_t;

DRM_IOCTL_MAGIC对应的Userspace API为:drmGetMagic()。该函数在xf86drm.c中,代码如下:

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

    memclear(auth);

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

函数的作用是获取魔数/幻数(Magic Number),用于GEM ioctl权限检查。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

4. DRM_IOCTL_IRQ_BUSID

第4个宏是DRM_IOCTL_IRQ_BUSID,相应代码如下:

#define DRM_IOCTL_IRQ_BUSID		DRM_IOWR(0x03, struct drm_irq_busid)

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

#define DRM_IOCTL_IRQ_BUSID		( ((3)  << 30) | (('d') << 8) | ((0x03)   << 0) | ((sizeof(struct drm_irq_busid)) << 16) )

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

/*
 * DRM_IOCTL_IRQ_BUSID ioctl argument type.
 *
 * \sa drmGetInterruptFromBusID().
 */
struct drm_irq_busid {
	int irq;	/**< IRQ number */
	int busnum;	/**< bus number */
	int devnum;	/**< device number */
	int funcnum;	/**< function number */
};

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

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

/**
 * Get IRQ from bus ID.
 *
 * \param fd file descriptor.
 * \param busnum bus number.
 * \param devnum device number.
 * \param funcnum function number.
 *
 * \return IRQ number on success, or a negative value on failure.
 *
 * \internal
 * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
 * arguments in a drm_irq_busid structure.
 */
drm_public int drmGetInterruptFromBusID(int fd, int busnum, int devnum,
                                        int funcnum)
{
    drm_irq_busid_t p;

    memclear(p);
    p.busnum  = busnum;
    p.devnum  = devnum;
    p.funcnum = funcnum;
    if (drmIoctl(fd, DRM_IOCTL_IRQ_BUSID, &p))
        return -errno;
    return p.irq;
}

函数的作用是从总线(Bus)ID中获取中断。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

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

猜你喜欢

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