16
2007 © Moriyoshi Koizumi. All Rights Reserved. MI OpenGL I/F Xlib I/F libdrm I/F IOCTL / mmap Mesa Xclient (w/GL) DGA sockets vidmode XAA Xv sockets Xlib X protocol X Server (device-independent tier) Video Driver IOCTL / mmap libdrm libdrm DRI XFree86 Tier DIX I/F XFree86 Extension I/F libdrm I/F Kernel Xlib I/F Direct Rendering Manager Filesystem Driver I/F PCI Device Manager Filesystem Driver I/F Hard- ware AGP GART Manager Memory Manager Subsystem AGP GART Manager I/F IRQ Abstraction IOCTL / mmap Filesystem Abstraction MM I/F IRQM I/F PCI Driver I/F X Window / Direct Rendering Architectural Diagram PCI Driver I/F

X / DRM (Direct Rendering Manager) Architectural Overview

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

MI

OpenGL I/FXlib I/Flibdrm I/F IOCTL / mmap

Mesa

Xclient (w/GL)

DGA

sockets

vidmode

XAA

Xv

sockets

Xlib

X protocol

X Server (device-independent tier)

VideoDriver

IOCTL / mmap

libdrm

libdrmDRI

XFree86 TierDIX I/F

XFree86 Extension I/F

libdrm I/F

Kernel

Xlib I/F DirectRenderingManager

Filesystem Driver I/F

PCI DeviceManager

Filesystem Driver I/F Hard-

ware

AGP GARTManagerMemory

ManagerSubsystem

AGP GARTManagerI/F

IRQAbstraction

IOCTL / mmap

FilesystemAbstraction

MM I/F

IRQM I/F

PCI Driver I/F

X Window / Direct RenderingArchitectural Diagram

PCI Driver I/F

Page 2: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

MI

OpenGL I/FXlib I/F

Mesa

Xclient (w/GL)

DGA

sockets

vidmode

XAA

Xv

sockets

Xlib

X protocol

X Server (DIX)

VideoDriver

IOCTL / mmap

libdrmDRI

XFree86 TierDIX I/F

XFree86 Extension I/F

libdrm I/F

Kernel

Xlib I/F DirectRenderingManager

Filesystem Driver I/F

PCI DeviceManager

Filesystem Driver I/F Hard-

ware

AGP GARTManagerMemory

ManagerSubsystem

AGP GARTManagerI/F

IRQAbstraction

IOCTL / mmap

FilesystemAbstraction

MM I/F

IRQM I/F

PCI Driver I/F

X Window / Indirect RenderingArchitectural Diagram

PCI Driver I/F

GLX Mesa

Page 3: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

Address Space Layout

GART

ActualRAMSpace

Kernel Space

User SpacePhysical Address Space

MMIOSpace

GraphicsAperture

Page 4: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

InstructionBuffer

Direct Memory Access1. Queueing

Kernel Space

FIFO

Graphic Controller

User SpaceIOCTL (BLIT etc.)

DMA Transfer

MarkedConsistent

Some Process

Page 5: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

Active Entry

Direct Memory Access 2. Bitmap Block Transfer (Blit)

Kernel Space

FIFO

Graphic Controller

User Space

Blit Engine

Parse & Dispatch

DMA Transfer

MarkedConsistent

SomeProcess

Another Process

Page 6: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM IOCTL I/F

● AUTH (GET_MAGIC / AUTH_MAGIC)● VERSION (GET / SET)● BUSID (GET / SET)● MAP (ADD / RM)● CTX (ADD / RM / GET / SWITCH / NEW /

RESERVE)● LOCK (LOCK / UNLOCK)● AGP operations● Device-specific operations

Page 7: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication

DRI

Mesa libdrm

libdrm

Kernel

1. Retrieve Magic Cookie (drmGetMagic())

X protocol

X Server

XFree86 Tier

Xlib

3. Send Magic (XF86DRIAuthConnection())

DirectRenderingManager

2. Generate Magic Cookie

4. Authenticate Cookie(drmAuthMagic())

Cookie Manager

Page 8: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(Userland Wrappers)

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

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

libdrm/xf86drm.c:(formally: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c)

Page 9: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(Userland Wrappers)

BoolDRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic){ DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);

if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE; return TRUE;}

xc/programs/Xserver/hw/xfree86/dri/dri.c:

