Initial pass at getting driver building. Not done yet.

Shuffle files around into their correct places.  Create Makefile.am,
configure.ac, and autogen.sh based on similar files in other drivers.  Delete
pre-modular files (e.g., Imakefile) that are no longer necessary.
This commit is contained in:
Ian Romanick
2006-11-16 12:41:02 -08:00
parent 0ace27ac3e
commit 1a3cd0a7f8
63 changed files with 298 additions and 1837 deletions

128
Imakefile
View File

@@ -1,128 +0,0 @@
XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/xgi/Imakefile,v 1.33 2003/08/29 08:50:54 twini Exp $
XCOMM
XCOMM This is an Imakefile for the XGI driver.
XCOMM
#define IHaveModules
#include <Server.tmpl>
/* Jong Lin; enable DRI for XG40/42 */
/*
#undef BuildXF86DRI
#define BuildXF86DRI NO
*/
/* DRI static build only works on Linux */
#if !defined(LinuxArchitecture) && !DoLoadableServer && BuildXF86DRI
#undef BuildXF86DRI
#define BuildXF86DRI NO
#endif
#if BuildXF86DRI
DRISRCS = xgi_dri.c
DRIOBJS = xgi_dri.o
DRIINCLUDES = -I$(SERVERSRC)/GL/dri -I$(LIBSRC)/GL/dri \
-I$(XF86OSSRC)/shared/drm/kernel \
-I$(XTOP)/include
DRIDEFINES = $(GLX_DEFINES)
#endif
SRCS = vb_ext.c vb_init.c vb_setmode.c vb_util.c\
xgi_driver.c xgi_dac.c xgi_cursor.c xgi_accel.c xgi_setup.c\
xgi_vga.c xgi_vb.c\
xgi_opt.c xgi_dga.c init.c \
xgi_video.c xgi_videohw.c \
$(DRISRCS)
OBJS = vb_ext.o vb_init.o vb_setmode.o vb_util.o\
xgi_driver.o xgi_dac.o xgi_cursor.o xgi_accel.o xgi_setup.o\
xgi_vga.o xgi_vb.o\
xgi_opt.o xgi_dga.o init.o \
xgi_video.o xgi_videohw.o \
$(DRIOBJS)
#if defined(XF86DriverSDK)
INCLUDES = -I. -I../../include
#else
INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) -I$(SERVERSRC)/Xext \
-I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \
-I$(SERVERSRC)/fb -I$(XF86SRC)/xaa \
-I$(XF86SRC)/xf1bpp -I$(XF86SRC)/xf4bpp \
-I$(XF86SRC)/xf24_32bpp \
-I$(XF86SRC)/vgahw -I$(XF86SRC)/ramdac \
-I$(XF86SRC)/ddc -I$(XF86SRC)/i2c -I$(XF86SRC)/vbe \
-I$(XF86SRC)/rac -I$(XF86SRC)/int10 \
-I$(FONTINCSRC) -I$(SERVERSRC)/include -I$(XINCLUDESRC) \
-I$(XTOP)/include/extensions \
-I$(SERVERSRC)/render \
-I$(XF86SRC)/shadowfb \
$(DRIINCLUDES)
#endif
DEFINES = $(DRIDEFINES)
#if MakeHasPosixVariableSubstitutions
SubdirLibraryRule($(OBJS))
#endif
ModuleObjectRule()
ObjectModuleTarget(xgi,$(OBJS))
InstallObjectModule(xgi,$(MODULEDIR),drivers)
#if !defined(XF86DriverSDK)
InstallModuleManPage(xgi)
#endif
DependTarget()
InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_accel.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_accel.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(init.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(init.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(osdef.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(initdef.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_cursor.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_cursor.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_dac.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_dac.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_dga.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_dri.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_dri.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_common.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_driver.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_video.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_video.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_videohw.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_videohw.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_vidregs.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_driver.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_opt.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(regs.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_setup.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_vb.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_vb.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_vga.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_accel.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vgatypes.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_ver.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_struct.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_def.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_ext.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_init.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_setmode.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_util.c,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_ext.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_init.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_setmode.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_util.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_struct.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(vb_table.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_pci.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(xgi_regs.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKNonExecFile(valid_mode.h,$(DRIVERSDKDIR)/drivers/xgi)
InstallDriverSDKObjectModule(xgi,$(DRIVERSDKMODULEDIR),drivers)

1665
Makefile

File diff suppressed because it is too large Load Diff

32
Makefile.am Normal file
View File

@@ -0,0 +1,32 @@
# Copyright 2005 Adam Jackson.
#
# 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
# ADAM JACKSON 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.
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src man
CLEANFILES = ChangeLog
EXTRA_DIST = ChangeLog
.PHONY: ChangeLog
ChangeLog:
git-log > ChangeLog
dist-hook: ChangeLog

12
autogen.sh Executable file
View File

@@ -0,0 +1,12 @@
#! /bin/sh
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
ORIGDIR=`pwd`
cd $srcdir
autoreconf -v --install || exit 1
cd $ORIGDIR || exit $?
$srcdir/configure --enable-maintainer-mode "$@"

113
configure.ac Normal file
View File

@@ -0,0 +1,113 @@
# Copyright 2005 Adam Jackson.
#
# 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
# ADAM JACKSON 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.
#
# Process this file with autoconf to produce a configure script
AC_PREREQ(2.57)
AC_INIT([xf86-video-xgi],
1.4.9,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-video-xgi)
AC_CONFIG_SRCDIR([Makefile.am])
AM_CONFIG_HEADER([config.h])
AC_CONFIG_AUX_DIR(.)
AM_INIT_AUTOMAKE([dist-bzip2])
AM_MAINTAINER_MODE
# Checks for programs.
AC_DISABLE_STATIC
AC_PROG_LIBTOOL
AC_PROG_CC
AH_TOP([#include "xorg-server.h"])
AC_ARG_WITH(xorg-module-dir,
AC_HELP_STRING([--with-xorg-module-dir=DIR],
[Default xorg module directory [[default=$libdir/xorg/modules]]]),
[moduledir="$withval"],
[moduledir="$libdir/xorg/modules"])
AC_ARG_ENABLE(dri, AC_HELP_STRING([--disable-dri],
[Disable DRI support [[default=auto]]]),
[DRI="$enableval"],
[DRI=auto])
# Checks for extensions
XORG_DRIVER_CHECK_EXT(XINERAMA, xineramaproto)
XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
XORG_DRIVER_CHECK_EXT(RENDER, renderproto)
XORG_DRIVER_CHECK_EXT(XV, videoproto)
XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto)
# Checks for pkg-config packages
PKG_CHECK_MODULES(XORG, [xorg-server >= 1.1.0 xproto fontsproto $REQUIRED_MODULES])
sdkdir=$(pkg-config --variable=sdkdir xorg-server)
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
if test "x$DRI" = xauto; then
AC_CHECK_FILE([${sdkdir}/dri.h],
[have_dri_h="yes"], [have_dri_h="no"])
AC_CHECK_FILE([${sdkdir}/sarea.h],
[have_sarea_h="yes"], [have_sarea_h="no"])
AC_CHECK_FILE([${sdkdir}/dristruct.h],
[have_dristruct_h="yes"], [have_dristruct_h="no"])
fi
AC_MSG_CHECKING([whether to include DRI support])
if test "x$DRI" = xauto; then
if test "x$have_dri_h" = xyes && \
test "x$have_sarea_h" = xyes && \
test "x$have_dristruct_h" = xyes; then
DRI="yes"
else
DRI="no"
fi
fi
AC_MSG_RESULT([$DRI])
AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
if test "x$DRI" = xyes; then
PKG_CHECK_MODULES(DRI, [libdrm >= 2.0 xf86driproto glproto])
AC_DEFINE(XF86DRI,1,[Enable DRI driver support])
AC_DEFINE(XF86DRI_DEVEL,1,[Enable developmental DRI driver support])
fi
AC_SUBST([DRI_CFLAGS])
AC_SUBST([XORG_CFLAGS])
AC_SUBST([moduledir])
DRIVER_NAME=xgi
AC_SUBST([DRIVER_NAME])
XORG_MANPAGE_SECTIONS
XORG_RELEASE_VERSION
AC_OUTPUT([
Makefile
src/Makefile
man/Makefile
])

73
man/Makefile.am Normal file
View File

@@ -0,0 +1,73 @@
# $Id$
#
# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation.
#
# 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 OPEN GROUP 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.
#
# Except as contained in this notice, the name of the copyright holders shall
# not be used in advertising or otherwise to promote the sale, use or
# other dealings in this Software without prior written authorization
# from the copyright holders.
#
drivermandir = $(DRIVER_MAN_DIR)
driverman_PRE = @DRIVER_NAME@.man
driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@)
EXTRA_DIST = @DRIVER_NAME@.man
CLEANFILES = $(driverman_DATA)
SED = sed
# Strings to replace in man pages
XORGRELSTRING = @PACKAGE_STRING@
XORGMANNAME = X Version 11
MANDEFS = \
-D__vendorversion__="\"$(XORGRELSTRING)\" \"$(XORGMANNAME)\"" \
-D__appmansuffix__=$(APP_MAN_SUFFIX) \
-D__filemansuffix__=$(FILE_MAN_SUFFIX) \
-D__libmansuffix__=$(LIB_MAN_SUFFIX) \
-D__miscmansuffix__=$(MISC_MAN_SUFFIX) \
-D__drivermansuffix__=$(DRIVER_MAN_SUFFIX) \
-D__adminmansuffix__=$(ADMIN_MAN_SUFFIX) \
-D__xconfigfile__=xorg.conf \
-D__xservername__=Xorg
# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
# to cpp, because that trick does not work on all ANSI C preprocessors.
# Delete line numbers from the cpp output (-P is not portable, I guess).
# Allow XCOMM to be preceded by whitespace and provide a means of generating
# output lines with trailing backslashes.
# Allow XHASH to always be substituted, even in cases where XCOMM isn't.
CPP_SED_MAGIC = $(SED) -e '/^\# *[0-9][0-9]* *.*$$/d' \
-e '/^\#line *[0-9][0-9]* *.*$$/d' \
-e '/^[ ]*XCOMM$$/s/XCOMM/\#/' \
-e '/^[ ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \
-e '/^[ ]*XHASH/s/XHASH/\#/' \
-e '/\@\@$$/s/\@\@$$/\\/'
SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man
.man.$(DRIVER_MAN_SUFFIX):
$(RAWCPP) $(RAWCPPFLAGS) $(MANDEFS) $(EXTRAMANDEFS) < $< | $(CPP_SED_MAGIC) > $@

68
src/Makefile.am Normal file
View File

@@ -0,0 +1,68 @@
# Copyright 2005 Adam Jackson.
#
# 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
# ADAM JACKSON 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.
# this is obnoxious:
# -module lets us name the module exactly how we want
# -avoid-version prevents gratuitous .0.0.0 version numbers on the end
# _ladir passes a dummy rpath to libtool so the thing will actually link
# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@
xgi_drv_la_LTLIBRARIES = xgi_drv.la
xgi_drv_la_LDFLAGS = -module -avoid-version
xgi_drv_ladir = @moduledir@/drivers
xgi_drv_la_SOURCES = \
vb_ext.c vb_init.c vb_setmode.c vb_util.c\
xgi_driver.c xgi_dac.c xgi_cursor.c xgi_accel.c xgi_setup.c\
xgi_vga.c xgi_vb.c\
xgi_opt.c xgi_dga.c init.c \
xgi_video.c xgi_videohw.c \
init.h \
initdef.h \
osdef.h \
regs.h \
valid_mode.h \
vb_def.h \
vb_ext.h \
vb_init.h \
vb_setmode.h \
vb_struct.h \
vb_table.h \
vb_util.h \
vgatypes.h \
vstruct.h \
xgi.h \
xgi_accel.h \
xgi_common.h \
xgi_cursor.h \
xgi_dac.h \
xgi_driver.h \
xgi_pci.h \
xgi_regs.h \
xgi_vb.h \
xgi_ver.h \
xgi_video.h \
xgi_videohw.h
if DRI
xgi_drv_la_SOURCES += \
xgi_dri.c \
xgi_dri.h
endif

View File

View File

View File

View File

View File

View File

@@ -1,44 +0,0 @@
[2004/08/18]
1. Merge XG20 and XG4x C Code
[2004/08/20]
1. Code modify : Add CR97 in header and reference DDR/DDR2x according to this byte
2. Dram Size setting from the data which read from VBIOS
[2004/08/20] XG42 by Hsuan
1. Add auto over driver in XG42.
2. When MCLK=207MHz, ECLK=207 or 250MHz, SR32 D[1:0] set 10b.
[2004/9/03] XG42 by Vicent
1. New Feature: #41, XG42 solve 32-bit boot to Widnows hang issue
- Modify: vb_init.c
Modify XG42 SR1F, SR31, SR32, and SR33 for HW request.
[2004/09/08] XG42 by Hsuan
1. Feature Modify: Modify XGINew DDR2x default registers. (XG42 #473, #488)
- Modify: vb_init.c
Modify CR82, CR85, CR86, CR98 in XG42.
[2004/09/08] XG4x by Vicent
1. Feature Modify: Add ReadVBIOSTablData function in XGINew_SetDRAMModeRegister340. (XG42 #473, #488)
- Modify: vb_init.c
Add ReadVBIOSTablData function in XGINew_SetDRAMModeRegister340.
[2004/09/15] XG20 by kuku
1. Feature Modify: To set CR51, CR52 value for XG20
- Modify: vb_setmode.c
In XGI_SetCRT1ModeRegs() , set CR51=0x02 and CR52=0x33 when driver mode , CR52=0x73 when dos mode for XG20
[2004/09/16] XG4X by Hsuan
1. Bug Fixed: #524 Multi adapter dos full screen sometimes, CRT have green screen.
- Modify: vb_setmode.c
In XGI_SetCRT1ModeRegs(), it can't set SR3F D[7:6] = 00b.
The DPMS is handled by 2D.
[2004/10/01] XG42 by kuku
1. Bug Fixed: #530 [32-32] Enable "Overscan" and do Dos prompt switch, the screen shift
- Modify: xgiv.h, vb,c, tv301.c
In xgiv.h add globel parameter. When enable "Overscan" , parameter will be "1"
And lTVPosTempShift will be "0"
2. Move down the screen and change mode to another mode, the display is not default(The screen move up).
The solution is the same as above.