Date post: | 05-Dec-2014 |
Category: |
Technology |
Upload: | moriyoshi-koizumi |
View: | 11,668 times |
Download: | 2 times |
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
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
2007 © Moriyoshi Koizumi. All Rights Reserved.
Address Space Layout
GART
ActualRAMSpace
Kernel Space
User SpacePhysical Address Space
MMIOSpace
GraphicsAperture
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
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
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
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
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)
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;
}
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},...
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);
}
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;
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;
}
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;
}
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
2007 © Moriyoshi Koizumi. All Rights Reserved.
AGPGART IOCTL I/F
● ACQUIRE● SETUP● RESERVE● PROTECT● ALLOCATE / DEALLOCATE● BIND / UNBIND