| /**************************************************************************** |
| * |
| * The MIT License (MIT) |
| * |
| * Copyright (c) 2014 - 2018 Vivante Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| * DEALINGS IN THE SOFTWARE. |
| * |
| ***************************************************************************** |
| * |
| * The GPL License (GPL) |
| * |
| * Copyright (C) 2014 - 2018 Vivante Corporation |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| ***************************************************************************** |
| * |
| * Note: This software is released under dual MIT and GPL licenses. A |
| * recipient may use this file under the terms of either the MIT license or |
| * GPL License. If you wish to use only one license not the other, you can |
| * indicate your decision by deleting one of the above license notices in your |
| * version of this file. |
| * |
| *****************************************************************************/ |
| |
| |
| #include "gc_hal.h" |
| #include "gc_hal_kernel.h" |
| |
| #if gcdENABLE_VG |
| |
| #include "gc_hal_kernel_hardware_command_vg.h" |
| |
| #define _GC_OBJ_ZONE gcvZONE_COMMAND |
| |
| /******************************************************************************\ |
| ****************************** gckVGCOMMAND API code ***************************** |
| \******************************************************************************/ |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_InitializeInfo |
| ** |
| ** Initialize architecture dependent command buffer information. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to the Command object. |
| ** |
| ** OUTPUT: |
| ** |
| ** Nothing. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_InitializeInfo( |
| IN gckVGCOMMAND Command |
| ) |
| { |
| gceSTATUS status; |
| gcmkHEADER_ARG("Command=0x%x", Command); |
| |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| do |
| { |
| /* Reset interrupts. */ |
| Command->info.feBufferInt = -1; |
| Command->info.tsOverflowInt = -1; |
| |
| /* Set command buffer attributes. */ |
| Command->info.addressAlignment = 64; |
| Command->info.commandAlignment = 8; |
| |
| /* Determine command alignment address mask. */ |
| Command->info.addressMask = ((((gctUINT32) (Command->info.addressAlignment - 1)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 1:0) - (0 ? |
| 1:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 1:0) - (0 ? |
| 1:0) + 1))))))) << (0 ? |
| 1:0))) | (((gctUINT32) ((gctUINT32) (0 ) & ((gctUINT32) ((((1 ? |
| 1:0) - (0 ? |
| 1:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))); |
| |
| /* Query the number of bytes needed by the STATE command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_StateCommand( |
| Command, 0x0, gcvNULL, (gctUINT32)~0, 0, |
| &Command->info.stateCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the RESTART command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_RestartCommand( |
| Command, gcvNULL, (gctUINT32)~0, 0, |
| &Command->info.restartCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the FETCH command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_FetchCommand( |
| Command, gcvNULL, (gctUINT32)~0, 0, |
| &Command->info.fetchCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the CALL command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_CallCommand( |
| Command, gcvNULL, (gctUINT32)~0, 0, |
| &Command->info.callCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the RETURN command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_ReturnCommand( |
| Command, gcvNULL, |
| &Command->info.returnCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the EVENT command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_EventCommand( |
| Command, gcvNULL, gcvBLOCK_PIXEL, -1, |
| &Command->info.eventCommandSize |
| )); |
| |
| /* Query the number of bytes needed by the END command. */ |
| gcmkERR_BREAK(gckVGCOMMAND_EndCommand( |
| Command, gcvNULL, -1, |
| &Command->info.endCommandSize |
| )); |
| |
| /* Determine the tail reserve size. */ |
| Command->info.staticTailSize = gcmMAX( |
| Command->info.fetchCommandSize, |
| gcmMAX( |
| Command->info.returnCommandSize, |
| Command->info.endCommandSize |
| ) |
| ); |
| |
| /* Determine the maximum tail size. */ |
| Command->info.dynamicTailSize |
| = Command->info.staticTailSize |
| + Command->info.eventCommandSize * gcvBLOCK_COUNT; |
| } |
| while (gcvFALSE); |
| |
| gcmkFOOTER(); |
| /* Return status. */ |
| return status; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_StateCommand |
| ** |
| ** Append a STATE command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to an gckVGCOMMAND object. |
| ** |
| ** gctUINT32 Pipe |
| ** Harwdare destination pipe. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** STATE command at or gcvNULL to query the size of the command. |
| ** |
| ** gctUINT32 Address |
| ** Starting register address of the state buffer. |
| ** If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gctUINT32 Count |
| ** Number of states in state buffer. |
| ** If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the STATE command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the STATE command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_StateCommand( |
| IN gckVGCOMMAND Command, |
| IN gctUINT32 Pipe, |
| IN gctPOINTER Logical, |
| IN gctUINT32 Address, |
| IN gctUINT32 Count, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Pipe=0x%x Logical=0x%x Address=0x%x Count=0x%x Bytes = 0x%x", |
| Command, Pipe, Logical, Address, Count, Bytes); |
| |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append STATE. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1))))))) << (0 ? |
| 11:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 11:0) - (0 ? 11:0) + 1))))))) << (0 ? 11:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1))))))) << (0 ? |
| 27:16))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 27:16) - (0 ? 27:16) + 1))))))) << (0 ? 27:16))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1))))))) << (0 ? |
| 13:12))) | (((gctUINT32) ((gctUINT32) (Pipe) & ((gctUINT32) ((((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12))) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the STATE command. */ |
| *Bytes = 4 * (Count + 1); |
| } |
| } |
| else |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append LOAD_STATE. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1))))))) << (0 ? |
| 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1))))))) << (0 ? |
| 25:16))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1))))))) << (0 ? |
| 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the STATE command. */ |
| *Bytes = 4 * (Count + 1); |
| } |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_RestartCommand |
| ** |
| ** Form a RESTART command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to an gckVGCOMMAND object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** RESTART command at or gcvNULL to query the size of the command. |
| ** |
| ** gctUINT32 FetchAddress |
| ** The address of another command buffer to be executed by this RESTART |
| ** command. If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gctUINT FetchCount |
| ** The number of 64-bit data quantities in another command buffer to |
| ** be executed by this RESTART command. If 'Logical' is gcvNULL, this |
| ** argument is ignored. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the RESTART command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the RESTART command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_RestartCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN gctUINT32 FetchAddress, |
| IN gctUINT FetchCount, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x", |
| Command, Logical, FetchAddress, FetchCount, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| gctUINT32 beginEndMark; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Determine Begin/End flag. */ |
| beginEndMark = (FetchCount > 0) |
| ? |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1))))))) << (0 ? |
| 24:24))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24))) |
| : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1))))))) << (0 ? |
| 24:24))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? |
| 24:24) - (0 ? |
| 24:24) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24))); |
| |
| /* Append RESTART. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x9 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1))))))) << (0 ? |
| 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0))) |
| | beginEndMark |
| ); |
| |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| FetchAddress |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the RESTART command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_FetchCommand |
| ** |
| ** Form a FETCH command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to an gckVGCOMMAND object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** FETCH command at or gcvNULL to query the size of the command. |
| ** |
| ** gctUINT32 FetchAddress |
| ** The address of another command buffer to be executed by this FETCH |
| ** command. If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gctUINT FetchCount |
| ** The number of 64-bit data quantities in another command buffer to |
| ** be executed by this FETCH command. If 'Logical' is gcvNULL, this |
| ** argument is ignored. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the FETCH command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the FETCH command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_FetchCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN gctUINT32 FetchAddress, |
| IN gctUINT FetchCount, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x", |
| Command, Logical, FetchAddress, FetchCount, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append FETCH. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x5 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1))))))) << (0 ? |
| 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0))) |
| ); |
| |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| gcmkFIXADDRESS(FetchAddress) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the FETCH command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append LINK. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1))))))) << (0 ? |
| 31:27))) | (((gctUINT32) (0x08 & ((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1))))))) << (0 ? |
| 15:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) |
| ); |
| |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| gcmkFIXADDRESS(FetchAddress) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the LINK command. */ |
| *Bytes = 8; |
| } |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_CallCommand |
| ** |
| ** Append a CALL command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to an gckVGCOMMAND object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** CALL command at or gcvNULL to query the size of the command. |
| ** |
| ** gctUINT32 FetchAddress |
| ** The address of another command buffer to be executed by this CALL |
| ** command. If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gctUINT FetchCount |
| ** The number of 64-bit data quantities in another command buffer to |
| ** be executed by this CALL command. If 'Logical' is gcvNULL, this |
| ** argument is ignored. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the CALL command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the CALL command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_CallCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN gctUINT32 FetchAddress, |
| IN gctUINT FetchCount, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x", |
| Command, Logical, FetchAddress, FetchCount, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append CALL. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x6 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1))))))) << (0 ? |
| 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ? |
| 20:0) - (0 ? |
| 20:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0))) |
| ); |
| |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| gcmkFIXADDRESS(FetchAddress) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the CALL command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_ReturnCommand |
| ** |
| ** Append a RETURN command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to an gckVGCOMMAND object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** RETURN command at or gcvNULL to query the size of the command. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the RETURN command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the RETURN command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_ReturnCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x Bytes = 0x%x", |
| Command, Logical, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append RETURN. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x7 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the RETURN command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_EventCommand |
| ** |
| ** Form an EVENT command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to the Command object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** EVENT command at or gcvNULL to query the size of the command. |
| ** |
| ** gctINT32 InterruptId |
| ** The ID of the interrupt to generate. |
| ** If 'Logical' is gcvNULL, this argument is ignored. |
| ** |
| ** gceBLOCK Block |
| ** Block that will generate the interrupt. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the EVENT command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the END command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_EventCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN gceBLOCK Block, |
| IN gctINT32 InterruptId, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x Block=0x%x InterruptId=0x%x Bytes = 0x%x", |
| Command, Logical, Block, InterruptId, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| typedef struct _gcsEVENTSTATES |
| { |
| /* Chips before VG21 use these values. */ |
| gctUINT eventFromFE; |
| gctUINT eventFromPE; |
| |
| /* VG21 chips and later use SOURCE field. */ |
| gctUINT eventSource; |
| } |
| gcsEVENTSTATES; |
| |
| static gcsEVENTSTATES states[] = |
| { |
| /* gcvBLOCK_COMMAND */ |
| { |
| (gctUINT)~0, |
| (gctUINT)~0, |
| (gctUINT)~0 |
| }, |
| |
| /* gcvBLOCK_TESSELLATOR */ |
| { |
| 0x0, |
| 0x1, |
| 0x10 |
| }, |
| |
| /* gcvBLOCK_TESSELLATOR2 */ |
| { |
| 0x0, |
| 0x1, |
| 0x12 |
| }, |
| |
| /* gcvBLOCK_TESSELLATOR3 */ |
| { |
| 0x0, |
| 0x1, |
| 0x14 |
| }, |
| |
| /* gcvBLOCK_RASTER */ |
| { |
| 0x0, |
| 0x1, |
| 0x07, |
| }, |
| |
| /* gcvBLOCK_VG */ |
| { |
| 0x0, |
| 0x1, |
| 0x0F |
| }, |
| |
| /* gcvBLOCK_VG2 */ |
| { |
| 0x0, |
| 0x1, |
| 0x11 |
| }, |
| |
| /* gcvBLOCK_VG3 */ |
| { |
| 0x0, |
| 0x1, |
| 0x13 |
| }, |
| |
| /* gcvBLOCK_PIXEL */ |
| { |
| 0x0, |
| 0x1, |
| 0x07 |
| }, |
| }; |
| |
| /* Verify block ID. */ |
| gcmkVERIFY_ARGUMENT(gcmIS_VALID_INDEX(Block, states)); |
| |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Verify the event ID. */ |
| gcmkVERIFY_ARGUMENT(InterruptId >= 0); |
| gcmkVERIFY_ARGUMENT(InterruptId <= ((gctUINT32) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1)))))); |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append EVENT. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1))))))) << (0 ? |
| 11:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ? |
| 11:0) - (0 ? |
| 11:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 11:0) - (0 ? 11:0) + 1))))))) << (0 ? 11:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1))))))) << (0 ? |
| 27:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? |
| 27:16) - (0 ? |
| 27:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 27:16) - (0 ? 27:16) + 1))))))) << (0 ? 27:16))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1))))))) << (0 ? |
| 13:12))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? |
| 13:12) - (0 ? |
| 13:12) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12))) |
| ); |
| |
| /* Determine chip version. */ |
| if (Command->vg21) |
| { |
| /* Get the event source for the block. */ |
| gctUINT eventSource = states[Block].eventSource; |
| |
| /* Supported? */ |
| if (eventSource == ~0) |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| buffer[1] |
| = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 12:8) - (0 ? |
| 12:8) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 12:8) - (0 ? |
| 12:8) + 1))))))) << (0 ? |
| 12:8))) | (((gctUINT32) ((gctUINT32) (eventSource) & ((gctUINT32) ((((1 ? |
| 12:8) - (0 ? |
| 12:8) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))); |
| } |
| else |
| { |
| /* Get the event source for the block. */ |
| gctUINT eventFromFE = states[Block].eventFromFE; |
| gctUINT eventFromPE = states[Block].eventFromPE; |
| |
| /* Supported? */ |
| if (eventFromFE == ~0) |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| buffer[1] |
| = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1))))))) << (0 ? |
| 5:5))) | (((gctUINT32) ((gctUINT32) (eventFromFE) & ((gctUINT32) ((((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1))))))) << (0 ? |
| 6:6))) | (((gctUINT32) ((gctUINT32) (eventFromPE) & ((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6))); |
| } |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Make sure the events are directly supported for the block. */ |
| if (states[Block].eventSource == ~0) |
| { |
| gcmkFOOTER_NO(); |
| return gcvSTATUS_NOT_SUPPORTED; |
| } |
| |
| /* Return number of bytes required by the END command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Verify the event ID. */ |
| gcmkVERIFY_ARGUMENT(InterruptId >= 0); |
| gcmkVERIFY_ARGUMENT(InterruptId <= ((gctUINT32) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1)))))); |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append EVENT. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1))))))) << (0 ? |
| 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1))))))) << (0 ? |
| 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1))))))) << (0 ? |
| 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) |
| ); |
| |
| /* Determine event source. */ |
| if (Block == gcvBLOCK_COMMAND) |
| { |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1))))))) << (0 ? |
| 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? |
| 5:5) - (0 ? |
| 5:5) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))) |
| ); |
| } |
| else |
| { |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[1], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1))))))) << (0 ? |
| 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6))) |
| ); |
| } |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the EVENT and END commands. */ |
| *Bytes = 8; |
| } |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** gckVGCOMMAND_EndCommand |
| ** |
| ** Form an END command at the specified location in the command buffer. |
| ** |
| ** INPUT: |
| ** |
| ** gckVGCOMMAND Command |
| ** Pointer to the Command object. |
| ** |
| ** gctPOINTER Logical |
| ** Pointer to the current location inside the command buffer to append |
| ** END command at or gcvNULL to query the size of the command. |
| ** |
| ** gctINT32 InterruptId |
| ** The ID of the interrupt to generate. |
| ** If 'Logical' is gcvNULL, this argument will be ignored. |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to the number of bytes available for the END command. |
| ** If 'Logical' is gcvNULL, the value from this argument is ignored. |
| ** |
| ** OUTPUT: |
| ** |
| ** gctSIZE_T * Bytes |
| ** Pointer to a variable that will receive the number of bytes required |
| ** for the END command. If 'Bytes' is gcvNULL, nothing is returned. |
| */ |
| gceSTATUS |
| gckVGCOMMAND_EndCommand( |
| IN gckVGCOMMAND Command, |
| IN gctPOINTER Logical, |
| IN gctINT32 InterruptId, |
| IN OUT gctUINT32 * Bytes |
| ) |
| { |
| gcmkHEADER_ARG("Command=0x%x Logical=0x%x InterruptId=0x%x Bytes = 0x%x", |
| Command, Logical, InterruptId, Bytes); |
| /* Verify the arguments. */ |
| gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND); |
| |
| if (Command->fe20) |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR buffer; |
| |
| /* Verify the event ID. */ |
| gcmkVERIFY_ARGUMENT(InterruptId >= 0); |
| |
| /* Cast the buffer pointer. */ |
| buffer = (gctUINT32_PTR) Logical; |
| |
| /* Append END. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &buffer[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1))))))) << (0 ? |
| 31:28))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ? |
| 31:28) - (0 ? |
| 31:28) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the END command. */ |
| *Bytes = 8; |
| } |
| } |
| else |
| { |
| if (Logical != gcvNULL) |
| { |
| gctUINT32_PTR memory; |
| |
| /* Verify the event ID. */ |
| gcmkVERIFY_ARGUMENT(InterruptId >= 0); |
| |
| /* Cast the buffer pointer. */ |
| memory = (gctUINT32_PTR) Logical; |
| |
| /* Append EVENT. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &memory[0], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1))))))) << (0 ? |
| 31:27))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1))))))) << (0 ? |
| 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ? |
| 15:0) - (0 ? |
| 15:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1))))))) << (0 ? |
| 25:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? |
| 25:16) - (0 ? |
| 25:16) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))) |
| ); |
| |
| gckOS_WriteMemory( |
| Command->os, |
| &memory[1], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1))))))) << (0 ? |
| 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ? |
| 4:0) - (0 ? |
| 4:0) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0))) |
| | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1))))))) << (0 ? |
| 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ? |
| 6:6) - (0 ? |
| 6:6) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6))) |
| ); |
| |
| /* Append END. */ |
| gckOS_WriteMemory( |
| Command->os, |
| &memory[2], |
| ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1))))))) << (0 ? |
| 31:27))) | (((gctUINT32) (0x02 & ((gctUINT32) ((((1 ? |
| 31:27) - (0 ? |
| 31:27) + 1) == 32) ? |
| ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) |
| ); |
| } |
| |
| if (Bytes != gcvNULL) |
| { |
| /* Return number of bytes required by the EVENT and END commands. */ |
| *Bytes = 16; |
| } |
| } |
| |
| gcmkFOOTER_NO(); |
| /* Success. */ |
| return gcvSTATUS_OK; |
| } |
| |
| #endif /* gcdENABLE_VG */ |
| |