Libdrm 전체 분석 6 - 전체 소스 코드 분석(3)

이전 기사에서 계속: libdrm five 전체 분석 - 소스 코드 전체 분석(2)

이 문서는 다음 블로그 게시물을 참조합니다.

DRM 드라이버 개발(VKMS)

매우 감사합니다!

이전 글에서는 include/drm/drm.h에 있는 실제 함수 매크로 정의에 대한 설명을 시작하고 처음 두 개를 먼저 분석했습니다. 이 문서와 후속 문서에서는 나머지 매크로 정의에 대해 설명합니다.

3. DRM_IOCTL_GET_MAGIC

세 번째 매크로는 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에 해당하는 사용자 공간 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;
}

이 함수의 기능은 GEM ioctl 권한 확인에 사용되는 매직 넘버/매직 넘버(Magic Number)를 얻는 것입니다. 이 기능은 나중에 기능을 자세히 설명할 때 자세히 분석해 보겠습니다. 먼저 서로를 알아가며 감상해보자.

4. DRM_IOCTL_IRQ_BUSID

네 번째 매크로는 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에 해당하는 사용자 공간 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로부터 인터럽트를 받는 것입니다. 이 기능은 나중에 기능을 자세히 설명할 때 자세히 분석해 보겠습니다. 먼저 서로를 알아가며 감상해보자.

나머지 매크로 정의는 후속 기사에서 계속 분석됩니다.

Guess you like

Origin blog.csdn.net/phmatthaus/article/details/132466646