libdrm全解析十八 —— 源码全解析(15)

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

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

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

25. DRM_IOCTL_FREE_BUFS

第25个宏是DRM_IOCTL_FREE_BUFS,相应代码如下:

#define DRM_IOCTL_FREE_BUFS		DRM_IOW( 0x1a, struct drm_buf_free)

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

#define DRM_IOCTL_FREE_BUFS        ( ((1)  << 30) | (('d') << 8) | ((0x1a)   << 0) | ((sizeof(struct drm_buf_free)) << 16) )

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

/*
 * DRM_IOCTL_FREE_BUFS ioctl argument type.
 */
struct drm_buf_free {
	int count;
	int *list;
};

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

/**
 * Free buffers.
 *
 * \param fd file descriptor.
 * \param count number of buffers to free.
 * \param list list of buffers to be freed.
 *
 * \return zero on success, or a negative value on failure.
 *
 * \note This function is primarily used for debugging.
 *
 * \internal
 * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
 * the arguments in a drm_buf_free structure.
 */
drm_public int drmFreeBufs(int fd, int count, int *list)
{
    drm_buf_free_t request;

    memclear(request);
    request.count = count;
    request.list  = list;
    if (drmIoctl(fd, DRM_IOCTL_FREE_BUFS, &request))
        return -errno;
    return 0;
}

函数的作用是释放缓冲(buffers)。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

26. DRM_IOCTL_RM_MAP

第26个宏是DRM_IOCTL_RM_MAP,相应代码如下:

#define DRM_IOCTL_RM_MAP		DRM_IOW( 0x1b, struct drm_map)

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

#define DRM_IOCTL_RM_MAP		( ((1)  << 30) | (('d') << 8) | ((0x1b)   << 0) | ((sizeof(struct drm_map)) << 16) )

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

/*
 * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
 * argument type.
 *
 * \sa drmAddMap().
 */
struct drm_map {
	unsigned long offset;	 /**< Requested physical address (0 for SAREA)*/
	unsigned long size;	 /**< Requested physical size (bytes) */
	enum drm_map_type type;	 /**< Type of memory to map */
	enum drm_map_flags flags;	 /**< Flags */
	void *handle;		 /**< User-space: "Handle" to pass to mmap() */
				 /**< Kernel-space: kernel-virtual address */
	int mtrr;		 /**< MTRR slot used */
	/*   Private data */
};

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

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

drm_public int drmRmMap(int fd, drm_handle_t handle)
{
    drm_map_t map;

    memclear(map);
    map.handle = (void *)(uintptr_t)handle;

    if(drmIoctl(fd, DRM_IOCTL_RM_MAP, &map))
        return -errno;
    return 0;
}

函数的作用是删除映射。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。

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

猜你喜欢

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