libdrm/xf86drm.c:(formally: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c)int drmAuthMagic(int fd, drm_magic_t magic){

drm_auth_t auth;auth.magic = magic;if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno;return 0;

}

Page 10: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(linux/drivers/char/drm/drm_drv.c: IOCTL Dispatch Table)

static drm_ioctl_desc_t drm_ioctls[] = {[DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = {drm_version, 0},[DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = {drm_getunique,

0},[DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = {drm_getmagic, 0},[DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = {drm_irq_by_busid,

DRM_MASTER|DRM_ROOT_ONLY},[DRM_IOCTL_NR(DRM_IOCTL_GET_MAP)] = {drm_getmap, 0},[DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT)] = {drm_getclient,

0},[DRM_IOCTL_NR(DRM_IOCTL_SET_VERSION)] = {drm_setversion,

DRM_MASTER|DRM_ROOT_ONLY},[DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = {drm_authmagic,

DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = {drm_addctx,

DRM_AUTH|DRM_ROOT_ONLY},[DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = {drm_getctx,

DRM_AUTH},...

Page 11: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(linux/drivers/char/drm/drm_drv.c: IOCTL Dispatcher)

if (nr < DRIVER_IOCTL_COUNT)ioctl = &drm_ioctls[nr];

else if ((nr >= DRM_COMMAND_BASE)&& (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls))

ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];else

goto err_i1;

func = ioctl->func;

/* is there a local override? */if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)

func = dev->driver->dma_ioctl;if (!func) {

DRM_DEBUG("no function\n");retcode = -EINVAL;

} else if (((ioctl->flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)) || ((ioctl->flags & DRM_AUTH) && !priv->authenticated) || ((ioctl->flags & DRM_MASTER) && !priv->master)) {retcode = -EACCES;

} else {retcode = func(inode, filp, cmd, arg);

}

Page 12: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(linux/drivers/char/drm/drm_auth.c: Cookie Issuer)

int drm_getmagic(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{.../* Find unique magic */if (priv->magic) {

auth.magic = priv->magic;} else {

do {spin_lock(&lock);if (!sequence)

++sequence;/* reserve 0 */auth.magic = sequence++;spin_unlock(&lock);

} while (drm_find_file(dev, auth.magic));priv->magic = auth.magic;drm_add_magic(dev, priv, auth.magic);

}

DRM_DEBUG("%u\n", auth.magic);if (copy_to_user((drm_auth_t __user *) arg, &auth, sizeof(auth)))

return -EFAULT;return 0;

}

typedef unsigned int drm_magic_t;

typedef struct drm_auth {drm_magic_t magic;

} drm_auth_t;

Page 13: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(linux/drivers/char/drm/drm_auth.c: Cookie Verifier)

int drm_authmagic(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

{drm_file_t *priv = filp->private_data;drm_device_t *dev = priv->head->dev;drm_auth_t auth;drm_file_t *file;

if (copy_from_user(&auth, (drm_auth_t __user *) arg, sizeof(auth)))return -EFAULT;

DRM_DEBUG("%u\n", auth.magic);if ((file = drm_find_file(dev, auth.magic))) {

file->authenticated = 1;drm_remove_magic(dev, auth.magic);return 0;

}return -EINVAL;

}

Page 14: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

DRM Authentication(linux/drivers/char/drm/drm_auth.c: Cookie Keeper)

static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic){

drm_file_t *retval = NULL;drm_magic_entry_t *pt;int hash = drm_hash_magic(magic);

mutex_lock(&dev->struct_mutex);for (pt = dev->magiclist[hash].head; pt; pt = pt->next) {

if (pt->magic == magic) {retval = pt->priv;break;

}}mutex_unlock(&dev->struct_mutex);return retval;

}

Page 15: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

SAREAFrame Buffer

Texture Buffer

GART

Graphic Address Remapping Table(GART)

ActualRAMSpace

VirtualMemorySpace

VirtualMemorySpace

Process #1

Process #2

Phy-Virt Address Translation (by MMU)

Physical Address Space

MMIOSpace

Phy-Phy Address Translation(by AGP controller)

GraphicsAperture

Page 16: X / DRM (Direct Rendering Manager) Architectural Overview

2007 © Moriyoshi Koizumi. All Rights Reserved.

AGPGART IOCTL I/F

● ACQUIRE● SETUP● RESERVE● PROTECT● ALLOCATE / DEALLOCATE● BIND / UNBIND