Edit

IABSD.fr/xenocara/driver/xf86-video-geode/src/cimarron.c

Branch :

  • Show log

    Commit

  • Author : mbalmer
    Date : 2008-06-14 22:15:30
    Hash : 01d22674
    Message : Import the xf86-video-geode driver for the AMD Geode LX graphics processor. with and ok matthieu

  • driver/xf86-video-geode/src/cimarron.c
  • /*
     * Copyright (c) 2006 Advanced Micro Devices, Inc.
     *
     * 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.
     *
     * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
     * contributors may be used to endorse or promote products derived from this
     * software without specific prior written permission.
     */
    
     /*
      * Base include file for the Cimarron library. This file should be modified
      * and included in any Cimarron-based project.
      */
    
    #ifdef HAVE_CONFIG_H
    #include "config.h"
    #endif
    
    /*----------------------------------------------------------------------*/
    /* MODULE SETTINGS                                                      */
    /* The following #defines affect which modules are included in the      */
    /* project.                                                             */
    /*----------------------------------------------------------------------*/
    
    #define CIMARRON_INCLUDE_GP                1
    #define CIMARRON_INCLUDE_VG                1
    #define CIMARRON_INCLUDE_VIP               1
    #define CIMARRON_INCLUDE_VOP               1
    #define CIMARRON_INCLUDE_VIDEO             1
    #define CIMARRON_INCLUDE_INIT              1
    
    #define CIMARRON_INCLUDE_VG_READ_ROUTINES  1
    #define CIMARRON_INCLUDE_DF_READ_ROUTINES  1
    #define CIMARRON_INCLUDE_VIP_READ_ROUTINES 1
    #define CIMARRON_INCLUDE_VOP_READ_ROUTINES 1
    
    /*----------------------------------------------------------------------*/
    /* HARDWARE ACCESS SETTINGS                                             */
    /* The following #defines affect how the Cimarron macros access the     */
    /* hardware.  The hardware access macros are broken up into groups.     */
    /* Each group includes an enabling #define as well as several #define   */
    /* options that modify the macro configuration that is included.        */
    /* If the enabling define is deleted or all options are set to 0, the   */
    /* corresponding macros must be implemented by the user.   The          */
    /* combinations are explained as follows:                               */
    /* must be manually defined by the user. This allows a user to use the  */
    /* cim_defs.h file for only those macros that suit the needs of his/her */
    /* project.  For example, a user may need custom implementations of the */
    /* I/O and MSR macros, but may still want to use the default macros to  */
    /* read and write hardware registers. The combinations are explained as */
    /* follows:                                                             */
    /*                                                                      */
    /* Register Group:                                                      */
    /*   Disabling define:                                                  */
    /*       CIMARRON_EXCLUDE_REGISTER_ACCESS_MACROS                        */
    /*          Define this setting to exclude the register access macros.  */
    /*          This setting is the inverse of the other group settings in  */
    /*          that these macros are included by default.  This allows the */
    /*          cim_defs.h file to be included outside of cimarron.c for    */
    /*          basic operations.                                           */
    /*                                                                      */
    /* Memory Group:                                                        */
    /*   Enabling define:                                                   */
    /*       CIMARRON_INCLUDE_STRING_MACROS                                 */
    /*   Options:                                                           */
    /*       CIMARRON_OPTIMIZE_ASSEMBLY                                     */
    /*           Set to 1 to allow the use of inline assembly when writing  */
    /*           large chunks of data to memory.  Essentially, this allows  */
    /*           a rep movsd in place of a slower C for-loop.               */
    /*      CIMARRON_OPTIMIZE_FORLOOP                                       */
    /*           Define for C only data writes.                             */
    /*                                                                      */
    /* MSR Group:                                                           */
    /*   Enabling define:                                                   */
    /*      CIMARRON_INCLUDE_MSR_MACROS                                     */
    /*   Options:                                                           */
    /*      CIMARRON_MSR_DIRECT_ASM                                         */
    /*          Set to 1 to allow the use of the rdmsr and wrmsr opcodes in */
    /*          inline assembly.                                            */
    /*      CIMARRON_MSR_VSA_IO                                             */
    /*          Set to 1 to access MSRs using a VSAII virtual register.     */
    /*      CIMARRON_MSR_KERNEL_ROUTINE                                     */
    /*          Set to 1 to access MSRs using a wrapper routine in the      */
    /*          Linux kernel.                                               */
    /*                                                                      */
    /* IO Group:                                                            */
    /*   Enabling define:                                                   */
    /*      CIMARRON_INCLUDE_IO_MACROS                                      */
    /*   Options:                                                           */
    /*      CIMARRON_IO_DIRECT_ACCESS                                       */
    /*          Set to 1 to perform IO accesses using inline assembly.      */
    /*      CIMARRON_IO_ABSTRACTED_ASM                                      */
    /*          Set to 1 to perform IO using abstracted IO in Linux.        */
    /*                                                                      */
    /* Custom Group:                                                        */
    /*    Disabling define:                                                 */
    /*      CIMARRON_EXCLUDE_CUSTOM_MACROS                                  */
    /*          By default, the custom macros (the macros used by           */
    /*          gp_custom_convert_blt) are mapped to the normal command     */
    /*          string macros.  Setting this to 1 allows the user to        */
    /*          create a custom implementation.                             */
    /*----------------------------------------------------------------------*/
    
    /* UNCOMMENT THE FOLLOWING LINE TO EXCLUDE BASIC REGISTER ACCESS MACROS */
    
    /* #define CIMARRON_EXCLUDE_REGISTER_ACCESS_MACROS */
    
    #define CIMARRON_INCLUDE_STRING_MACROS
    #define CIMARRON_OPTIMIZE_ASSEMBLY         0
    #define CIMARRON_OPTIMIZE_FORLOOP          0
    #define CIMARRON_OPTIMIZE_ABSTRACTED_ASM   1
    
    #define CIMARRON_INCLUDE_MSR_MACROS
    #define CIMARRON_MSR_DIRECT_ASM            0
    #define CIMARRON_MSR_VSA_IO                0
    #define CIMARRON_MSR_ABSTRACTED_ASM        0
    #define CIMARRON_MSR_KERNEL_ROUTINE        0
    #define CIMARRON_MSR_HOOKS                 1
    
    #define CIMARRON_INCLUDE_IO_MACROS
    #define CIMARRON_IO_DIRECT_ACCESS          0
    #define CIMARRON_IO_ABSTRACTED_ASM         1
    
    /*
     * UNCOMMENT THE FOLLOWING LINE TO IMPLEMENT CUSTOM MACROS FOR
     * GP_CUSTOM_CONVERT_BLT
     */
    
    /* #define CIMARRON_EXCLUDE_CUSTOM_MACROS */
    
    /*----------------------------------------------------------------------*/
    /* MODULE VARIABLES                                                     */
    /* The following #defines affect how global variables in each Cimarron  */
    /* module are defined.  These variables can be made static (to prevent  */
    /* naming conflicts) or they can be defined without the static keyword  */
    /* (to allow extern references).                                        */
    /*----------------------------------------------------------------------*/
    
    #if 1
    #define CIMARRON_STATIC static
    #else
    #define CIMARRON_STATIC
    #endif
    
    /*----------------------------------------------------------------------*/
    /* CIMARRON GLOBAL VARIABLES                                            */
    /* These globals are used by the hardware access macros.  They must be  */
    /* initialized by the application to point to the memory-mapped         */
    /* registers of their respective blocks.                                */
    /*----------------------------------------------------------------------*/
    
    unsigned char *cim_gp_ptr = (unsigned char *)0;
    unsigned char *cim_fb_ptr = (unsigned char *)0;
    unsigned char *cim_cmd_base_ptr = (unsigned char *)0;
    unsigned char *cim_cmd_ptr = (unsigned char *)0;
    unsigned char *cim_vid_ptr = (unsigned char *)0;
    unsigned char *cim_vip_ptr = (unsigned char *)0;
    unsigned char *cim_vg_ptr = (unsigned char *)0;
    
    /* Define hooks for reading and writing MSRs - this is a major hack
     * to share the MSR code with the GX code */
    
    #ifdef CIMARRON_MSR_HOOKS
    void (*cim_rdmsr) (unsigned long, unsigned long *, unsigned long *);
    void (*cim_wrmsr) (unsigned long, unsigned long, unsigned long);
    #endif
    
    /*----------------------------------------------------------------------*/
    /* INCLUDE RELEVANT CIMARRON HEADERS                                    */
    /*----------------------------------------------------------------------*/
    
    /* HARDWARE REGISTER DEFINITIONS */
    
    #include "cim_regs.h"
    
    /* ROUTINE DEFINITIONS */
    /* All routines have a prototype, even those that are not included    */
    /* via #ifdefs.  This prevents the user from having to include the    */
    /* correct #defines anywhere he/she wants to call a Cimarron routine. */
    
    #include "cim_rtns.h"
    
    /* HARDWARE ACCESS MACROS */
    
    #include "cim_defs.h"
    
    /*----------------------------------------------------------------------*/
    /* CIMARRON MODULES                                                     */
    /* Modules and sub-modules are included based on user settings.  Note   */
    /* that excluding one or more modules may result in functionality       */
    /* holes.                                                               */
    /*----------------------------------------------------------------------*/
    
    /* GRAPHICS PROCESSOR */
    
    #if CIMARRON_INCLUDE_GP
    #include "cim_gp.c"
    #endif
    
    /* VIDEO GENERATOR */
    
    #if CIMARRON_INCLUDE_VG
    #include "cim_modes.c"
    #include "cim_vg.c"
    #endif
    
    /* DISPLAY FILTER */
    
    #if CIMARRON_INCLUDE_VIDEO
    #include "cim_filter.c"
    #include "cim_df.c"
    #endif
    
    /* INITIALIZATION AND DETECTION */
    
    #if CIMARRON_INCLUDE_INIT
    #include "cim_init.c"
    #endif
    
    /* VIP SUPPORT */
    
    #if CIMARRON_INCLUDE_VIP
    #include "cim_vip.c"
    #endif
    
    /* VOP SUPPORT */
    
    #if CIMARRON_INCLUDE_VOP
    #include "cim_vop.c"
    #endif
    
    /* MSR ACCESS */
    /* This module is used to access machine-specific registers. */
    /* It cannot be excluded from a project.                     */
    
    #include "cim_msr.c"