diff options
| author | wdenk <wdenk> | 2002-11-19 11:04:11 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2002-11-19 11:04:11 +0000 | 
| commit | c7de829c796978e519984df2f1c8cfcf921a39a4 (patch) | |
| tree | 43e42aa9a09f5265783c1622a5cea080471ef50e /board/MAI/bios_emulator/scitech/src/common/agplib.c | |
| parent | 2262cfeef91458b01a1bfe3812ccbbfdf8b82807 (diff) | |
| download | olio-uboot-2014.01-c7de829c796978e519984df2f1c8cfcf921a39a4.tar.xz olio-uboot-2014.01-c7de829c796978e519984df2f1c8cfcf921a39a4.zip | |
* Patch by Thomas Frieden, 13 Nov 2002:
  Add code for AmigaOne board
  (preliminary merge to U-Boot, still WIP)
* Patch by Jon Diekema, 12 Nov 2002:
  - Adding URL for IEEE OUI lookup
  - Making the autoboot #defines dependent on CONFIG_AUTOBOOT_KEYED
    being defined.
  - In the CONFIG_EXTRA_ENV_SETTINGS #define, the root-on-initrd and
    root-on-nfs macros are designed to switch how the default boot
    method gets defined.
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/common/agplib.c')
| -rw-r--r-- | board/MAI/bios_emulator/scitech/src/common/agplib.c | 220 | 
1 files changed, 220 insertions, 0 deletions
| diff --git a/board/MAI/bios_emulator/scitech/src/common/agplib.c b/board/MAI/bios_emulator/scitech/src/common/agplib.c new file mode 100644 index 000000000..df8f932fb --- /dev/null +++ b/board/MAI/bios_emulator/scitech/src/common/agplib.c @@ -0,0 +1,220 @@ +/**************************************************************************** +* +*                   SciTech Nucleus Graphics Architecture +* +*               Copyright (C) 1991-1998 SciTech Software, Inc. +*                            All rights reserved. +* +*  ====================================================================== +*  |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +*  |                                                                    | +*  |This copyrighted computer code contains proprietary technology      | +*  |owned by SciTech Software, Inc., located at 505 Wall Street,        | +*  |Chico, CA 95928 USA (http://www.scitechsoft.com).                   | +*  |                                                                    | +*  |The contents of this file are subject to the SciTech Nucleus        | +*  |License; you may *not* use this file or related software except in  | +*  |compliance with the License. You may obtain a copy of the License   | +*  |at http://www.scitechsoft.com/nucleus-license.txt                   | +*  |                                                                    | +*  |Software distributed under the License is distributed on an         | +*  |"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or      | +*  |implied. See the License for the specific language governing        | +*  |rights and limitations under the License.                           | +*  |                                                                    | +*  |REMOVAL OR MODIFICATION OF THIS HEADER IS STRICTLY PROHIBITED BY LAW| +*  ====================================================================== +* +* Language:     ANSI C +* Environment:  Any 32-bit protected mode environment +* +* Description:  C module for the Graphics Accelerator Driver API. Uses +*               the SciTech PM library for interfacing with DOS +*               extender specific functions. +* +****************************************************************************/ + +#include "nucleus/graphics.h" +#include "nucleus/agp.h" + +/*---------------------------- Global Variables ---------------------------*/ + +#ifndef DEBUG_AGP_DRIVER +static AGP_exports  _AGP_exports; +static int          loaded = false; +static PE_MODULE    *hModBPD = NULL; + +static N_imports _N_imports = { +    sizeof(N_imports), +    _OS_delay, +    }; + +static AGP_imports _AGP_imports = { +    sizeof(AGP_imports), +    }; +#endif + +#include "pmimp.h" + +/*----------------------------- Implementation ----------------------------*/ + +#define DLL_NAME        "agp.bpd" + +#ifndef DEBUG_AGP_DRIVER +/**************************************************************************** +REMARKS: +Fatal error handler for non-exported GA_exports. +****************************************************************************/ +static void _AGP_fatalErrorHandler(void) +{ +    PM_fatalError("Unsupported AGP export function called! Please upgrade your copy of AGP!\n"); +} + +/**************************************************************************** +PARAMETERS: +shared  - True to load the driver into shared memory. + +REMARKS: +Loads the Nucleus binary portable DLL into memory and initilises it. +****************************************************************************/ +static ibool LoadDriver(void) +{ +    AGP_initLibrary_t   AGP_initLibrary; +    AGP_exports         *agpExp; +    char                filename[PM_MAX_PATH]; +    char                bpdpath[PM_MAX_PATH]; +    int                 i,max; +    ulong               *p; + +    /* Check if we have already loaded the driver */ +    if (loaded) +        return true; +    PM_init(); + +    /* Open the BPD file */ +    if (!PM_findBPD(DLL_NAME,bpdpath)) +        return false; +    strcpy(filename,bpdpath); +    strcat(filename,DLL_NAME); +    if ((hModBPD = PE_loadLibrary(filename,false)) == NULL) +        return false; +    if ((AGP_initLibrary = (AGP_initLibrary_t)PE_getProcAddress(hModBPD,"_AGP_initLibrary")) == NULL) +        return false; +    bpdpath[strlen(bpdpath)-1] = 0; +    if (strcmp(bpdpath,PM_getNucleusPath()) == 0) +        strcpy(bpdpath,PM_getNucleusConfigPath()); +    else { +        PM_backslash(bpdpath); +        strcat(bpdpath,"config"); +        } +    if ((agpExp = AGP_initLibrary(bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_AGP_imports)) == NULL) +        PM_fatalError("AGP_initLibrary failed!\n"); +    _AGP_exports.dwSize = sizeof(_AGP_exports); +    max = sizeof(_AGP_exports)/sizeof(AGP_initLibrary_t); +    for (i = 0,p = (ulong*)&_AGP_exports; i < max; i++) +        *p++ = (ulong)_AGP_fatalErrorHandler; +    memcpy(&_AGP_exports,agpExp,MIN(sizeof(_AGP_exports),agpExp->dwSize)); +    loaded = true; +    return true; +} + +/* The following are stub entry points that the application calls to + * initialise the Nucleus loader library, and we use this to load our + * driver DLL from disk and initialise the library using it. + */ + +/* {secret} */ +int NAPI AGP_status(void) +{ +    if (!loaded) +        return nDriverNotFound; +    return _AGP_exports.AGP_status(); +} + +/* {secret} */ +const char * NAPI AGP_errorMsg( +    N_int32 status) +{ +    if (!loaded) +        return "Unable to load Nucleus device driver!"; +    return _AGP_exports.AGP_errorMsg(status); +} + +/* {secret} */ +AGP_devCtx * NAPI AGP_loadDriver(N_int32 deviceIndex) +{ +    if (!LoadDriver()) +        return NULL; +    return _AGP_exports.AGP_loadDriver(deviceIndex); +} + +/* {secret} */ +void NAPI AGP_unloadDriver( +    AGP_devCtx *dc) +{ +    if (loaded) +        _AGP_exports.AGP_unloadDriver(dc); +} + +/* {secret} */ +void NAPI AGP_getGlobalOptions( +    AGP_globalOptions *options) +{ +    if (LoadDriver()) +        _AGP_exports.AGP_getGlobalOptions(options); +} + +/* {secret} */ +void NAPI AGP_setGlobalOptions( +    AGP_globalOptions *options) +{ +    if (LoadDriver()) +        _AGP_exports.AGP_setGlobalOptions(options); +} + +/* {secret} */ +void NAPI AGP_saveGlobalOptions( +    AGP_globalOptions *options) +{ +    if (loaded) +        _AGP_exports.AGP_saveGlobalOptions(options); +} +#endif + +/* {secret} */ +void NAPI _OS_delay8253(N_uint32 microSeconds); + +/**************************************************************************** +REMARKS: +This function delays for the specified number of microseconds +****************************************************************************/ +void NAPI _OS_delay( +    N_uint32 microSeconds) +{ +    static ibool    inited = false; +    static ibool    haveRDTSC; +    LZTimerObject   tm; + +    if (!inited) { +#ifndef __WIN32_VXD__ +        // This has been causing problems in VxD's for some reason, so for now +        // we avoid using it. +        if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { +            ZTimerInit(); +            haveRDTSC = true; +            } +        else +#endif +            haveRDTSC = false; +        inited = true; +        } +    if (haveRDTSC) { +        LZTimerOnExt(&tm); +        while (LZTimerLapExt(&tm) < microSeconds) +            ; +        LZTimerOnExt(&tm); +        } +    else +        _OS_delay8253(microSeconds); +} + |