Commit 447cdd53 authored by Ian Romanick's avatar Ian Romanick

Initial support for PowerPC specific code in Mesa and DRI drivers. DRI

drivers built on PowerPC systems should now show things like "PowerPC" or
"PowerPC/Altivec" in the GL_RENDERER string.

The VMX moniker is used for Altivec/Velocity Engine/VMX SIMD additions.  I
chose this not because I work for IBM but because it's a LOT shorter to
type. :)
parent b72ed818
......@@ -75,6 +75,7 @@ linux-debug \
linux-dri \
linux-dri-x86 \
linux-dri-x86-64 \
linux-dri-ppc \
linux-glide \
linux-icc \
linux-icc-static \
......
# -*-makefile-*-
# Configuration for linux-dri: Linux DRI hardware drivers for XFree86 & others
include $(TOP)/configs/linux-dri
CONFIG_NAME = linux-dri-ppc
OPT_FLAGS = -Os -mcpu=603
PIC_FLAGS = -fPIC
ASM_FLAGS = -DUSE_PPC_ASM -DUSE_VMX_ASM
ASM_SOURCES = $(PPC_SOURCES)
# Build only the drivers for cards that exist on PowerPC. At some point MGA
# will be added, but not yet.
DRI_DIRS = dri_client mach64 r128 r200 radeon tdfx
......@@ -20,11 +20,14 @@
* 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.
*/
/**
* \file utils.c
* Utility functions for DRI drivers.
*
* Authors:
* Ian Romanick <idr@us.ibm.com>
* \author Ian Romanick <idr@us.ibm.com>
*/
/* $XFree86:$ */
#include <string.h>
#include <stdlib.h>
......@@ -40,6 +43,10 @@
#include "x86/common_x86_asm.h"
#endif
#if defined(USE_PPC_ASM)
#include "ppc/common_ppc_features.h"
#endif
unsigned
driParseDebugString( const char * debug,
const struct dri_debug_control * control )
......@@ -141,6 +148,23 @@ driGetRendererString( char * buffer, const char * hardware_name,
cpu[0] = " SPARC";
next = 1;
#elif defined(USE_PPC_ASM)
if ( _mesa_ppc_cpu_features ) {
cpu[next] = (cpu_has_64) ? " PowerPC 64" : " PowerPC";
next++;
}
# ifdef USE_VMX_ASM
if ( cpu_has_vmx ) {
cpu[next] = "/Altivec";
next++;
}
# endif
if ( ! cpu_has_fpu ) {
cpu[next] = "/No FPU";
next++;
}
#endif
for ( i = 0 ; i < next ; i++ ) {
......
......@@ -55,6 +55,10 @@
#include "sparc/sparc.h"
#endif
#ifdef USE_PPC_ASM
#include "ppc/common_ppc_features.h"
#endif
clip_func _mesa_clip_tab[5];
clip_func _mesa_clip_np_tab[5];
dotprod_func _mesa_dotprod_tab[5];
......@@ -204,9 +208,10 @@ _math_init_transformation( void )
#ifdef USE_X86_ASM
_mesa_init_all_x86_transform_asm();
#endif
#ifdef USE_SPARC_ASM
#elif defined( USE_SPARC_ASM )
_mesa_init_all_sparc_transform_asm();
#elif defined( USE_PPC_ASM )
_mesa_init_all_ppc_transform_asm();
#endif
}
......
/*
* (C) Copyright IBM Corporation 2004
* All Rights Reserved.
*
* 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
* on the rights to use, copy, modify, merge, publish, distribute, sub
* license, 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 (including the next
* paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL
* IBM AND/OR THEIR SUPPLIERS 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.
*/
/**
* \file common_ppc.c
* Check CPU capabilities & initialize optimized funtions for this particular
* processor.
*
* \author Ian Romanick <idr@us.ibm.com>
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#ifdef USE_PPC_ASM
#include <elf.h>
#endif
unsigned long _mesa_ppc_cpu_features = 0;
/**
* Detect CPU features and install optimized transform and lighting routines.
* Currently, CPU features are only detected. The optimized routines have
* yet to be written.
*
* \bug
* This routine is highly specific to Linux kernel 2.6. I'm still waiting
* to hear back from the glibc folk on how to do this "right".
*/
void _mesa_init_all_ppc_transform_asm( void )
{
#ifdef USE_PPC_ASM
const pid_t my_pid = getpid();
char file_name[32];
FILE * f;
#ifdef __powerpc64__
Elf64_auxv_t v;
#else
Elf32_auxv_t v;
#endif
sprintf( file_name, "/proc/%u/auxv", (unsigned) my_pid );
f = fopen( file_name, "rb" );
if ( f != NULL ) {
while( 1 ) {
ssize_t elem = fread( & v, sizeof( v ), 1, f );
if ( elem < 1 ) {
break;
}
if ( v.a_type == AT_HWCAP ) {
_mesa_ppc_cpu_features = v.a_un.a_val;
break;
}
}
fclose( f );
}
# ifndef USE_VMX_ASM
_mesa_ppc_cpu_features &= ~PPC_FEATURES_HAS_ALTIVEC;
# endif
#endif
}
/*
* (C) Copyright IBM Corporation 2004
* All Rights Reserved.
*
* 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
* on the rights to use, copy, modify, merge, publish, distribute, sub
* license, 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 (including the next
* paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL
* IBM AND/OR THEIR SUPPLIERS 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.
*/
/**
* \file common_ppc_features.h
* Interface for determining which CPU features were detected.
*
* \author Ian Romanick <idr@us.ibm.com>
*/
#ifndef COMMON_PPC_FEATURES_H
#define COMMON_PPC_FEATURES_H
#ifdef USE_PPC_ASM
#include <asm/cputable.h>
extern unsigned long _mesa_ppc_cpu_features;
/* The PPC_FEATURE_* values come from asm/cputable.h. Should we define
* versions of them here if that file does not exist? This will only
* matter once these code paths are supported on non-Linux platforms.
*/
#define cpu_has_64 ((_mesa_ppc_cpu_features & PPC_FEATURE_64) != 0)
#define cpu_has_vmx ((_mesa_ppc_cpu_features & PPC_FEATURE_HAS_ALTIVEC) != 0)
#define cpu_has_fpu ((_mesa_ppc_cpu_features & PPC_FEATURE_HAS_FPU) != 0)
#endif /* USE_PPC_ASM */
#endif /* COMMON_PPC_FEATURES_H */
......@@ -150,7 +150,8 @@ ASM_C_SOURCES = \
x86/x86.c \
x86/3dnow.c \
x86/sse.c \
sparc/sparc.c
sparc/sparc.c \
ppc/common_ppc.c
X86_SOURCES = \
x86/common_x86_asm.S \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment