1 /****************************************************************************
3 * Copyright (C) 2005 - 2013 by Vivante Corp.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the license, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 *****************************************************************************/
22 #include "gc_hal_kernel_precomp.h"
26 #define ENABLE_VG_TRY_VIRTUAL_MEMORY 0
28 #define _GC_OBJ_ZONE gcvZONE_VG
30 /******************************************************************************\
31 ******************************* gckKERNEL API Code ******************************
32 \******************************************************************************/
34 /*******************************************************************************
36 ** gckKERNEL_Construct
38 ** Construct a new gckKERNEL object.
43 ** Pointer to an gckOS object.
45 ** IN gctPOINTER Context
46 ** Pointer to a driver defined context.
51 ** Pointer to a variable that will hold the pointer to the gckKERNEL
54 gceSTATUS gckVGKERNEL_Construct(
56 IN gctPOINTER Context,
57 IN gckKERNEL inKernel,
58 OUT gckVGKERNEL * Kernel
62 gckVGKERNEL kernel = gcvNULL;
64 gcmkHEADER_ARG("Os=0x%x Context=0x%x", Os, Context);
65 /* Verify the arguments. */
66 gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
67 gcmkVERIFY_ARGUMENT(Kernel != gcvNULL);
71 /* Allocate the gckKERNEL object. */
72 gcmkERR_BREAK(gckOS_Allocate(
74 sizeof(struct _gckVGKERNEL),
75 (gctPOINTER *) &kernel
78 /* Initialize the gckKERNEL object. */
79 kernel->object.type = gcvOBJ_KERNEL;
81 kernel->context = Context;
82 kernel->hardware = gcvNULL;
83 kernel->interrupt = gcvNULL;
84 kernel->command = gcvNULL;
85 kernel->mmu = gcvNULL;
86 kernel->kernel = inKernel;
88 /* Construct the gckVGHARDWARE object. */
89 gcmkERR_BREAK(gckVGHARDWARE_Construct(
93 /* Set pointer to gckKERNEL object in gckVGHARDWARE object. */
94 kernel->hardware->kernel = kernel;
96 /* Construct the gckVGINTERRUPT object. */
97 gcmkERR_BREAK(gckVGINTERRUPT_Construct(
98 kernel, &kernel->interrupt
101 /* Construct the gckVGCOMMAND object. */
102 gcmkERR_BREAK(gckVGCOMMAND_Construct(
103 kernel, gcmKB2BYTES(8), gcmKB2BYTES(2), &kernel->command
106 /* Construct the gckVGMMU object. */
107 gcmkERR_BREAK(gckVGMMU_Construct(
108 kernel, gcmKB2BYTES(32), &kernel->mmu
111 /* Return pointer to the gckKERNEL object. */
114 gcmkFOOTER_ARG("*Kernel=0x%x", *Kernel);
121 if (kernel != gcvNULL)
123 if (kernel->mmu != gcvNULL)
125 gcmkVERIFY_OK(gckVGMMU_Destroy(kernel->mmu));
128 if (kernel->command != gcvNULL)
130 gcmkVERIFY_OK(gckVGCOMMAND_Destroy(kernel->command));
133 if (kernel->interrupt != gcvNULL)
135 gcmkVERIFY_OK(gckVGINTERRUPT_Destroy(kernel->interrupt));
138 if (kernel->hardware != gcvNULL)
140 gcmkVERIFY_OK(gckVGHARDWARE_Destroy(kernel->hardware));
143 gcmkVERIFY_OK(gckOS_Free(Os, kernel));
151 /*******************************************************************************
155 ** Destroy an gckKERNEL object.
160 ** Pointer to an gckKERNEL object to destroy.
166 gceSTATUS gckVGKERNEL_Destroy(
167 IN gckVGKERNEL Kernel
172 gcmkHEADER_ARG("Kernel=0x%x", Kernel);
174 /* Verify the arguments. */
175 gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
179 /* Destroy the gckVGMMU object. */
180 if (Kernel->mmu != gcvNULL)
182 gcmkERR_BREAK(gckVGMMU_Destroy(Kernel->mmu));
183 Kernel->mmu = gcvNULL;
186 /* Destroy the gckVGCOMMAND object. */
187 if (Kernel->command != gcvNULL)
189 gcmkERR_BREAK(gckVGCOMMAND_Destroy(Kernel->command));
190 Kernel->command = gcvNULL;
193 /* Destroy the gckVGINTERRUPT object. */
194 if (Kernel->interrupt != gcvNULL)
196 gcmkERR_BREAK(gckVGINTERRUPT_Destroy(Kernel->interrupt));
197 Kernel->interrupt = gcvNULL;
200 /* Destroy the gckVGHARDWARE object. */
201 if (Kernel->hardware != gcvNULL)
203 gcmkERR_BREAK(gckVGHARDWARE_Destroy(Kernel->hardware));
204 Kernel->hardware = gcvNULL;
207 /* Mark the gckKERNEL object as unknown. */
208 Kernel->object.type = gcvOBJ_UNKNOWN;
210 /* Free the gckKERNEL object. */
211 gcmkERR_BREAK(gckOS_Free(Kernel->os, Kernel));
221 /*******************************************************************************
223 ** gckKERNEL_AllocateLinearMemory
225 ** Function walks all required memory pools and allocates the requested
226 ** amount of video memory.
231 ** Pointer to an gckKERNEL object.
234 ** Pointer the desired memory pool.
237 ** Number of bytes to allocate.
239 ** gctSIZE_T Alignment
240 ** Required buffer alignment.
248 ** Pointer to the actual pool where the memory was allocated.
250 ** gcuVIDMEM_NODE_PTR * Node
254 gckKERNEL_AllocateLinearMemory(
256 IN OUT gcePOOL * Pool,
258 IN gctSIZE_T Alignment,
259 IN gceSURF_TYPE Type,
260 OUT gcuVIDMEM_NODE_PTR * Node
265 gckVIDMEM videoMemory;
267 /* Get initial pool. */
268 switch (pool = *Pool)
270 case gcvPOOL_DEFAULT:
272 pool = gcvPOOL_LOCAL_INTERNAL;
275 case gcvPOOL_UNIFIED:
276 pool = gcvPOOL_SYSTEM;
285 /* Verify the number of bytes to allocate. */
288 status = gcvSTATUS_INVALID_ARGUMENT;
292 if (pool == gcvPOOL_VIRTUAL)
294 /* Create a gcuVIDMEM_NODE for virtual memory. */
295 gcmkERR_BREAK(gckVIDMEM_ConstructVirtual(Kernel, gcvFALSE, Bytes, Node));
303 /* Get pointer to gckVIDMEM object for pool. */
304 status = gckKERNEL_GetVideoMemoryPool(Kernel, pool, &videoMemory);
306 if (status == gcvSTATUS_OK)
308 /* Allocate memory. */
309 status = gckVIDMEM_AllocateLinear(videoMemory,
315 if (status == gcvSTATUS_OK)
317 /* Memory allocated. */
323 if (pool == gcvPOOL_LOCAL_INTERNAL)
325 /* Advance to external memory. */
326 pool = gcvPOOL_LOCAL_EXTERNAL;
328 else if (pool == gcvPOOL_LOCAL_EXTERNAL)
330 /* Advance to contiguous system memory. */
331 pool = gcvPOOL_SYSTEM;
333 else if (pool == gcvPOOL_SYSTEM)
335 /* Advance to virtual memory. */
336 #if ENABLE_VG_TRY_VIRTUAL_MEMORY
337 pool = gcvPOOL_VIRTUAL;
339 /*VG non-contiguous memory support is not ready yet, disable it temporary*/
340 status = gcvSTATUS_OUT_OF_MEMORY;
347 status = gcvSTATUS_OUT_OF_MEMORY;
351 /* Loop only for multiple selection pools. */
352 while ((*Pool == gcvPOOL_DEFAULT)
353 || (*Pool == gcvPOOL_LOCAL)
354 || (*Pool == gcvPOOL_UNIFIED)
357 if (gcmIS_SUCCESS(status))
359 /* Return pool used for allocation. */
367 /*******************************************************************************
369 ** gckKERNEL_Dispatch
371 ** Dispatch a command received from the user HAL layer.
376 ** Pointer to an gckKERNEL object.
378 ** gcsHAL_INTERFACE * Interface
379 ** Pointer to a gcsHAL_INTERFACE structure that defines the command to
384 ** gcsHAL_INTERFACE * Interface
385 ** Pointer to a gcsHAL_INTERFACE structure that receives any data to be
388 gceSTATUS gckVGKERNEL_Dispatch(
391 IN OUT gcsHAL_INTERFACE * Interface
395 gcsHAL_INTERFACE * kernelInterface = Interface;
396 gcuVIDMEM_NODE_PTR node;
398 gckKERNEL kernel = Kernel;
399 gctPOINTER info = gcvNULL;
400 gctPHYS_ADDR physical = gcvNULL;
401 gctPOINTER logical = gcvNULL;
404 gcmkHEADER_ARG("Kernel=0x%x Interface=0x%x ", Kernel, Interface);
406 /* Verify the arguments. */
407 gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
408 gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
410 gcmkONERROR(gckOS_GetProcessID(&processID));
412 /* Dispatch on command. */
413 switch (Interface->command)
415 case gcvHAL_QUERY_VIDEO_MEMORY:
416 /* Query video memory size. */
417 gcmkERR_BREAK(gckKERNEL_QueryVideoMemory(
418 Kernel, kernelInterface
422 case gcvHAL_QUERY_CHIP_IDENTITY:
423 /* Query chip identity. */
424 gcmkERR_BREAK(gckVGHARDWARE_QueryChipIdentity(
425 Kernel->vg->hardware,
426 &kernelInterface->u.QueryChipIdentity.chipModel,
427 &kernelInterface->u.QueryChipIdentity.chipRevision,
428 &kernelInterface->u.QueryChipIdentity.chipFeatures,
429 &kernelInterface->u.QueryChipIdentity.chipMinorFeatures,
430 &kernelInterface->u.QueryChipIdentity.chipMinorFeatures2
434 case gcvHAL_QUERY_COMMAND_BUFFER:
435 /* Query command buffer information. */
436 gcmkERR_BREAK(gckKERNEL_QueryCommandBuffer(
438 &kernelInterface->u.QueryCommandBuffer.information
441 case gcvHAL_ALLOCATE_NON_PAGED_MEMORY:
442 bytes = (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes;
443 /* Allocate non-paged memory. */
444 gcmkERR_BREAK(gckOS_AllocateContiguous(
452 kernelInterface->u.AllocateNonPagedMemory.bytes = bytes;
453 kernelInterface->u.AllocateNonPagedMemory.logical = gcmPTR_TO_UINT64(logical);
454 kernelInterface->u.AllocateNonPagedMemory.physical = gcmPTR_TO_NAME(physical);
457 case gcvHAL_FREE_NON_PAGED_MEMORY:
458 physical = gcmNAME_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.physical);
460 /* Unmap user logical out of physical memory first. */
461 gcmkERR_BREAK(gckOS_UnmapUserLogical(
464 (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
465 gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
468 /* Free non-paged memory. */
469 gcmkERR_BREAK(gckOS_FreeNonPagedMemory(
471 (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
473 gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
476 gcmRELEASE_NAME(kernelInterface->u.AllocateNonPagedMemory.physical);
479 case gcvHAL_ALLOCATE_CONTIGUOUS_MEMORY:
480 bytes = (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes;
481 /* Allocate contiguous memory. */
482 gcmkERR_BREAK(gckOS_AllocateContiguous(
490 kernelInterface->u.AllocateNonPagedMemory.bytes = bytes;
491 kernelInterface->u.AllocateNonPagedMemory.logical = gcmPTR_TO_UINT64(logical);
492 kernelInterface->u.AllocateNonPagedMemory.physical = gcmPTR_TO_NAME(physical);
495 case gcvHAL_FREE_CONTIGUOUS_MEMORY:
496 physical = gcmNAME_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.physical);
497 /* Unmap user logical out of physical memory first. */
498 gcmkERR_BREAK(gckOS_UnmapUserLogical(
501 (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes,
502 gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical)
505 /* Free contiguous memory. */
506 gcmkERR_BREAK(gckOS_FreeContiguous(
509 gcmUINT64_TO_PTR(kernelInterface->u.AllocateNonPagedMemory.logical),
510 (gctSIZE_T) kernelInterface->u.AllocateNonPagedMemory.bytes
513 gcmRELEASE_NAME(kernelInterface->u.AllocateNonPagedMemory.physical);
516 case gcvHAL_ALLOCATE_VIDEO_MEMORY:
519 gctUINT32 bitsPerPixel;
522 /* Align width and height to tiles. */
523 gcmkERR_BREAK(gckVGHARDWARE_AlignToTile(
524 Kernel->vg->hardware,
525 kernelInterface->u.AllocateVideoMemory.type,
526 &kernelInterface->u.AllocateVideoMemory.width,
527 &kernelInterface->u.AllocateVideoMemory.height
530 /* Convert format into bytes per pixel and bytes per tile. */
531 gcmkERR_BREAK(gckVGHARDWARE_ConvertFormat(
532 Kernel->vg->hardware,
533 kernelInterface->u.AllocateVideoMemory.format,
538 /* Compute number of bits for the allocation. */
540 = kernelInterface->u.AllocateVideoMemory.width
541 * kernelInterface->u.AllocateVideoMemory.height
542 * kernelInterface->u.AllocateVideoMemory.depth
545 /* Compute number of bytes for the allocation. */
546 bytes = gcmALIGN(bits, 8) / 8;
548 /* Allocate memory. */
549 gcmkERR_BREAK(gckKERNEL_AllocateLinearMemory(
551 &kernelInterface->u.AllocateVideoMemory.pool,
554 kernelInterface->u.AllocateVideoMemory.type,
558 kernelInterface->u.AllocateVideoMemory.node = gcmPTR_TO_UINT64(node);
562 case gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY:
563 /* Allocate memory. */
564 gcmkERR_BREAK(gckKERNEL_AllocateLinearMemory(
566 &kernelInterface->u.AllocateLinearVideoMemory.pool,
567 kernelInterface->u.AllocateLinearVideoMemory.bytes,
568 kernelInterface->u.AllocateLinearVideoMemory.alignment,
569 kernelInterface->u.AllocateLinearVideoMemory.type,
573 gcmkERR_BREAK(gckKERNEL_AddProcessDB(Kernel,
574 processID, gcvDB_VIDEO_MEMORY,
577 kernelInterface->u.AllocateLinearVideoMemory.bytes
580 kernelInterface->u.AllocateLinearVideoMemory.node = gcmPTR_TO_UINT64(node);
583 case gcvHAL_FREE_VIDEO_MEMORY:
584 node = gcmUINT64_TO_PTR(Interface->u.FreeVideoMemory.node);
586 /* Unmap the video memory */
588 if ((node->VidMem.memory->object.type == gcvOBJ_VIDMEM) &&
589 (node->VidMem.logical != gcvNULL))
591 gckKERNEL_UnmapVideoMemory(Kernel,
592 node->VidMem.logical,
595 node->VidMem.logical = gcvNULL;
597 #endif /* __QNXNTO__ */
599 /* Free video memory. */
600 gcmkERR_BREAK(gckVIDMEM_Free(
604 gcmkERR_BREAK(gckKERNEL_RemoveProcessDB(
606 processID, gcvDB_VIDEO_MEMORY,
612 case gcvHAL_MAP_MEMORY:
614 gcmkERR_BREAK(gckKERNEL_MapMemory(
616 gcmINT2PTR(kernelInterface->u.MapMemory.physical),
617 (gctSIZE_T) kernelInterface->u.MapMemory.bytes,
620 kernelInterface->u.MapMemory.logical = gcmPTR_TO_UINT64(logical);
623 case gcvHAL_UNMAP_MEMORY:
625 gcmkERR_BREAK(gckKERNEL_UnmapMemory(
627 gcmINT2PTR(kernelInterface->u.MapMemory.physical),
628 (gctSIZE_T) kernelInterface->u.MapMemory.bytes,
629 gcmUINT64_TO_PTR(kernelInterface->u.MapMemory.logical)
633 case gcvHAL_MAP_USER_MEMORY:
634 /* Map user memory to DMA. */
635 gcmkERR_BREAK(gckOS_MapUserMemory(
638 gcmUINT64_TO_PTR(kernelInterface->u.MapUserMemory.memory),
639 kernelInterface->u.MapUserMemory.physical,
640 (gctSIZE_T) kernelInterface->u.MapUserMemory.size,
642 &kernelInterface->u.MapUserMemory.address
645 kernelInterface->u.MapUserMemory.info = gcmPTR_TO_NAME(info);
648 case gcvHAL_UNMAP_USER_MEMORY:
649 /* Unmap user memory. */
650 gcmkERR_BREAK(gckOS_UnmapUserMemory(
653 gcmUINT64_TO_PTR(kernelInterface->u.UnmapUserMemory.memory),
654 (gctSIZE_T) kernelInterface->u.UnmapUserMemory.size,
655 gcmNAME_TO_PTR(kernelInterface->u.UnmapUserMemory.info),
656 kernelInterface->u.UnmapUserMemory.address
658 gcmRELEASE_NAME(kernelInterface->u.UnmapUserMemory.info);
660 case gcvHAL_LOCK_VIDEO_MEMORY:
661 node = gcmUINT64_TO_PTR(Interface->u.LockVideoMemory.node);
663 /* Lock video memory. */
665 gckVIDMEM_Lock(Kernel,
668 &Interface->u.LockVideoMemory.address));
670 if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
672 /* Map video memory address into user space. */
674 if (node->VidMem.logical == gcvNULL)
677 gckKERNEL_MapVideoMemory(Kernel,
679 Interface->u.LockVideoMemory.address,
682 &node->VidMem.logical));
685 Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->VidMem.logical);
688 gckKERNEL_MapVideoMemoryEx(Kernel,
691 Interface->u.LockVideoMemory.address,
693 Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(logical);
698 Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(node->Virtual.logical);
701 status = gcvSTATUS_OK;
705 /* Return logical address as physical address. */
706 Interface->u.LockVideoMemory.address =
707 (gctUINT32)(Interface->u.LockVideoMemory.memory);
710 gckKERNEL_AddProcessDB(Kernel,
711 processID, gcvDB_VIDEO_MEMORY_LOCKED,
717 case gcvHAL_UNLOCK_VIDEO_MEMORY:
718 /* Unlock video memory. */
719 node = gcmUINT64_TO_PTR(Interface->u.UnlockVideoMemory.node);
722 /* Save node information before it disappears. */
723 if (node->VidMem.memory->object.type == gcvOBJ_VIDMEM)
730 logical = node->Virtual.logical;
731 bytes = node->Virtual.bytes;
735 /* Unlock video memory. */
737 gckVIDMEM_Unlock(Kernel,
739 Interface->u.UnlockVideoMemory.type,
740 &Interface->u.UnlockVideoMemory.asynchroneous));
743 /* Flush the translation cache for virtual surfaces. */
744 if (logical != gcvNULL)
746 gcmkVERIFY_OK(gckKERNEL_FlushTranslationCache(Kernel,
753 if (Interface->u.UnlockVideoMemory.asynchroneous == gcvFALSE)
755 /* There isn't a event to unlock this node, remove record now */
757 gckKERNEL_RemoveProcessDB(Kernel,
758 processID, gcvDB_VIDEO_MEMORY_LOCKED,
763 case gcvHAL_USER_SIGNAL:
764 #if !USE_NEW_LINUX_SIGNAL
765 /* Dispatch depends on the user signal subcommands. */
766 switch(Interface->u.UserSignal.command)
768 case gcvUSER_SIGNAL_CREATE:
769 /* Create a signal used in the user space. */
771 gckOS_CreateUserSignal(Kernel->os,
772 Interface->u.UserSignal.manualReset,
773 &Interface->u.UserSignal.id));
776 gckKERNEL_AddProcessDB(Kernel,
777 processID, gcvDB_SIGNAL,
778 gcmINT2PTR(Interface->u.UserSignal.id),
783 case gcvUSER_SIGNAL_DESTROY:
784 /* Destroy the signal. */
786 gckOS_DestroyUserSignal(Kernel->os,
787 Interface->u.UserSignal.id));
789 gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
791 processID, gcvDB_SIGNAL,
792 gcmINT2PTR(Interface->u.UserSignal.id)));
795 case gcvUSER_SIGNAL_SIGNAL:
796 /* Signal the signal. */
798 gckOS_SignalUserSignal(Kernel->os,
799 Interface->u.UserSignal.id,
800 Interface->u.UserSignal.state));
803 case gcvUSER_SIGNAL_WAIT:
804 /* Wait on the signal. */
805 status = gckOS_WaitUserSignal(Kernel->os,
806 Interface->u.UserSignal.id,
807 Interface->u.UserSignal.wait);
811 /* Invalid user signal command. */
812 gcmkERR_BREAK(gcvSTATUS_INVALID_ARGUMENT);
818 /* Commit a command and context buffer. */
819 gcmkERR_BREAK(gckVGCOMMAND_Commit(
821 gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.context),
822 gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.queue),
823 kernelInterface->u.VGCommit.entryCount,
824 gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.taskTable)
828 kernelInterface->u.Version.major = gcvVERSION_MAJOR;
829 kernelInterface->u.Version.minor = gcvVERSION_MINOR;
830 kernelInterface->u.Version.patch = gcvVERSION_PATCH;
831 kernelInterface->u.Version.build = gcvVERSION_BUILD;
832 status = gcvSTATUS_OK;
835 case gcvHAL_GET_BASE_ADDRESS:
836 /* Get base address. */
838 gckOS_GetBaseAddress(Kernel->os,
839 &kernelInterface->u.GetBaseAddress.baseAddress));
842 /* Invalid command. */
843 status = gcvSTATUS_INVALID_ARGUMENT;
848 kernelInterface->status = status;
852 /* Return the status. */
856 /*******************************************************************************
858 ** gckKERNEL_QueryCommandBuffer
860 ** Query command buffer attributes.
865 ** Pointer to an gckVGHARDWARE object.
869 ** gcsCOMMAND_BUFFER_INFO_PTR Information
870 ** Pointer to the information structure to receive buffer attributes.
873 gckKERNEL_QueryCommandBuffer(
875 OUT gcsCOMMAND_BUFFER_INFO_PTR Information
880 gcmkHEADER_ARG("Kernel=0x%x *Pool=0x%x",
881 Kernel, Information);
882 /* Verify the arguments. */
883 gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
885 /* Get the information. */
886 status = gckVGCOMMAND_QueryCommandBuffer(Kernel->vg->command, Information);
893 #endif /* gcdENABLE_VG */